github-actions[bot] commented on code in PR #67045:
URL: https://github.com/apache/doris/pull/67045#discussion_r3838227066


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MapFromEntries.java:
##########
@@ -0,0 +1,100 @@
+// 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.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.PreferPushDownProject;
+import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
+import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
+import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.ArrayType;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.MapType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.StructField;
+import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.types.TinyIntType;
+import org.apache.doris.nereids.util.TypeCoercionUtils;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/** Construct a Map from an Array of two-field Struct entries. */
+public class MapFromEntries extends ScalarFunction
+        implements UnaryExpression, CustomSignature, PropagateNullable, 
PreferPushDownProject {
+
+    public MapFromEntries(Expression entries) {
+        super("map_from_entries", entries);
+    }
+
+    private MapFromEntries(ScalarFunctionParams functionParams) {
+        super(functionParams);
+    }
+
+    @Override
+    public MapFromEntries withChildren(List<Expression> children) {
+        Preconditions.checkArgument(children.size() == 1);
+        return new MapFromEntries(getFunctionParams(children));
+    }
+
+    @Override
+    public FunctionSignature customSignature() {
+        DataType inputType = getArgumentType(0);
+        if (inputType.isNullType()) {
+            inputType = ArrayType.of(defaultStructType());
+        }
+        if (!(inputType instanceof ArrayType)) {
+            throw new AnalysisException(
+                    "map_from_entries requires an array of structs with 
exactly two fields");
+        }
+        DataType itemType = ((ArrayType) inputType).getItemType();
+        if (itemType.isNullType()) {
+            inputType = ArrayType.of(defaultStructType());
+        } else if (!(itemType instanceof StructType)) {
+            throw new AnalysisException(
+                    "map_from_entries requires an array of structs with 
exactly two fields");
+        } else {
+            inputType = TypeCoercionUtils.replaceSpecifiedType(
+                    inputType, NullType.class, TinyIntType.INSTANCE);
+        }
+        List<StructField> fields = ((StructType) ((ArrayType) 
inputType).getItemType()).getFields();
+        if (fields.size() != 2) {
+            throw new AnalysisException(
+                    "map_from_entries requires an array of structs with 
exactly two fields");
+        }
+        MapType resultType = MapType.of(fields.get(0).getDataType(), 
fields.get(1).getDataType());
+        resultType.validateDataType();
+        return FunctionSignature.ret(resultType).args(inputType);

Review Comment:
   [P1] Preserve precision through the map_entries inverse
   
   The separate inverse path `map_from_entries(map_entries(m))` is still lossy. 
For `m MAP<DECIMALV3(38,0),DECIMALV3(38,38)>` with decimal256 disabled, 
`MapEntries` inherits the generic precision pass, combines the two independent 
MAP slots, and inserts `Cast<MAP<DECIMALV3(38,6),DECIMALV3(38,6)>>(m)` with the 
default overflow scale. Analysis then rebuilds both functions with the common 
types, but 32 fractional digits have already been discarded by that cast before 
`MapFromEntries` executes. The current inverse tests cover only INT/NULL 
shapes, so row and folded execution both miss this. Please make `MapEntries` 
preserve its concrete key/value types independently and add non-constant plus 
fold round-trip coverage, including a nested time value with a different scale. 
This is distinct from the existing `MapFromArrays` thread, which covers the 
`map_keys`/`map_values` inverse.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to