diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index 055291a2d7..dc3f9def3d 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -1766,6 +1766,15 @@ public class Config extends ConfigBase { @ConfField(mutable = false, expType = ExperimentalType.EXPERIMENTAL) public static boolean enable_fqdn_mode = false; + /** + * enable use odbc table + */ + @ConfField(mutable = true, masterOnly = true, description = { + "是否开启 ODBC 外表功能,默认关闭,ODBC 外表是淘汰的功能,请使用 JDBC Catalog", + "Whether to enable the ODBC appearance function, it is disabled by default," + + " and the ODBC appearance is an obsolete feature. Please use the JDBC Catalog"}) + public static boolean enable_odbc_table = false; + /** * This is used whether to push down function to MYSQL in external Table with query sql * like odbc, jdbc for mysql table diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java index d13e8e76b2..6e529be7a9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java @@ -20,6 +20,7 @@ package org.apache.doris.analysis; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.Resource.ResourceType; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.FeNameFormat; @@ -93,6 +94,10 @@ public class CreateResourceStmt extends DdlStmt { if (resourceType == ResourceType.SPARK && !isExternal) { throw new AnalysisException("Spark is external resource"); } + if (resourceType == ResourceType.ODBC_CATALOG && !Config.enable_odbc_table) { + throw new AnalysisException("ODBC table is deprecated, use JDBC instead. Or you can set " + + "`enable_odbc_table=true` in fe.conf to enable ODBC again."); + } } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java index 2eae045e35..5e511176e0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java @@ -626,6 +626,10 @@ public class CreateTableStmt extends DdlStmt { if (engineName.equals("mysql") || engineName.equals("odbc") || engineName.equals("broker") || engineName.equals("elasticsearch") || engineName.equals("hive") || engineName.equals("iceberg") || engineName.equals("hudi") || engineName.equals("jdbc")) { + if (engineName.equals("odbc") && !Config.enable_odbc_table) { + throw new AnalysisException("ODBC table is deprecated, use JDBC instead. Or you can set " + + "`enable_odbc_table=true` in fe.conf to enable ODBC again."); + } if (!isExternal) { // this is for compatibility isExternal = true; diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcTable.java index 432cfd0aae..e330702e71 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcTable.java @@ -99,7 +99,7 @@ public class JdbcTable extends Table { public String getInsertSql() { StringBuilder sb = new StringBuilder("INSERT INTO "); - sb.append(OdbcTable.databaseProperName(TABLE_TYPE_MAP.get(getTableTypeName()), getExternalTableName())); + sb.append(databaseProperName(TABLE_TYPE_MAP.get(getTableTypeName()), getExternalTableName())); sb.append(" VALUES ("); for (int i = 0; i < getFullSchema().size(); ++i) { if (i != 0) { @@ -313,4 +313,74 @@ public class JdbcTable extends Table { } } } + + /** + * Formats the provided name (for example, a database, table, or schema name) according to the specified parameters. + * + * @param name The name to be formatted. + * @param wrapStart The character(s) to be added at the start of each name component. + * @param wrapEnd The character(s) to be added at the end of each name component. + * @param toUpperCase If true, convert the name to upper case. + * @param toLowerCase If true, convert the name to lower case. + *

+ * Note: If both toUpperCase and toLowerCase are true, the name will ultimately be converted to lower case. + *

+ * The name is expected to be in the format of 'schemaName.tableName'. If there is no '.', + * the function will treat the entire string as one name component. + * If there is a '.', the function will treat the string before the first '.' as the schema name + * and the string after the '.' as the table name. + * + * @return The formatted name. + */ + public static String formatName(String name, String wrapStart, String wrapEnd, boolean toUpperCase, + boolean toLowerCase) { + int index = name.indexOf("."); + if (index == -1) { // No dot in the name + String newName = toUpperCase ? name.toUpperCase() : name; + newName = toLowerCase ? newName.toLowerCase() : newName; + return wrapStart + newName + wrapEnd; + } else { + String schemaName = toUpperCase ? name.substring(0, index).toUpperCase() : name.substring(0, index); + schemaName = toLowerCase ? schemaName.toLowerCase() : schemaName; + String tableName = toUpperCase ? name.substring(index + 1).toUpperCase() : name.substring(index + 1); + tableName = toLowerCase ? tableName.toLowerCase() : tableName; + return wrapStart + schemaName + wrapEnd + "." + wrapStart + tableName + wrapEnd; + } + } + + /** + * Formats a database name according to the database type. + * + * Rules: + * - MYSQL, OCEANBASE: Wrap with backticks (`), case unchanged. Example: mySchema.myTable -> `mySchema.myTable` + * - SQLSERVER: Wrap with square brackets ([]), case unchanged. Example: mySchema.myTable -> [mySchema].[myTable] + * - POSTGRESQL, CLICKHOUSE, TRINO, OCEANBASE_ORACLE, SAP_HANA: Wrap with double quotes ("), case unchanged. + * Example: mySchema.myTable -> "mySchema"."myTable" + * - ORACLE: Wrap with double quotes ("), convert to upper case. Example: mySchema.myTable -> "MYSCHEMA"."MYTABLE" + * For other types, the name is returned as is. + * + * @param tableType The database type. + * @param name The name to be formatted, expected in 'schemaName.tableName' format. If no '.', treats entire string + * as one name component. If '.', treats string before first '.' as schema name and after as table name. + * @return The formatted name. + */ + public static String databaseProperName(TOdbcTableType tableType, String name) { + switch (tableType) { + case MYSQL: + case OCEANBASE: + return formatName(name, "`", "`", false, false); + case SQLSERVER: + return formatName(name, "[", "]", false, false); + case POSTGRESQL: + case CLICKHOUSE: + case TRINO: + case OCEANBASE_ORACLE: + case SAP_HANA: + return formatName(name, "\"", "\"", false, false); + case ORACLE: + return formatName(name, "\"", "\"", true, false); + default: + return name; + } + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OdbcTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OdbcTable.java index cab37a1ecf..6cd194b1eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OdbcTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OdbcTable.java @@ -71,76 +71,6 @@ public class OdbcTable extends Table { TABLE_TYPE_MAP = Collections.unmodifiableMap(tempMap); } - /** - * Formats the provided name (for example, a database, table, or schema name) according to the specified parameters. - * - * @param name The name to be formatted. - * @param wrapStart The character(s) to be added at the start of each name component. - * @param wrapEnd The character(s) to be added at the end of each name component. - * @param toUpperCase If true, convert the name to upper case. - * @param toLowerCase If true, convert the name to lower case. - *

- * Note: If both toUpperCase and toLowerCase are true, the name will ultimately be converted to lower case. - *

- * The name is expected to be in the format of 'schemaName.tableName'. If there is no '.', - * the function will treat the entire string as one name component. - * If there is a '.', the function will treat the string before the first '.' as the schema name - * and the string after the '.' as the table name. - * - * @return The formatted name. - */ - public static String formatName(String name, String wrapStart, String wrapEnd, boolean toUpperCase, - boolean toLowerCase) { - int index = name.indexOf("."); - if (index == -1) { // No dot in the name - String newName = toUpperCase ? name.toUpperCase() : name; - newName = toLowerCase ? newName.toLowerCase() : newName; - return wrapStart + newName + wrapEnd; - } else { - String schemaName = toUpperCase ? name.substring(0, index).toUpperCase() : name.substring(0, index); - schemaName = toLowerCase ? schemaName.toLowerCase() : schemaName; - String tableName = toUpperCase ? name.substring(index + 1).toUpperCase() : name.substring(index + 1); - tableName = toLowerCase ? tableName.toLowerCase() : tableName; - return wrapStart + schemaName + wrapEnd + "." + wrapStart + tableName + wrapEnd; - } - } - - /** - * Formats a database name according to the database type. - * - * Rules: - * - MYSQL, OCEANBASE: Wrap with backticks (`), case unchanged. Example: mySchema.myTable -> `mySchema.myTable` - * - SQLSERVER: Wrap with square brackets ([]), case unchanged. Example: mySchema.myTable -> [mySchema].[myTable] - * - POSTGRESQL, CLICKHOUSE, TRINO, OCEANBASE_ORACLE, SAP_HANA: Wrap with double quotes ("), case unchanged. - * Example: mySchema.myTable -> "mySchema"."myTable" - * - ORACLE: Wrap with double quotes ("), convert to upper case. Example: mySchema.myTable -> "MYSCHEMA"."MYTABLE" - * For other types, the name is returned as is. - * - * @param tableType The database type. - * @param name The name to be formatted, expected in 'schemaName.tableName' format. If no '.', treats entire string - * as one name component. If '.', treats string before first '.' as schema name and after as table name. - * @return The formatted name. - */ - public static String databaseProperName(TOdbcTableType tableType, String name) { - switch (tableType) { - case MYSQL: - case OCEANBASE: - return formatName(name, "`", "`", false, false); - case SQLSERVER: - return formatName(name, "[", "]", false, false); - case POSTGRESQL: - case CLICKHOUSE: - case TRINO: - case OCEANBASE_ORACLE: - case SAP_HANA: - return formatName(name, "\"", "\"", false, false); - case ORACLE: - return formatName(name, "\"", "\"", true, false); - default: - return name; - } - } - private String odbcCatalogResourceName; private String host; private String port; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcScanNode.java index 34bc96255a..8a7de98505 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcScanNode.java @@ -18,6 +18,8 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; +import org.apache.doris.analysis.BinaryPredicate; +import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.ExprSubstitutionMap; import org.apache.doris.analysis.FunctionCallExpr; @@ -28,9 +30,10 @@ import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.JdbcTable; -import org.apache.doris.catalog.OdbcTable; +import org.apache.doris.catalog.Type; import org.apache.doris.catalog.external.JdbcExternalTable; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.UserException; import org.apache.doris.nereids.glue.translator.PlanTranslatorContext; import org.apache.doris.planner.external.ExternalScanNode; @@ -73,7 +76,7 @@ public class JdbcScanNode extends ExternalScanNode { tbl = (JdbcTable) (desc.getTable()); } jdbcType = tbl.getJdbcTableType(); - tableName = OdbcTable.databaseProperName(jdbcType, tbl.getJdbcTable()); + tableName = JdbcTable.databaseProperName(jdbcType, tbl.getJdbcTable()); } @Override @@ -123,14 +126,14 @@ public class JdbcScanNode extends ExternalScanNode { for (SlotRef slotRef : slotRefs) { SlotRef slotRef1 = (SlotRef) slotRef.clone(); slotRef1.setTblName(null); - slotRef1.setLabel(OdbcTable.databaseProperName(jdbcType, slotRef1.getColumnName())); + slotRef1.setLabel(JdbcTable.databaseProperName(jdbcType, slotRef1.getColumnName())); sMap.put(slotRef, slotRef1); } ArrayList conjunctsList = Expr.cloneList(conjuncts, sMap); for (Expr p : conjunctsList) { - if (OdbcScanNode.shouldPushDownConjunct(jdbcType, p)) { - String filter = OdbcScanNode.conjunctExprToString(jdbcType, p); + if (shouldPushDownConjunct(jdbcType, p)) { + String filter = conjunctExprToString(jdbcType, p); filters.add(filter); conjuncts.remove(p); } @@ -144,7 +147,7 @@ public class JdbcScanNode extends ExternalScanNode { continue; } Column col = slot.getColumn(); - columns.add(OdbcTable.databaseProperName(jdbcType, col.getName())); + columns.add(JdbcTable.databaseProperName(jdbcType, col.getName())); } if (0 == columns.size()) { columns.add("*"); @@ -270,4 +273,53 @@ public class JdbcScanNode extends ExternalScanNode { Env.getCurrentEnv().getCurrentCatalog().getDbOrAnalysisException(tbl.getQualifiedDbName()).getId(), tbl.getId(), -1L); } + + // Now some database have different function call like doris, now doris do not + // push down the function call except MYSQL + public static boolean shouldPushDownConjunct(TOdbcTableType tableType, Expr expr) { + if (!tableType.equals(TOdbcTableType.MYSQL)) { + List fnExprList = Lists.newArrayList(); + expr.collect(FunctionCallExpr.class, fnExprList); + if (!fnExprList.isEmpty()) { + return false; + } + } + return Config.enable_func_pushdown; + } + + public static String conjunctExprToString(TOdbcTableType tableType, Expr expr) { + if (tableType.equals(TOdbcTableType.ORACLE) && expr.contains(DateLiteral.class) + && (expr instanceof BinaryPredicate)) { + ArrayList children = expr.getChildren(); + // k1 OP '2022-12-10 20:55:59' changTo ---> k1 OP to_date('{}','yyyy-mm-dd hh24:mi:ss') + // oracle datetime push down is different: https://github.com/apache/doris/discussions/15069 + if (children.get(1).isConstant() && (children.get(1).getType().equals(Type.DATETIME) || children + .get(1).getType().equals(Type.DATETIMEV2))) { + String filter = children.get(0).toSql(); + filter += ((BinaryPredicate) expr).getOp().toString(); + filter += "to_date('" + children.get(1).getStringValue() + "','yyyy-mm-dd hh24:mi:ss')"; + return filter; + } + } + if (tableType.equals(TOdbcTableType.TRINO) && expr.contains(DateLiteral.class) + && (expr instanceof BinaryPredicate)) { + ArrayList children = expr.getChildren(); + if (children.get(1).isConstant() && (children.get(1).getType().isDate()) || children + .get(1).getType().isDateV2()) { + String filter = children.get(0).toSql(); + filter += ((BinaryPredicate) expr).getOp().toString(); + filter += "date '" + children.get(1).getStringValue() + "'"; + return filter; + } + if (children.get(1).isConstant() && (children.get(1).getType().isDatetime() || children + .get(1).getType().isDatetimeV2())) { + String filter = children.get(0).toSql(); + filter += ((BinaryPredicate) expr).getOp().toString(); + filter += "timestamp '" + children.get(1).getStringValue() + "'"; + return filter; + } + } + + return expr.toMySql(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java index 73b981b19a..1ab94d274a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/JdbcTableSink.java @@ -18,7 +18,6 @@ package org.apache.doris.planner; import org.apache.doris.catalog.JdbcTable; -import org.apache.doris.catalog.OdbcTable; import org.apache.doris.qe.ConnectContext; import org.apache.doris.thrift.TDataSink; import org.apache.doris.thrift.TDataSinkType; @@ -49,7 +48,7 @@ public class JdbcTableSink extends DataSink { public JdbcTableSink(JdbcTable jdbcTable) { resourceName = jdbcTable.getResourceName(); jdbcType = jdbcTable.getJdbcTableType(); - externalTableName = OdbcTable.databaseProperName(jdbcType, jdbcTable.getExternalTableName()); + externalTableName = JdbcTable.databaseProperName(jdbcType, jdbcTable.getExternalTableName()); useTransaction = ConnectContext.get().getSessionVariable().isEnableOdbcTransaction(); jdbcUrl = jdbcTable.getJdbcUrl(); jdbcUser = jdbcTable.getJdbcUser(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java index 3439987f16..07b2d3775b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java @@ -18,20 +18,16 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; -import org.apache.doris.analysis.BinaryPredicate; -import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.ExprSubstitutionMap; -import org.apache.doris.analysis.FunctionCallExpr; import org.apache.doris.analysis.SlotDescriptor; import org.apache.doris.analysis.SlotRef; import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.JdbcTable; import org.apache.doris.catalog.OdbcTable; -import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; -import org.apache.doris.common.Config; import org.apache.doris.common.UserException; import org.apache.doris.planner.external.ExternalScanNode; import org.apache.doris.statistics.StatisticalType; @@ -58,55 +54,6 @@ import java.util.List; public class OdbcScanNode extends ExternalScanNode { private static final Logger LOG = LogManager.getLogger(OdbcScanNode.class); - // Now some database have different function call like doris, now doris do not - // push down the function call except MYSQL - public static boolean shouldPushDownConjunct(TOdbcTableType tableType, Expr expr) { - if (!tableType.equals(TOdbcTableType.MYSQL)) { - List fnExprList = Lists.newArrayList(); - expr.collect(FunctionCallExpr.class, fnExprList); - if (!fnExprList.isEmpty()) { - return false; - } - } - return Config.enable_func_pushdown; - } - - public static String conjunctExprToString(TOdbcTableType tableType, Expr expr) { - if (tableType.equals(TOdbcTableType.ORACLE) && expr.contains(DateLiteral.class) - && (expr instanceof BinaryPredicate)) { - ArrayList children = expr.getChildren(); - // k1 OP '2022-12-10 20:55:59' changTo ---> k1 OP to_date('{}','yyyy-mm-dd hh24:mi:ss') - // oracle datetime push down is different: https://github.com/apache/doris/discussions/15069 - if (children.get(1).isConstant() && (children.get(1).getType().equals(Type.DATETIME) || children - .get(1).getType().equals(Type.DATETIMEV2))) { - String filter = children.get(0).toSql(); - filter += ((BinaryPredicate) expr).getOp().toString(); - filter += "to_date('" + children.get(1).getStringValue() + "','yyyy-mm-dd hh24:mi:ss')"; - return filter; - } - } - if (tableType.equals(TOdbcTableType.TRINO) && expr.contains(DateLiteral.class) - && (expr instanceof BinaryPredicate)) { - ArrayList children = expr.getChildren(); - if (children.get(1).isConstant() && (children.get(1).getType().isDate()) || children - .get(1).getType().isDateV2()) { - String filter = children.get(0).toSql(); - filter += ((BinaryPredicate) expr).getOp().toString(); - filter += "date '" + children.get(1).getStringValue() + "'"; - return filter; - } - if (children.get(1).isConstant() && (children.get(1).getType().isDatetime() || children - .get(1).getType().isDatetimeV2())) { - String filter = children.get(0).toSql(); - filter += ((BinaryPredicate) expr).getOp().toString(); - filter += "timestamp '" + children.get(1).getStringValue() + "'"; - return filter; - } - } - - return expr.toMySql(); - } - private final List columns = new ArrayList(); private final List filters = new ArrayList(); private String tblName; @@ -122,7 +69,7 @@ public class OdbcScanNode extends ExternalScanNode { super(id, desc, "SCAN ODBC", StatisticalType.ODBC_SCAN_NODE, false); connectString = tbl.getConnectString(); odbcType = tbl.getOdbcTableType(); - tblName = OdbcTable.databaseProperName(odbcType, tbl.getOdbcTableName()); + tblName = JdbcTable.databaseProperName(odbcType, tbl.getOdbcTableName()); this.tbl = tbl; } @@ -202,7 +149,7 @@ public class OdbcScanNode extends ExternalScanNode { continue; } Column col = slot.getColumn(); - columns.add(OdbcTable.databaseProperName(odbcType, col.getName())); + columns.add(JdbcTable.databaseProperName(odbcType, col.getName())); } // this happens when count(*) if (0 == columns.size()) { @@ -222,13 +169,13 @@ public class OdbcScanNode extends ExternalScanNode { for (SlotRef slotRef : slotRefs) { SlotRef tmpRef = (SlotRef) slotRef.clone(); tmpRef.setTblName(null); - tmpRef.setLabel(OdbcTable.databaseProperName(odbcType, tmpRef.getColumnName())); + tmpRef.setLabel(JdbcTable.databaseProperName(odbcType, tmpRef.getColumnName())); sMap.put(slotRef, tmpRef); } ArrayList odbcConjuncts = Expr.cloneList(conjuncts, sMap); for (Expr p : odbcConjuncts) { - if (shouldPushDownConjunct(odbcType, p)) { - String filter = conjunctExprToString(odbcType, p); + if (JdbcScanNode.shouldPushDownConjunct(odbcType, p)) { + String filter = JdbcScanNode.conjunctExprToString(odbcType, p); filters.add(filter); conjuncts.remove(p); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcTableSink.java index 68df73c63e..0fbe85ea32 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcTableSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcTableSink.java @@ -17,6 +17,7 @@ package org.apache.doris.planner; +import org.apache.doris.catalog.JdbcTable; import org.apache.doris.catalog.OdbcTable; import org.apache.doris.qe.ConnectContext; import org.apache.doris.thrift.TDataSink; @@ -36,7 +37,7 @@ public class OdbcTableSink extends DataSink { connectString = odbcTable.getConnectString(); originTblName = odbcTable.getName(); odbcType = odbcTable.getOdbcTableType(); - tblName = odbcTable.databaseProperName(odbcType, odbcTable.getOdbcTableName()); + tblName = JdbcTable.databaseProperName(odbcType, odbcTable.getOdbcTableName()); useTransaction = ConnectContext.get().getSessionVariable().isEnableOdbcTransaction(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java index e182ab2a9b..d18f5a57f8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java @@ -184,6 +184,7 @@ public class AlterTest { } private static void createTable(String sql) throws Exception { + Config.enable_odbc_table = true; CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext); Env.getCurrentEnv().createTable(createTableStmt); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateResourceStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateResourceStmtTest.java index d7291f477b..78defde017 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateResourceStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateResourceStmtTest.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.Resource; import org.apache.doris.catalog.Resource.ResourceType; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.UserException; import org.apache.doris.mysql.privilege.AccessControllerManager; import org.apache.doris.mysql.privilege.PrivPredicate; @@ -73,6 +74,7 @@ public class CreateResourceStmtTest { properties = Maps.newHashMap(); properties.put("type", "odbc_catalog"); stmt = new CreateResourceStmt(true, false, resourceName2, properties); + Config.enable_odbc_table = true; stmt.analyze(analyzer); Assert.assertEquals(resourceName2, stmt.getResourceName()); Assert.assertEquals(Resource.ResourceType.ODBC_CATALOG, stmt.getResourceType()); diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/EnvOperationTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/EnvOperationTest.java index a4a8b9e59f..d9afb49eb2 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/catalog/EnvOperationTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/EnvOperationTest.java @@ -23,6 +23,7 @@ import org.apache.doris.analysis.AlterTableStmt; import org.apache.doris.analysis.CreateDbStmt; import org.apache.doris.analysis.CreateResourceStmt; import org.apache.doris.analysis.CreateTableStmt; +import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; import org.apache.doris.qe.ConnectContext; @@ -100,6 +101,7 @@ public class EnvOperationTest { } private static void createResource(String sql) throws Exception { + Config.enable_odbc_table = true; CreateResourceStmt createResourceStmt = (CreateResourceStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext); Env.getCurrentEnv().getResourceMgr().createResource(createResourceStmt); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/OdbcCatalogResourceTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/OdbcCatalogResourceTest.java index 32a43e5cd9..d2ecea5145 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/catalog/OdbcCatalogResourceTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/OdbcCatalogResourceTest.java @@ -20,6 +20,7 @@ package org.apache.doris.catalog; import org.apache.doris.analysis.AccessTestUtil; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.CreateResourceStmt; +import org.apache.doris.common.Config; import org.apache.doris.common.FeMetaVersion; import org.apache.doris.common.UserException; import org.apache.doris.common.proc.BaseProcResult; @@ -86,6 +87,7 @@ public class OdbcCatalogResourceTest { // host: 127.0.0.1, port: 7777, without driver and odbc_type CreateResourceStmt stmt = new CreateResourceStmt(true, false, name, properties); + Config.enable_odbc_table = true; stmt.analyze(analyzer); OdbcCatalogResource resource = (OdbcCatalogResource) Resource.fromStmt(stmt); Assert.assertEquals(name, resource.getName()); diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java index 1a0d3d5c4f..ac2fe5978d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java @@ -528,6 +528,7 @@ public abstract class TestWithFeService { public void createTable(String sql) throws Exception { try { + Config.enable_odbc_table = true; createTables(sql); } catch (ConcurrentModificationException e) { e.printStackTrace();