This is an automated email from the ASF dual-hosted git repository.
wenjun pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 020092ed1e Set charset in upgrading tools to solve read upgrade sql
mojibake (#14955)
020092ed1e is described below
commit 020092ed1e8328e76a27d06632337bb3e0324f5a
Author: Wenjun Ruan <[email protected]>
AuthorDate: Tue Sep 26 09:46:25 2023 +0800
Set charset in upgrading tools to solve read upgrade sql mojibake (#14955)
---
.../common/sql/ClasspathSqlScriptParser.java | 137 +++++++++++++++++
.../common/sql/SqlScriptParser.java} | 23 +--
.../common/sql/SqlScriptRunner.java | 65 +++++++++
.../common/utils/ScriptRunner.java | 162 ---------------------
.../common/sql/ClasspathSqlScriptParserTest.java | 52 +++++++
.../src/test/resources/sql/mysql_ddl.sql | 44 ++++++
.../src/test/resources/sql/mysql_dml.sql | 84 +++++++++++
.../tools/datasource/dao/UpgradeDao.java | 54 +++----
8 files changed, 408 insertions(+), 213 deletions(-)
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParser.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParser.java
new file mode 100644
index 0000000000..3b4b3765f3
--- /dev/null
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParser.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.sql;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+
+public class ClasspathSqlScriptParser implements SqlScriptParser {
+
+ private final String sqlScriptPath;
+
+ private final Charset charset;
+
+ public ClasspathSqlScriptParser(String sqlScriptPath) {
+ this.sqlScriptPath = sqlScriptPath;
+ this.charset = StandardCharsets.UTF_8;
+ }
+
+ @Override
+ public List<String> getAllSql() throws IOException {
+ Resource sqlScriptResource = new ClassPathResource(sqlScriptPath);
+ List<String> result = new ArrayList<>();
+ try (
+ InputStream inputStream = sqlScriptResource.getInputStream();
+ Reader sqlScriptReader = new InputStreamReader(inputStream,
charset);
+ LineNumberReader lineNumberReader = new
LineNumberReader(sqlScriptReader)) {
+ String sql;
+ do {
+ sql = parseNextSql(lineNumberReader);
+ if (StringUtils.isNotBlank(sql)) {
+ result.add(sql);
+ }
+ } while (StringUtils.isNotBlank(sql));
+ }
+ return result;
+ }
+
+ private String parseNextSql(LineNumberReader lineNumberReader) throws
IOException {
+ String line;
+ while ((line = lineNumberReader.readLine()) != null) {
+ String trimLine = line.trim();
+ if (StringUtils.isEmpty(trimLine) || isComment(trimLine)) {
+ // Skip the empty line, comment line
+ continue;
+ }
+ if (trimLine.startsWith("/*")) {
+ skipLicenseHeader(lineNumberReader);
+ continue;
+ }
+ if (trimLine.startsWith("delimiter")) {
+ // begin to parse processor, until delimiter ;
+ String[] split = trimLine.split(" ");
+ return parseProcedure(lineNumberReader, split[1]);
+ }
+ // begin to parse sql until;
+ List<String> sqlLines = new ArrayList<>();
+ sqlLines.add(line);
+ while (!line.endsWith(";")) {
+ line = lineNumberReader.readLine();
+ if (line == null) {
+ break;
+ }
+ if (StringUtils.isBlank(line)) {
+ continue;
+ }
+ sqlLines.add(line);
+ }
+ return String.join("\n", sqlLines);
+ }
+ return null;
+ }
+
+ private void skipLicenseHeader(LineNumberReader lineNumberReader) throws
IOException {
+ String line;
+ while ((line = lineNumberReader.readLine()) != null) {
+ String trimLine = line.trim();
+ if (StringUtils.isEmpty(trimLine) || isComment(trimLine)) {
+ // Skip the empty line, comment line
+ continue;
+ }
+ if (line.startsWith("*/")) {
+ break;
+ }
+ }
+ }
+
+ private String parseProcedure(LineNumberReader lineNumberReader, String
delimiter) throws IOException {
+ List<String> sqlLines = new ArrayList<>();
+ // begin to parse processor, until delimiter ;
+ String line;
+ while (true) {
+ line = lineNumberReader.readLine();
+ if (line == null) {
+ break;
+ }
+ if (StringUtils.isBlank(line)) {
+ continue;
+ }
+ if (line.startsWith(delimiter)) {
+ break;
+ }
+ sqlLines.add(line);
+ }
+ return String.join("\n", sqlLines);
+ }
+
+ private boolean isComment(String line) {
+ return line.startsWith("--") || line.startsWith("//");
+ }
+}
diff --git
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ScriptRunnerTest.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptParser.java
similarity index 59%
rename from
dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ScriptRunnerTest.java
rename to
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptParser.java
index 7b1b96b56f..3e034c7cc2 100644
---
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ScriptRunnerTest.java
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptParser.java
@@ -14,25 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dolphinscheduler.common.utils;
-import java.io.StringReader;
+package org.apache.dolphinscheduler.common.sql;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
+import java.io.IOException;
+import java.util.List;
-public class ScriptRunnerTest {
+public interface SqlScriptParser {
+
+ List<String> getAllSql() throws IOException;
- @Test
- public void testRunScript() {
- // connection is null
- Exception exception = null;
- ScriptRunner s = new ScriptRunner(null, true, true);
- try {
- s.runScript(new StringReader("select 1"));
- } catch (Exception e) {
- exception = e;
- }
- Assertions.assertNotNull(exception);
- }
}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptRunner.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptRunner.java
new file mode 100644
index 0000000000..ab16bf2ac0
--- /dev/null
+++
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/sql/SqlScriptRunner.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.sql;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class SqlScriptRunner {
+
+ private final DataSource dataSource;
+
+ private final SqlScriptParser sqlScriptParser;
+
+ /**
+ * @param dataSource DataSource which used to execute the sql
script.
+ * @param sqlScriptFilePath Sqk script file path, the path should under
classpath.
+ */
+ public SqlScriptRunner(DataSource dataSource, String sqlScriptFilePath) {
+ this.dataSource = dataSource;
+ this.sqlScriptParser = new ClasspathSqlScriptParser(sqlScriptFilePath);
+ }
+
+ public void execute() throws SQLException, IOException {
+ List<String> allSql = sqlScriptParser.getAllSql();
+ try (Connection connection = dataSource.getConnection()) {
+ for (String sql : allSql) {
+ if (StringUtils.isBlank(sql)) {
+ continue;
+ }
+ try (Statement statement = connection.createStatement()) {
+ // Since some sql doesn't have result so we believe if
there is no exception then we think the sql
+ // execute success.
+ statement.execute(sql);
+ log.info("Execute sql: {} success", sql);
+ }
+ }
+ }
+ }
+
+}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ScriptRunner.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ScriptRunner.java
deleted file mode 100644
index 6bef7ce894..0000000000
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ScriptRunner.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2004-2020 the original author or authors.
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dolphinscheduler.common.utils;
-
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.Reader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * Tool to run database scripts
- */
-@Slf4j
-public class ScriptRunner {
-
- private static final String DEFAULT_DELIMITER = ";";
-
- private final Connection connection;
-
- private final boolean stopOnError;
- private final boolean autoCommit;
-
- private String delimiter = DEFAULT_DELIMITER;
- private boolean fullLineDelimiter = false;
-
- public ScriptRunner(Connection connection, boolean autoCommit, boolean
stopOnError) {
- this.connection = connection;
- this.autoCommit = autoCommit;
- this.stopOnError = stopOnError;
- }
-
- public void setDelimiter(String delimiter, boolean fullLineDelimiter) {
- this.delimiter = delimiter;
- this.fullLineDelimiter = fullLineDelimiter;
- }
-
- /**
- * Runs an SQL script (read in using the Reader parameter)
- *
- * @param reader - the source of the script
- * @throws IOException errors
- * @throws SQLException errors
- */
- public void runScript(Reader reader) throws IOException, SQLException {
- try {
- boolean originalAutoCommit = connection.getAutoCommit();
- try {
- if (originalAutoCommit != this.autoCommit) {
- connection.setAutoCommit(this.autoCommit);
- }
- runScript(connection, reader);
- } finally {
- connection.setAutoCommit(originalAutoCommit);
- }
- } catch (IOException | SQLException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException("Error running script. Cause: " + e,
e);
- }
- }
-
- /**
- * Runs an SQL script (read in using the Reader parameter) using the
connection
- * passed in
- *
- * @param conn - the connection to use for the script
- * @param reader - the source of the script
- * @throws SQLException if any SQL errors occur
- * @throws IOException if there is an error reading from the Reader
- */
- private void runScript(Connection conn, Reader reader) throws IOException,
SQLException {
- List<String> command = null;
- try {
- LineNumberReader lineReader = new LineNumberReader(reader);
- String line;
- while ((line = lineReader.readLine()) != null) {
- if (command == null) {
- command = new ArrayList<>();
- }
- String trimmedLine = line.trim();
- if (trimmedLine.startsWith("--")) {
- log.info("\n{}", trimmedLine);
- } else if (trimmedLine.length() < 1 ||
trimmedLine.startsWith("//")) {
- // Do nothing
- } else if (trimmedLine.startsWith("delimiter")) {
- String newDelimiter = trimmedLine.split(" ")[1];
- this.setDelimiter(newDelimiter, fullLineDelimiter);
-
- } else if (!fullLineDelimiter &&
trimmedLine.endsWith(getDelimiter())
- || fullLineDelimiter &&
trimmedLine.equals(getDelimiter())) {
- command.add(line.substring(0,
line.lastIndexOf(getDelimiter())));
- log.info("\n{}", String.join("\n", command));
-
- try (Statement statement = conn.createStatement()) {
- statement.execute(String.join(" ", command));
- try (ResultSet rs = statement.getResultSet()) {
- if (stopOnError && rs != null) {
- ResultSetMetaData md = rs.getMetaData();
- int cols = md.getColumnCount();
- for (int i = 1; i < cols; i++) {
- String name = md.getColumnLabel(i);
- log.info("{} \t", name);
- }
- log.info("");
- while (rs.next()) {
- for (int i = 1; i < cols; i++) {
- String value = rs.getString(i);
- log.info("{} \t", value);
- }
- log.info("");
- }
- }
- }
- } catch (SQLException e) {
- log.error("SQLException", e);
- throw e;
- }
-
- command = null;
- Thread.yield();
- } else {
- command.add(line);
- }
- }
-
- } catch (SQLException e) {
- log.error("Error executing: {}", command);
- throw e;
- } catch (IOException e) {
- e.fillInStackTrace();
- log.error("Error executing: {}", command);
- throw e;
- }
- }
-
- private String getDelimiter() {
- return delimiter;
- }
-
-}
diff --git
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParserTest.java
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParserTest.java
new file mode 100644
index 0000000000..e2a23845ad
--- /dev/null
+++
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/sql/ClasspathSqlScriptParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.sql;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+class ClasspathSqlScriptParserTest {
+
+ @Test
+ void testMysqlDmlSql() throws IOException {
+ ClasspathSqlScriptParser classpathSqlScriptParser = new
ClasspathSqlScriptParser("sql/mysql_dml.sql");
+ List<String> allSql = classpathSqlScriptParser.getAllSql();
+ Assertions.assertEquals("drop PROCEDURE if EXISTS
dolphin_t_ds_tenant_insert_default;", allSql.get(0));
+ Assertions.assertEquals("CREATE PROCEDURE
dolphin_t_ds_tenant_insert_default()\n" +
+ "BEGIN\n" +
+ " IF\n" +
+ "NOT EXISTS(SELECT 1\n" +
+ " FROM t_ds_tenant\n" +
+ " WHERE id = -1)\n" +
+ " THEN\n" +
+ " INSERT INTO `t_ds_tenant` VALUES ('-1', 'default',
'default tenant', '1', current_timestamp, current_timestamp);\n"
+ +
+ "END IF;\n" +
+ "END;", String.join("", allSql.get(1)));
+ }
+
+ @Test
+ void testMysqlDdlSql() throws IOException {
+ ClasspathSqlScriptParser classpathSqlScriptParser = new
ClasspathSqlScriptParser("sql/mysql_ddl.sql");
+ List<String> allSql = classpathSqlScriptParser.getAllSql();
+ Assertions.assertEquals("ALTER TABLE t_ds_process_definition DROP
tenant_id;", allSql.get(0));
+ }
+}
diff --git a/dolphinscheduler-common/src/test/resources/sql/mysql_ddl.sql
b/dolphinscheduler-common/src/test/resources/sql/mysql_ddl.sql
new file mode 100644
index 0000000000..beadc63ca3
--- /dev/null
+++ b/dolphinscheduler-common/src/test/resources/sql/mysql_ddl.sql
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+ALTER TABLE t_ds_process_definition DROP tenant_id;
+ALTER TABLE t_ds_process_definition_log DROP tenant_id;
+ALTER TABLE t_ds_process_instance DROP tenant_id;
+
+SET FOREIGN_KEY_CHECKS = 0;
+-- auto detect by atlas, see more detail in
https://github.com/apache/dolphinscheduler/pull/14620
+ALTER TABLE `QRTZ_BLOB_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_NAME` varchar(200) NOT NULL,
MODIFY COLUMN `TRIGGER_GROUP` varchar(200) NOT NULL;
+ALTER TABLE `QRTZ_CALENDARS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `CALENDAR_NAME` varchar(200) NOT NULL;
+ALTER TABLE `QRTZ_CRON_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_NAME` varchar(200) NOT NULL,
MODIFY COLUMN `TRIGGER_GROUP` varchar(200) NOT NULL, MODIFY COLUMN
`CRON_EXPRESSION` varchar(120) NOT NULL, MODIFY COLUMN `TIME_ZONE_ID`
varchar(80) NULL;
+ALTER TABLE `QRTZ_FIRED_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `ENTRY_ID` varchar(200) NOT NULL, MODIFY
COLUMN `TRIGGER_NAME` varchar(200) NOT NULL, MODIFY COLUMN `TRIGGER_GROUP`
varchar(200) NOT NULL, MODIFY COLUMN `INSTANCE_NAME` varchar(200) NOT NULL,
MODIFY COLUMN `STATE` varchar(16) NOT NULL, MODIFY COLUMN `JOB_NAME`
varchar(200) NULL, MODIFY COLUMN `JOB_GROUP` varchar(200) NULL, MODIFY COLUMN
`IS_NONCONCURRENT` varchar(1) NULL, M [...]
+ALTER TABLE `QRTZ_JOB_DETAILS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `JOB_NAME` varchar(200) NOT NULL, MODIFY
COLUMN `JOB_GROUP` varchar(200) NOT NULL, MODIFY COLUMN `DESCRIPTION`
varchar(250) NULL, MODIFY COLUMN `JOB_CLASS_NAME` varchar(250) NOT NULL, MODIFY
COLUMN `IS_DURABLE` varchar(1) NOT NULL, MODIFY COLUMN `IS_NONCONCURRENT`
varchar(1) NOT NULL, MODIFY COLUMN `IS_UPDATE_DATA` varchar(1) NOT NULL, MODIFY
COLUMN `REQUESTS_RECOVERY` varchar [...]
+ALTER TABLE `QRTZ_LOCKS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `LOCK_NAME` varchar(40) NOT NULL;
+ALTER TABLE `QRTZ_PAUSED_TRIGGER_GRPS` COLLATE utf8_bin, MODIFY COLUMN
`SCHED_NAME` varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_GROUP` varchar(200)
NOT NULL;
+ALTER TABLE `QRTZ_SCHEDULER_STATE` COLLATE utf8_bin, MODIFY COLUMN
`SCHED_NAME` varchar(120) NOT NULL, MODIFY COLUMN `INSTANCE_NAME` varchar(200)
NOT NULL;
+ALTER TABLE `QRTZ_SIMPLE_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN
`SCHED_NAME` varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_NAME` varchar(200)
NOT NULL, MODIFY COLUMN `TRIGGER_GROUP` varchar(200) NOT NULL;
+ALTER TABLE `QRTZ_SIMPROP_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN
`SCHED_NAME` varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_NAME` varchar(200)
NOT NULL, MODIFY COLUMN `TRIGGER_GROUP` varchar(200) NOT NULL, MODIFY COLUMN
`STR_PROP_1` varchar(512) NULL, MODIFY COLUMN `STR_PROP_2` varchar(512) NULL,
MODIFY COLUMN `STR_PROP_3` varchar(512) NULL, MODIFY COLUMN `BOOL_PROP_1`
varchar(1) NULL, MODIFY COLUMN `BOOL_PROP_2` varchar(1) NULL;
+ALTER TABLE `QRTZ_TRIGGERS` COLLATE utf8_bin, MODIFY COLUMN `SCHED_NAME`
varchar(120) NOT NULL, MODIFY COLUMN `TRIGGER_NAME` varchar(200) NOT NULL,
MODIFY COLUMN `TRIGGER_GROUP` varchar(200) NOT NULL, MODIFY COLUMN `JOB_NAME`
varchar(200) NOT NULL, MODIFY COLUMN `JOB_GROUP` varchar(200) NOT NULL, MODIFY
COLUMN `DESCRIPTION` varchar(250) NULL, MODIFY COLUMN `TRIGGER_STATE`
varchar(16) NOT NULL, MODIFY COLUMN `TRIGGER_TYPE` varchar(8) NOT NULL, MODIFY
COLUMN `CALENDAR_NAME` varchar(200) NULL;
+ALTER TABLE `t_ds_plugin_define` AUTO_INCREMENT 2;
+ALTER TABLE `t_ds_process_instance` MODIFY COLUMN `state_history` text NULL
COMMENT 'state history desc';
+ALTER TABLE `t_ds_project` MODIFY COLUMN `description` varchar(255) NULL;
+ALTER TABLE `t_ds_task_group` MODIFY COLUMN `description` varchar(255) NULL;
+ALTER TABLE `t_ds_task_instance` MODIFY COLUMN `app_link` text NULL COMMENT
'yarn app id', MODIFY COLUMN `cache_key` varchar(200) NULL COMMENT 'cache_key',
MODIFY COLUMN `executor_name` varchar(64) NULL;
+ALTER TABLE `t_ds_worker_group` MODIFY COLUMN `description` text NULL COMMENT
'description';
+ALTER TABLE `t_ds_task_instance` MODIFY COLUMN `cache_key` varchar(200) NULL
COMMENT 'cache_key', MODIFY COLUMN `executor_name` varchar(64) NULL;
+ALTER TABLE `t_ds_fav_task` MODIFY COLUMN `id` bigint NOT NULL AUTO_INCREMENT
COMMENT 'id';
+ALTER TABLE `t_ds_task_instance` MODIFY COLUMN `cache_key` varchar(200) NULL
COMMENT 'cache_key', MODIFY COLUMN `executor_name` varchar(64) NULL;
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/dolphinscheduler-common/src/test/resources/sql/mysql_dml.sql
b/dolphinscheduler-common/src/test/resources/sql/mysql_dml.sql
new file mode 100644
index 0000000000..e5d97fab94
--- /dev/null
+++ b/dolphinscheduler-common/src/test/resources/sql/mysql_dml.sql
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+-- ############################# t_ds_tenant #############################
+drop PROCEDURE if EXISTS dolphin_t_ds_tenant_insert_default;
+delimiter d//
+CREATE PROCEDURE dolphin_t_ds_tenant_insert_default()
+BEGIN
+ IF
+NOT EXISTS(SELECT 1
+ FROM t_ds_tenant
+ WHERE id = -1)
+ THEN
+ INSERT INTO `t_ds_tenant` VALUES ('-1', 'default', 'default tenant',
'1', current_timestamp, current_timestamp);
+END IF;
+END;
+d//
+
+delimiter ;
+CALL dolphin_t_ds_tenant_insert_default();
+DROP PROCEDURE dolphin_t_ds_tenant_insert_default;
+
+-- tenant improvement
+UPDATE t_ds_schedules t1 JOIN t_ds_process_definition t2 ON
t1.process_definition_code = t2.code LEFT JOIN t_ds_tenant t3 ON t2.tenant_id =
t3.id SET t1.tenant_code = COALESCE(t3.tenant_code, 'default');
+UPDATE `t_ds_process_instance` SET `tenant_code` = 'default' WHERE
`tenant_code` IS NULL;
+
+-- data quality support choose database
+INSERT IGNORE INTO `t_ds_dq_rule_input_entry`
+(`id`, `field`, `type`, `title`, `value`, `options`, `placeholder`,
`option_source_type`, `value_type`, `input_type`, `is_show`, `can_edit`,
`is_emit`, `is_validate`, `create_time`, `update_time`)
+VALUES(30, 'src_database', 'select', '$t(src_database)', NULL, NULL, 'please
select source database', 0, 0, 0, 1, 1, 1, 1, current_timestamp,
current_timestamp);
+INSERT IGNORE INTO `t_ds_dq_rule_input_entry`
+(`id`, `field`, `type`, `title`, `value`, `options`, `placeholder`,
`option_source_type`, `value_type`, `input_type`, `is_show`, `can_edit`,
`is_emit`, `is_validate`, `create_time`, `update_time`)
+VALUES(31, 'target_database', 'select', '$t(target_database)', NULL, NULL,
'please select target database', 0, 0, 0, 1, 1, 1, 1, current_timestamp,
current_timestamp);
+
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(151, 1, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(152, 2, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(153, 3, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(154, 4, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(155, 5, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(156, 6, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(157, 7, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(158, 8, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(159, 9, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(160, 10, 30, NULL, 2, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(161, 3, 31, NULL, 6, current_timestamp, current_timestamp);
+INSERT IGNORE INTO `t_ds_relation_rule_input_entry`
+(`id`, `rule_id`, `rule_input_entry_id`, `values_map`, `index`, `create_time`,
`update_time`)
+VALUES(162, 4, 31, NULL, 7, current_timestamp, current_timestamp);
diff --git
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/UpgradeDao.java
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/UpgradeDao.java
index 343fbc6488..0154718780 100644
---
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/UpgradeDao.java
+++
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/UpgradeDao.java
@@ -17,13 +17,11 @@
package org.apache.dolphinscheduler.tools.datasource.dao;
-import org.apache.dolphinscheduler.common.utils.ScriptRunner;
+import org.apache.dolphinscheduler.common.sql.SqlScriptRunner;
import org.apache.dolphinscheduler.dao.upgrade.SchemaUtils;
import org.apache.dolphinscheduler.spi.enums.DbType;
import java.io.FileNotFoundException;
-import java.io.InputStreamReader;
-import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -33,9 +31,6 @@ import javax.sql.DataSource;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-
@Slf4j
public abstract class UpgradeDao {
@@ -63,17 +58,13 @@ public abstract class UpgradeDao {
* @param dbType db type
*/
private void runInitSql(DbType dbType) {
- String sqlFile = String.format("dolphinscheduler_%s.sql",
dbType.getDescp());
- Resource mysqlSQLFilePath = new ClassPathResource("sql/" + sqlFile);
- try (Connection conn = dataSource.getConnection()) {
- // Execute the dolphinscheduler_ddl.sql script to create the table
structure of dolphinscheduler
- ScriptRunner initScriptRunner = new ScriptRunner(conn, true, true);
- try (Reader initSqlReader = new
InputStreamReader(mysqlSQLFilePath.getInputStream())) {
- initScriptRunner.runScript(initSqlReader);
- }
- } catch (Exception e) {
- log.error("Execute init sql file: {} error", sqlFile, e);
- throw new RuntimeException(String.format("Execute init sql file:
%s error", sqlFile), e);
+ String sqlFilePath = String.format("sql/dolphinscheduler_%s.sql",
dbType.getDescp());
+ SqlScriptRunner sqlScriptRunner = new SqlScriptRunner(dataSource,
sqlFilePath);
+ try {
+ sqlScriptRunner.execute();
+ log.info("Success execute the sql initialize file: {}",
sqlFilePath);
+ } catch (Exception ex) {
+ throw new RuntimeException("Execute initialize sql file: " +
sqlFilePath + " error", ex);
}
}
@@ -120,14 +111,13 @@ public abstract class UpgradeDao {
private void upgradeDolphinSchedulerDML(String schemaDir, String
scriptFile) {
String schemaVersion = schemaDir.split("_")[0];
- Resource sqlFilePath = new ClassPathResource(
- String.format("sql/upgrade/%s/%s/%s", schemaDir,
getDbType().name().toLowerCase(), scriptFile));
- try (Connection conn = dataSource.getConnection()) {
- conn.setAutoCommit(false);
+ String sqlFilePath =
+ String.format("sql/upgrade/%s/%s/%s", schemaDir,
getDbType().name().toLowerCase(), scriptFile);
+ try {
// Execute the upgraded dolphinscheduler dml
- ScriptRunner scriptRunner = new ScriptRunner(conn, false, true);
- try (Reader sqlReader = new
InputStreamReader(sqlFilePath.getInputStream())) {
- scriptRunner.runScript(sqlReader);
+ SqlScriptRunner sqlScriptRunner = new SqlScriptRunner(dataSource,
sqlFilePath);
+ sqlScriptRunner.execute();
+ try (Connection connection = dataSource.getConnection()) {
String upgradeSQL;
if (isExistsTable(T_VERSION_NAME)) {
// Change version in the version table to the new version
@@ -138,11 +128,10 @@ public abstract class UpgradeDao {
} else {
throw new RuntimeException("The version table does not
exist");
}
- try (PreparedStatement pstmt =
conn.prepareStatement(upgradeSQL)) {
+ try (PreparedStatement pstmt =
connection.prepareStatement(upgradeSQL)) {
pstmt.setString(1, schemaVersion);
pstmt.executeUpdate();
}
- conn.commit();
}
log.info("Success execute the dml file, schemaDir: {}, ddlScript:
{}", schemaDir, scriptFile);
} catch (FileNotFoundException e) {
@@ -161,15 +150,12 @@ public abstract class UpgradeDao {
* @param schemaDir schemaDir
*/
public void upgradeDolphinSchedulerDDL(String schemaDir, String
scriptFile) {
- Resource sqlFilePath = new ClassPathResource(
- String.format("sql/upgrade/%s/%s/%s", schemaDir,
getDbType().name().toLowerCase(), scriptFile));
- try (Connection conn = dataSource.getConnection()) {
- conn.setAutoCommit(true);
+ String sqlFilePath =
+ String.format("sql/upgrade/%s/%s/%s", schemaDir,
getDbType().name().toLowerCase(), scriptFile);
+ SqlScriptRunner sqlScriptRunner = new SqlScriptRunner(dataSource,
sqlFilePath);
+ try {
// Execute the dolphinscheduler ddl.sql for the upgrade
- ScriptRunner scriptRunner = new ScriptRunner(conn, true, true);
- try (Reader sqlReader = new
InputStreamReader(sqlFilePath.getInputStream())) {
- scriptRunner.runScript(sqlReader);
- }
+ sqlScriptRunner.execute();
log.info("Success execute the ddl file, schemaDir: {}, ddlScript:
{}", schemaDir, scriptFile);
} catch (FileNotFoundException e) {
log.error("Cannot find the DDL file, schemaDir: {}, ddlScript:
{}", schemaDir, scriptFile, e);