You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/04/08 01:14:01 UTC
[incubator-doris] branch master updated: [fix] Disable cast operation of object type (#8882)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new fa8e4ec2f0 [fix] Disable cast operation of object type (#8882)
fa8e4ec2f0 is described below
commit fa8e4ec2f0547f35b2636d52070169f818b49d66
Author: HappenLee <ha...@hotmail.com>
AuthorDate: Fri Apr 8 09:13:56 2022 +0800
[fix] Disable cast operation of object type (#8882)
Disable cast between string and object type(bitmap, hll, quantile_state)
---
.../java/org/apache/doris/analysis/CastExpr.java | 28 +++++++++++--------
.../apache/doris/analysis/FunctionCallExpr.java | 4 +--
.../org/apache/doris/catalog/PrimitiveType.java | 12 ---------
.../java/org/apache/doris/catalog/ScalarType.java | 12 ++++++---
.../org/apache/doris/planner/QueryPlanTest.java | 31 +++++++++++++---------
.../doris/planner/TableFunctionPlanTest.java | 4 +--
6 files changed, 48 insertions(+), 43 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index c39b2b7cfc..ed7bd624ee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -134,23 +134,29 @@ public class CastExpr extends Expr {
return targetTypeDef;
}
+ private static boolean disableRegisterCastingFunction(Type fromType, Type toType) {
+ // Disable casting from boolean to decimal or datetime or date
+ if (fromType.isBoolean() &&
+ (toType.equals(Type.DECIMALV2) ||
+ toType.equals(Type.DATETIME) || toType.equals(Type.DATE))) {
+ return true;
+ }
+
+ // Disable casting operation of hll/bitmap/quantile_state
+ if (fromType.isObjectStored() || toType.isObjectStored()) {
+ return true;
+ }
+ // Disable no-op casting
+ return fromType.equals(toType);
+ }
+
public static void initBuiltins(FunctionSet functionSet) {
for (Type fromType : Type.getSupportedTypes()) {
if (fromType.isNull()) {
continue;
}
for (Type toType : Type.getSupportedTypes()) {
- if (toType.isNull()) {
- continue;
- }
- // Disable casting from boolean to decimal or datetime or date
- if (fromType.isBoolean() &&
- (toType.equals(Type.DECIMALV2) ||
- toType.equals(Type.DATETIME) || toType.equals(Type.DATE))) {
- continue;
- }
- // Disable no-op casts
- if (fromType.equals(toType)) {
+ if (toType.isNull() || disableRegisterCastingFunction(fromType, toType)) {
continue;
}
String beClass = toType.isDecimalV2() || fromType.isDecimalV2() ? "DecimalV2Operators" : "CastFunctions";
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 261fa40725..79c13fe03b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -89,8 +89,6 @@ public class FunctionCallExpr extends Expr {
private boolean isRewrote = false;
- public static final String UNKNOWN_TABLE_FUNCTION_MSG = "This table function not supported now";
-
public void setIsAnalyticFnCall(boolean v) {
isAnalyticFnCall = v;
}
@@ -827,7 +825,7 @@ public class FunctionCallExpr extends Expr {
fn = getTableFunction(fnName.getFunction(), childTypes,
Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
if (fn == null) {
- throw new AnalysisException(UNKNOWN_TABLE_FUNCTION_MSG);
+ throw new AnalysisException(getFunctionNotFoundError(argTypes));
}
} else {
// now first find function in built-in functions
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java
index 5521966d58..2b29dbabe3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java
@@ -248,9 +248,6 @@ public enum PrimitiveType {
builder.put(VARCHAR, DECIMALV2);
builder.put(VARCHAR, VARCHAR);
builder.put(VARCHAR, STRING);
- builder.put(VARCHAR, HLL);
- builder.put(VARCHAR, BITMAP);
- builder.put(VARCHAR, QUANTILE_STATE);
// Varchar
builder.put(STRING, BOOLEAN);
@@ -266,9 +263,6 @@ public enum PrimitiveType {
builder.put(STRING, DECIMALV2);
builder.put(STRING, VARCHAR);
builder.put(STRING, STRING);
- builder.put(STRING, HLL);
- builder.put(STRING, BITMAP);
- builder.put(STRING, QUANTILE_STATE);
// DecimalV2
builder.put(DECIMALV2, BOOLEAN);
@@ -285,18 +279,12 @@ public enum PrimitiveType {
// HLL
builder.put(HLL, HLL);
- builder.put(HLL, VARCHAR);
- builder.put(HLL, STRING);
// BITMAP
builder.put(BITMAP, BITMAP);
- builder.put(BITMAP, VARCHAR);
- builder.put(BITMAP, STRING);
// QUANTILE_STATE
builder.put(QUANTILE_STATE, QUANTILE_STATE);
- builder.put(QUANTILE_STATE, VARCHAR);
- builder.put(QUANTILE_STATE, STRING);
//TIME
builder.put(TIME, TIME);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
index 71f0882739..fda252309a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
@@ -546,9 +546,6 @@ public class ScalarType extends Type {
if (type == PrimitiveType.VARCHAR && scalarType.isStringType()) {
return true;
}
- if (type == PrimitiveType.HLL && scalarType.isStringType()) {
- return true;
- }
if (isDecimalV2() && scalarType.isWildcardDecimal()) {
Preconditions.checkState(!isWildcardDecimal());
return true;
@@ -682,6 +679,15 @@ public class ScalarType extends Type {
return INVALID;
}
+ boolean t1IsBitMap = t1.type == PrimitiveType.BITMAP;
+ boolean t2IsBitMap = t2.type == PrimitiveType.BITMAP;
+ if (t1IsBitMap || t2IsBitMap) {
+ if (t1IsBitMap && t2IsBitMap) {
+ return BITMAP;
+ }
+ return INVALID;
+ }
+
// for cast all type
if (t1.type == PrimitiveType.ALL || t2.type == PrimitiveType.ALL) {
return Type.ALL;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index bfaec003ad..20a5c7c704 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -476,18 +476,6 @@ public class QueryPlanTest {
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`id` | `id2`"));
Assert.assertTrue(explainString.contains("0:OlapScanNode"));
- queryStr = "explain insert into test.bitmap_table select id, to_bitmap(id2) from test.bitmap_table_2;";
- explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
- Assert.assertTrue(explainString.contains("OLAP TABLE SINK"));
- Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`id` | to_bitmap(CAST(`id2` AS CHARACTER))"));
- Assert.assertTrue(explainString.contains("0:OlapScanNode"));
-
- queryStr = "explain insert into test.bitmap_table select id, bitmap_hash(id2) from test.bitmap_table_2;";
- explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
- Assert.assertTrue(explainString.contains("OLAP TABLE SINK"));
- Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`id` | bitmap_hash(CAST(`id2` AS CHARACTER))"));
- Assert.assertTrue(explainString.contains("0:OlapScanNode"));
-
queryStr = "explain insert into test.bitmap_table select id, id from test.bitmap_table_2;";
String errorMsg = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
Assert.assertTrue(errorMsg.contains("bitmap column require the function return type is BITMAP"));
@@ -615,6 +603,25 @@ public class QueryPlanTest {
sql = "SHOW VARIABLES LIKE 'lower_case_%'; SHOW VARIABLES LIKE 'sql_mode'";
List<StatementBase> stmts = UtFrameUtils.parseAndAnalyzeStmts(sql, connectContext);
Assert.assertEquals(2, stmts.size());
+
+ // disable cast hll/bitmap to string
+ testHLLQueryPlan(
+ "select cast(id2 as varchar) from test.hll_table;",
+ "Invalid type cast of `id2` from HLL to VARCHAR(*)"
+ );
+ testBitmapQueryPlan(
+ "select cast(id2 as varchar) from test.bitmap_table;",
+ "Invalid type cast of `id2` from BITMAP to VARCHAR(*)"
+ );
+ // disable implicit cast hll/bitmap to string
+ testHLLQueryPlan(
+ "select length(id2) from test.hll_table;",
+ "No matching function with signature: length(hll)"
+ );
+ testBitmapQueryPlan(
+ "select length(id2) from test.bitmap_table;",
+ "No matching function with signature: length(bitmap)"
+ );
}
@Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
index 58e4c9de86..15d84f7f39 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
@@ -184,11 +184,11 @@ public class TableFunctionPlanTest {
public void errorParam() throws Exception {
String sql = "explain select k1, e1 from db1.tbl1 lateral view explode_split(k2) tmp as e1;";
String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql);
- Assert.assertTrue(explainString.contains(FunctionCallExpr.UNKNOWN_TABLE_FUNCTION_MSG));
+ Assert.assertTrue(explainString.contains("No matching function with signature: explode_split(varchar(1))"));
sql = "explain select k1, e1 from db1.tbl1 lateral view explode_split(k1) tmp as e1;";
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql);
- Assert.assertTrue(explainString.contains(FunctionCallExpr.UNKNOWN_TABLE_FUNCTION_MSG));
+ Assert.assertTrue(explainString.contains("No matching function with signature: explode_split(int(11))"));
}
/* Case2 table function in where stmt
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org