This is an automated email from the ASF dual-hosted git repository.
gabriellee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 67dc68630b [Improve](complex-type)improve array/map/struct creating
and function with decimalv3 (#19830)
67dc68630b is described below
commit 67dc68630ba08a7c4ce66ba7e68f84f5c4d16ff5
Author: amory <[email protected]>
AuthorDate: Fri May 19 17:43:36 2023 +0800
[Improve](complex-type)improve array/map/struct creating and function with
decimalv3 (#19830)
---
.../main/java/org/apache/doris/catalog/Type.java | 41 ++++++++++++++++++++++
.../apache/doris/analysis/FunctionCallExpr.java | 29 +++++++++++----
.../java/org/apache/doris/catalog/Function.java | 2 +-
.../array_functions/test_array_with_scale_type.out | 4 +--
4 files changed, 66 insertions(+), 10 deletions(-)
diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
index 3de0eadea6..48228a6c06 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
@@ -199,6 +199,9 @@ public abstract class Type {
mapSubTypes.add(FLOAT);
mapSubTypes.add(DOUBLE);
mapSubTypes.add(DECIMALV2);
+ mapSubTypes.add(DECIMAL32); // same DEFAULT_DECIMALV3
+ mapSubTypes.add(DECIMAL64);
+ mapSubTypes.add(DECIMAL128);
mapSubTypes.add(DATE);
mapSubTypes.add(DATETIME);
mapSubTypes.add(DATEV2);
@@ -214,6 +217,9 @@ public abstract class Type {
structSubTypes.add(FLOAT);
structSubTypes.add(DOUBLE);
structSubTypes.add(DECIMALV2);
+ structSubTypes.add(DECIMAL32); // same DEFAULT_DECIMALV3
+ structSubTypes.add(DECIMAL64);
+ structSubTypes.add(DECIMAL128);
structSubTypes.add(DATE);
structSubTypes.add(DATETIME);
structSubTypes.add(DATEV2);
@@ -341,6 +347,41 @@ public abstract class Type {
return isScalarType(PrimitiveType.DECIMALV2);
}
+ public boolean typeContainsPrecision() {
+ if (PrimitiveType.typeWithPrecision.contains(this.getPrimitiveType()))
{
+ return true;
+ } else if (isStructType()) {
+ for (StructField field : ((StructType) this).getFields()) {
+ if
(PrimitiveType.typeWithPrecision.contains(field.getType().getPrimitiveType())) {
+ return true;
+ }
+ }
+ } else if (isMapType()) {
+ return PrimitiveType.typeWithPrecision.contains(((MapType)
this).getKeyType().getPrimitiveType())
+ || PrimitiveType.typeWithPrecision.contains(((MapType)
this).getValueType().getPrimitiveType());
+ } else if (isArrayType()) {
+ return PrimitiveType.typeWithPrecision.contains(((ArrayType)
this).getItemType().getPrimitiveType());
+ }
+ return false;
+ }
+
+ public boolean isDecimalV3OrContainsDecimalV3() {
+ if (isDecimalV3()) {
+ return true;
+ } else if (isStructType()) {
+ for (StructField field : ((StructType) this).getFields()) {
+ if (field.getType().isDecimalV3()) {
+ return true;
+ }
+ }
+ } else if (isMapType()) {
+ return ((MapType) this).getKeyType().isDecimalV3() || ((MapType)
this).getValueType().isDecimalV3();
+ } else if (isArrayType()) {
+ return ((ArrayType) this).getItemType().isDecimalV3();
+ }
+ return false;
+ }
+
public boolean isDecimalV3() {
return isScalarType(PrimitiveType.DECIMAL32) ||
isScalarType(PrimitiveType.DECIMAL64)
|| isScalarType(PrimitiveType.DECIMAL128);
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 df18e17880..f138426a1b 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
@@ -1654,7 +1654,7 @@ public class FunctionCallExpr extends Expr {
&& ((ArrayType)
args[ix]).getItemType().isDecimalV3()))) {
continue;
} else if (!argTypes[i].matchesType(args[ix])
- && (!fn.getReturnType().isDecimalV3()
+ &&
(!fn.getReturnType().isDecimalV3OrContainsDecimalV3()
|| (argTypes[i].isValid() &&
!argTypes[i].isDecimalV3() && args[ix].isDecimalV3()))) {
uncheckedCastChild(args[ix], i);
}
@@ -1748,14 +1748,28 @@ public class FunctionCallExpr extends Expr {
this.type = children.get(1).getType();
}
} else if (fnName.getFunction().equalsIgnoreCase("named_struct")) {
- List<String> fieldNames = Lists.newArrayList();
+ ArrayList<StructField> newFields = Lists.newArrayList();
+ ArrayList<StructField> originFields = ((StructType)
type).getFields();
+ for (int i = 0; i < children.size() && i + 1 < children.size(); i
+= 2) {
+ Type fieldType = originFields.get(i + i >> 2).getType();
+ if (fieldType.isDecimalV3() || fieldType.isDatetimeV2()) {
+ fieldType = children.get(i + 1).type;
+ }
+ StringLiteral nameLiteral = (StringLiteral) children.get(i);
+ newFields.add(new StructField(nameLiteral.getStringValue(),
fieldType));
+ }
+ this.type = new StructType(newFields);
+ } else if (fnName.getFunction().equalsIgnoreCase("struct")) {
+ ArrayList<StructField> newFields = Lists.newArrayList();
+ ArrayList<StructField> originFields = ((StructType)
type).getFields();
for (int i = 0; i < children.size(); i++) {
- if ((i & 1) == 0) {
- StringLiteral nameLiteral = (StringLiteral)
children.get(i);
- fieldNames.add(nameLiteral.getStringValue());
+ Type fieldType = originFields.get(i).getType();
+ if (originFields.get(i).getType().isDecimalV3() ||
originFields.get(i).getType().isDatetimeV2()) {
+ fieldType = children.get(i).type;
}
+ newFields.add(new StructField(fieldType));
}
- this.type = ((StructType) type).replaceFieldsWithNames(fieldNames);
+ this.type = new StructType(newFields);
} else if (fnName.getFunction().equalsIgnoreCase("array_distinct") ||
fnName.getFunction()
.equalsIgnoreCase("array_remove") ||
fnName.getFunction().equalsIgnoreCase("array_sort")
|| fnName.getFunction().equalsIgnoreCase("array_reverse_sort")
@@ -1772,7 +1786,8 @@ public class FunctionCallExpr extends Expr {
|| fnName.getFunction().equalsIgnoreCase("array_shuffle")
|| fnName.getFunction().equalsIgnoreCase("shuffle")
|| fnName.getFunction().equalsIgnoreCase("array_except")
- || fnName.getFunction().equalsIgnoreCase("array_concat")) {
+ || fnName.getFunction().equalsIgnoreCase("array_concat")
+ || fnName.getFunction().equalsIgnoreCase("array_apply")) {
if (children.size() > 0) {
this.type = children.get(0).getType();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
index 0ae8247579..f4d65bc593 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
@@ -523,7 +523,7 @@ public class Function implements Writable {
}
// For types with different precisions and scales, return type only
indicates a type with default
// precision and scale so we need to transform it to the correct type.
- if
(PrimitiveType.typeWithPrecision.contains(realReturnType.getPrimitiveType())) {
+ if (realReturnType.typeContainsPrecision()) {
fn.setRetType(realReturnType.toThrift());
} else {
fn.setRetType(getReturnType().toThrift());
diff --git
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
index 56a04d45bb..294fe7f226 100644
---
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
+++
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
@@ -91,8 +91,8 @@
[]
-- !select --
-[2022-12-01 22:23:24, 2022-12-01 23:23:24]
-[2022-12-02 22:23:24, 2022-12-02 23:23:24]
+[2022-12-01 22:23:24.999, 2022-12-01 23:23:24.999]
+[2022-12-02 22:23:24.999, 2022-12-02 23:23:24.999]
-- !select --
\N
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]