This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 1263a11028c [fix](nereids)select base index if mv's data type is 
different from base table #27387 (#28405)
1263a11028c is described below

commit 1263a11028ceb074053afa009092e94a5fa6d082
Author: starocean999 <[email protected]>
AuthorDate: Fri Dec 15 18:24:50 2023 +0800

    [fix](nereids)select base index if mv's data type is different from base 
table #27387 (#28405)
---
 .../SelectMaterializedIndexWithoutAggregate.java   | 33 ++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
index 2ad22b00316..81b231a9e26 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.KeysType;
 import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.OlapTable;
+import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory;
@@ -32,12 +33,14 @@ import org.apache.doris.nereids.trees.plans.PreAggStatus;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -184,6 +187,11 @@ public class SelectMaterializedIndexWithoutAggregate 
extends AbstractSelectMater
             default:
                 throw new RuntimeException("Not supported keys type: " + 
keysType);
         }
+
+        Set<Slot> requiredSlots = new HashSet<>();
+        requiredSlots.addAll(requiredScanOutputSupplier.get());
+        requiredSlots.addAll(ExpressionUtils.getInputSlotSet(requiredExpr));
+        
requiredSlots.addAll(ExpressionUtils.getInputSlotSet(predicatesSupplier.get()));
         if (scan.getTable().isDupKeysOrMergeOnWrite()) {
             // Set pre-aggregation to `on` to keep consistency with legacy 
logic.
             List<MaterializedIndex> candidates = scan
@@ -192,6 +200,9 @@ public class SelectMaterializedIndexWithoutAggregate 
extends AbstractSelectMater
                             scan, requiredScanOutputSupplier.get(), 
requiredExpr, predicatesSupplier.get()))
                     .collect(Collectors.toList());
             long bestIndex = selectBestIndex(candidates, scan, 
predicatesSupplier.get());
+            // this is fail-safe for select mv
+            // select baseIndex if bestIndex's slots' data types are different 
from baseIndex
+            bestIndex = isSameDataType(scan, bestIndex, requiredSlots) ? 
bestIndex : baseIndexId;
             return scan.withMaterializedIndexSelected(PreAggStatus.on(), 
bestIndex);
         } else {
             final PreAggStatus preAggStatus;
@@ -219,12 +230,30 @@ public class SelectMaterializedIndexWithoutAggregate 
extends AbstractSelectMater
                 // `candidates` only have base index.
                 return scan.withMaterializedIndexSelected(preAggStatus, 
baseIndexId);
             } else {
-                return scan.withMaterializedIndexSelected(preAggStatus,
-                        selectBestIndex(candidates, scan, 
predicatesSupplier.get()));
+                long bestIndex = selectBestIndex(candidates, scan, 
predicatesSupplier.get());
+                // this is fail-safe for select mv
+                // select baseIndex if bestIndex's slots' data types are 
different from baseIndex
+                bestIndex = isSameDataType(scan, bestIndex, requiredSlots) ? 
bestIndex : baseIndexId;
+                return scan.withMaterializedIndexSelected(preAggStatus, 
bestIndex);
             }
         }
     }
 
+    private boolean isSameDataType(LogicalOlapScan scan, long selectIndex, 
Set<Slot> slots) {
+        if (selectIndex != scan.getTable().getBaseIndexId()) {
+            Map<String, PrimitiveType> columnTypes =
+                    
scan.getTable().getSchemaByIndexId(selectIndex).stream().collect(Collectors
+                            .toMap(Column::getNameWithoutMvPrefix, column -> 
column.getDataType()));
+            return slots.stream().allMatch(slot -> {
+                PrimitiveType dataType =
+                        columnTypes.getOrDefault(slot.getName(), 
PrimitiveType.NULL_TYPE);
+                return dataType == PrimitiveType.NULL_TYPE
+                        || dataType == 
slot.getDataType().toCatalogDataType().getPrimitiveType();
+            });
+        }
+        return true;
+    }
+
     private boolean indexHasAggregate(MaterializedIndex index, LogicalOlapScan 
scan) {
         return scan.getTable().getSchemaByIndexId(index.getId())
                 .stream()


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

Reply via email to