Skip to content

Commit

Permalink
support part of modify data type online ddl check
Browse files Browse the repository at this point in the history
  • Loading branch information
LioRoger committed Jan 15, 2025
1 parent b456994 commit 3b3fb1c
Show file tree
Hide file tree
Showing 66 changed files with 634 additions and 188 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.jdbc.core.JdbcOperations;

import com.oceanbase.odc.core.session.ConnectionSession;
import com.oceanbase.odc.core.session.ConnectionSessionConstants;
import com.oceanbase.odc.core.session.ConnectionSessionUtil;
import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.core.sql.parser.AbstractSyntaxTreeFactories;
import com.oceanbase.odc.core.sql.parser.AbstractSyntaxTreeFactory;
Expand Down Expand Up @@ -52,11 +51,8 @@ public DefaultSqlChecker(@NonNull DialectType dialectType,

public DefaultSqlChecker(@NonNull ConnectionSession session, String delimiter) {
this(session.getDialectType(), delimiter, SqlCheckRules.getAllDefaultRules(
session.getSyncJdbcExecutor(ConnectionSessionConstants.CONSOLE_DS_KEY), session.getDialectType()));
}

public DefaultSqlChecker(JdbcOperations jdbcOperations, @NonNull DialectType dialectType, String delimiter) {
this(dialectType, delimiter, SqlCheckRules.getAllDefaultRules(jdbcOperations, dialectType));
session.getSyncJdbcExecutor(ConnectionSessionConstants.CONSOLE_DS_KEY),
() -> ConnectionSessionUtil.getVersion(session), session.getDialectType()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2023 OceanBase.
*
* 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
*
* 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 com.oceanbase.odc.service.sqlcheck;

import java.util.Map;
import java.util.function.Supplier;

import com.oceanbase.odc.core.shared.constant.DialectType;

import lombok.Getter;

/**
* @author longpeng.zlp
* @date 2025/1/10 10:22
*/
@Getter
public class SqlCheckRuleContext {
private final Supplier<String> dbVersionSupplier;
private final DialectType dialectType;
private final Map<String, Object> parameters;

private SqlCheckRuleContext(Supplier<String> dbVersionSupplier, DialectType dialectType,
Map<String, Object> parameters) {
this.dbVersionSupplier = dbVersionSupplier;
this.dialectType = dialectType;
this.parameters = parameters;
}

public static SqlCheckRuleContext create(Supplier<String> dbVersionSupplier, DialectType dialectType,
Map<String, Object> parameters) {
if (null == dialectType) {
throw new RuntimeException("dbVersion or dialectType should not be null");
}
return new SqlCheckRuleContext(dbVersionSupplier, dialectType, parameters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@
*/
package com.oceanbase.odc.service.sqlcheck;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;

import lombok.NonNull;
Expand All @@ -26,7 +23,7 @@ public interface SqlCheckRuleFactory {

SqlCheckRuleType getSupportsType();

SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters);
SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext);

default String getParameterNameKey(String parameterName) {
return "${com.oceanbase.odc.builtin-resource.regulation.rule.sql-check."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import javax.validation.Valid;
Expand Down Expand Up @@ -146,7 +147,8 @@ public List<CheckViolation> check(@NotNull Long environmentId, @NonNull String d
SqlCheckContext checkContext = new SqlCheckContext((long) sqls.size());
try (SingleConnectionDataSource dataSource = (SingleConnectionDataSource) factory.getDataSource()) {
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
List<SqlCheckRule> checkRules = getRules(rules, config.getDialectType(), jdbc);
List<SqlCheckRule> checkRules = getRules(rules, () -> SqlCheckUtil.getDbVersion(config, dataSource),
config.getDialectType(), jdbc);
DefaultSqlChecker sqlChecker = new DefaultSqlChecker(config.getDialectType(), null, checkRules);
List<CheckViolation> checkViolations = new ArrayList<>();
for (OffsetString sql : sqls) {
Expand All @@ -159,11 +161,11 @@ public List<CheckViolation> check(@NotNull Long environmentId, @NonNull String d
}

public List<SqlCheckRule> getRules(List<Rule> rules, @NonNull ConnectionSession session) {
return getRules(rules, session.getDialectType(),
return getRules(rules, () -> ConnectionSessionUtil.getVersion(session), session.getDialectType(),
session.getSyncJdbcExecutor(ConnectionSessionConstants.CONSOLE_DS_KEY));
}

public List<SqlCheckRule> getRules(List<Rule> rules,
public List<SqlCheckRule> getRules(List<Rule> rules, Supplier<String> dbVersionSupplier,
@NonNull DialectType dialectType, @NonNull JdbcOperations jdbc) {
if (CollectionUtils.isEmpty(rules)) {
return Collections.emptyList();
Expand All @@ -177,7 +179,7 @@ public List<SqlCheckRule> getRules(List<Rule> rules,
return Objects.equals(metadata.getType(), RuleType.SQL_CHECK);
}).map(rule -> {
try {
return SqlCheckRules.createByRule(candidates, dialectType, rule);
return SqlCheckRules.createByRule(candidates, dbVersionSupplier, dialectType, rule);
} catch (Exception e) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,17 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.sql.DataSource;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.Validate;

import com.oceanbase.odc.common.util.StringUtils;
import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.core.sql.parser.AbstractSyntaxTreeFactories;
import com.oceanbase.odc.core.sql.parser.AbstractSyntaxTreeFactory;
import com.oceanbase.odc.service.connection.model.ConnectionConfig;
import com.oceanbase.odc.service.plugin.ConnectionPluginUtil;
import com.oceanbase.odc.service.sqlcheck.model.CheckResult;
import com.oceanbase.odc.service.sqlcheck.model.CheckViolation;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
Expand Down Expand Up @@ -240,4 +244,13 @@ public static Statement parseSingleSql(DialectType dialectType, String sql) {
}
}

public static String getDbVersion(ConnectionConfig config, DataSource dataSource) {
try {
return ConnectionPluginUtil.getInformationExtension(config.getDialectType())
.getDBVersion(dataSource.getConnection());
} catch (Throwable e) {
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.MySQLColumnCalculation;
Expand All @@ -34,7 +33,8 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
DialectType dialectType = sqlCheckRuleContext.getDialectType();
return (dialectType.isMysql() || dialectType.isDoris()) ? new MySQLColumnCalculation()
: new OracleColumnCalculation();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.ColumnCharsetExists;
Expand All @@ -33,7 +31,7 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
return new ColumnCharsetExists();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.ColumnCollationExists;
Expand All @@ -33,7 +31,7 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
return new ColumnCollationExists();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
import java.util.List;
import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.ColumnNameInBlackList;
Expand All @@ -36,8 +36,9 @@ public SqlCheckRuleType getSupportsType() {

@Override
@SuppressWarnings("all")
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
String key = getParameterNameKey("black-list");
Map<String, Object> parameters = sqlCheckRuleContext.getParameters();
if (parameters == null || parameters.isEmpty() || parameters.get(key) == null) {
return new ColumnNameInBlackList(new HashSet<>());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.CreateTableAsExists;
Expand All @@ -38,7 +36,7 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
return new CreateTableAsExists();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.CreateTableLikeExists;
Expand All @@ -38,7 +36,7 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
return new CreateTableLikeExists();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.ForeignConstraintExists;
Expand All @@ -33,7 +31,7 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
return new ForeignConstraintExists();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.MySQLLeftFuzzyMatch;
Expand All @@ -34,7 +33,8 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
DialectType dialectType = sqlCheckRuleContext.getDialectType();
return (dialectType.isMysql() || dialectType.isDoris()) ? new MySQLLeftFuzzyMatch()
: new OracleLeftFuzzyMatch();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.MySQLMissingRequiredColumns;
Expand All @@ -38,7 +39,9 @@ public SqlCheckRuleType getSupportsType() {

@Override
@SuppressWarnings("all")
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
DialectType dialectType = sqlCheckRuleContext.getDialectType();
Map<String, Object> parameters = sqlCheckRuleContext.getParameters();
String key = getParameterNameKey("column-names");
Set<String> cols;
if (parameters == null || parameters.isEmpty() || parameters.get(key) == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
*/
package com.oceanbase.odc.service.sqlcheck.factory;

import java.util.Map;
import java.util.function.Supplier;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.MySQLNoColumnCommentExists;
Expand All @@ -41,7 +41,8 @@ public SqlCheckRuleType getSupportsType() {
}

@Override
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
DialectType dialectType = sqlCheckRuleContext.getDialectType();
return (dialectType.isMysql() || dialectType.isDoris()) ? new MySQLNoColumnCommentExists()
: new OracleNoColumnCommentExists(schemaSupplier);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
import java.util.List;
import java.util.Map;

import com.oceanbase.odc.core.shared.constant.DialectType;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRule;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleContext;
import com.oceanbase.odc.service.sqlcheck.SqlCheckRuleFactory;
import com.oceanbase.odc.service.sqlcheck.model.SqlCheckRuleType;
import com.oceanbase.odc.service.sqlcheck.rule.NoDefaultValueExists;
Expand All @@ -36,7 +36,8 @@ public SqlCheckRuleType getSupportsType() {

@Override
@SuppressWarnings("all")
public SqlCheckRule generate(@NonNull DialectType dialectType, Map<String, Object> parameters) {
public SqlCheckRule generate(@NonNull SqlCheckRuleContext sqlCheckRuleContext) {
Map<String, Object> parameters = sqlCheckRuleContext.getParameters();
String key = getParameterNameKey("no-default-value-datatype-list");
if (parameters == null || parameters.isEmpty() || parameters.get(key) == null) {
return new NoDefaultValueExists(new HashSet<>());
Expand Down
Loading

0 comments on commit 3b3fb1c

Please sign in to comment.