This is an automated email from the ASF dual-hosted git repository. starocean999 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 8140fc737e [Fix](inverted index) fix bug when match condition in hash join (#23105) 8140fc737e is described below commit 8140fc737eef7bfb76045ffd20904d8701d3b8ef Author: airborne12 <airborn...@gmail.com> AuthorDate: Wed Aug 23 17:48:31 2023 +0800 [Fix](inverted index) fix bug when match condition in hash join (#23105) * [Fix](inverted index) fix bug when match condition in hash join --- .../java/org/apache/doris/analysis/SlotRef.java | 4 ++ .../glue/translator/ExpressionTranslator.java | 52 +++++++++++++++------- .../glue/translator/PhysicalPlanTranslator.java | 21 ++++++--- .../glue/translator/PlanTranslatorContext.java | 1 + .../inverted_index_p1/tpcds_sf1_index/sql/q100.out | 8 ++++ .../tpcds_sf1_index/ddl/web_site.sql | 2 +- .../inverted_index_p1/tpcds_sf1_index/sql/q100.sql | 14 ++++++ 7 files changed, 77 insertions(+), 25 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java index de0cb93b60..0bb2a37cdb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java @@ -480,6 +480,10 @@ public class SlotRef extends Expr { this.table = table; } + public TableIf getTableDirect() { + return this.table; + } + public TableIf getTable() { if (desc == null && table != null) { return table; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java index a67513d0f0..7b5a13e73e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java @@ -31,6 +31,7 @@ import org.apache.doris.analysis.FunctionCallExpr; import org.apache.doris.analysis.FunctionName; import org.apache.doris.analysis.FunctionParams; import org.apache.doris.analysis.IndexDef; +import org.apache.doris.analysis.InvertedIndexUtil; import org.apache.doris.analysis.IsNullPredicate; import org.apache.doris.analysis.MatchPredicate; import org.apache.doris.analysis.OrderByElement; @@ -169,23 +170,39 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra NullableMode.DEPEND_ON_ARGUMENT); } + private OlapTable getOlapTableFromSlotDesc(SlotDescriptor slotDesc) { + if (slotDesc != null && slotDesc.isScanSlot()) { + TupleDescriptor slotParent = slotDesc.getParent(); + return (OlapTable) slotParent.getTable(); + } + return null; + } + + private OlapTable getOlapTableDirectly(SlotRef left) { + if (left.getTableDirect() instanceof OlapTable) { + return (OlapTable) left.getTableDirect(); + } + return null; + } + @Override public Expr visitMatch(Match match, PlanTranslatorContext context) { - String invertedIndexParser = null; - String invertedIndexParserMode = null; + String invertedIndexParser = InvertedIndexUtil.INVERTED_INDEX_PARSER_UNKNOWN; + String invertedIndexParserMode = InvertedIndexUtil.INVERTED_INDEX_PARSER_FINE_GRANULARITY; SlotRef left = (SlotRef) match.left().accept(this, context); - SlotDescriptor slotDesc = left.getDesc(); - if (slotDesc != null && slotDesc.isScanSlot()) { - TupleDescriptor slotParent = slotDesc.getParent(); - OlapTable olapTbl = (OlapTable) slotParent.getTable(); - if (olapTbl == null) { - throw new AnalysisException("slotRef in matchExpression failed to get OlapTable"); - } - List<Index> indexes = olapTbl.getIndexes(); + OlapTable olapTbl = Optional.ofNullable(getOlapTableFromSlotDesc(left.getDesc())) + .orElse(getOlapTableDirectly(left)); + + if (olapTbl == null) { + throw new AnalysisException("slotRef in matchExpression failed to get OlapTable"); + } + + List<Index> indexes = olapTbl.getIndexes(); + if (indexes != null) { for (Index index : indexes) { if (index.getIndexType() == IndexDef.IndexType.INVERTED) { List<String> columns = index.getColumns(); - if (left.getColumnName().equals(columns.get(0))) { + if (columns != null && !columns.isEmpty() && left.getColumnName().equals(columns.get(0))) { invertedIndexParser = index.getInvertedIndexParser(); invertedIndexParserMode = index.getInvertedIndexParserMode(); break; @@ -193,14 +210,15 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra } } } + MatchPredicate.Operator op = match.op(); return new MatchPredicate(op, - match.left().accept(this, context), - match.right().accept(this, context), - match.getDataType().toCatalogDataType(), - NullableMode.DEPEND_ON_ARGUMENT, - invertedIndexParser, - invertedIndexParserMode); + match.left().accept(this, context), + match.right().accept(this, context), + match.getDataType().toCatalogDataType(), + NullableMode.DEPEND_ON_ARGUMENT, + invertedIndexParser, + invertedIndexParserMode); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index 2a5ba6474e..5a83a7acf4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -1130,7 +1130,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, leftSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, leftSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); if (hashOutputSlotReferenceMap.get(sf.getExprId()) != null) { hashJoinNode.addSlotIdToHashOutputSlotIds(leftSlotDescriptor.getId()); hashJoinNode.getHashOutputExprSlotIdMap().put(sf.getExprId(), leftSlotDescriptor.getId()); @@ -1150,7 +1151,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, rightSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, rightSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); if (hashOutputSlotReferenceMap.get(sf.getExprId()) != null) { hashJoinNode.addSlotIdToHashOutputSlotIds(rightSlotDescriptor.getId()); hashJoinNode.getHashOutputExprSlotIdMap().put(sf.getExprId(), rightSlotDescriptor.getId()); @@ -1169,7 +1171,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, leftSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, leftSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); if (hashOutputSlotReferenceMap.get(sf.getExprId()) != null) { hashJoinNode.addSlotIdToHashOutputSlotIds(leftSlotDescriptor.getId()); hashJoinNode.getHashOutputExprSlotIdMap().put(sf.getExprId(), leftSlotDescriptor.getId()); @@ -1187,7 +1190,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, rightSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, rightSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); if (hashOutputSlotReferenceMap.get(sf.getExprId()) != null) { hashJoinNode.addSlotIdToHashOutputSlotIds(rightSlotDescriptor.getId()); hashJoinNode.getHashOutputExprSlotIdMap().put(sf.getExprId(), rightSlotDescriptor.getId()); @@ -1355,7 +1359,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, leftSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, leftSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); } leftIntermediateSlotDescriptor.add(sd); } @@ -1369,7 +1374,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla // TODO: temporary code for two phase read, should remove it after refactor sd = context.getDescTable().copySlotDescriptor(intermediateDescriptor, rightSlotDescriptor); } else { - sd = context.createSlotDesc(intermediateDescriptor, sf); + sd = context.createSlotDesc(intermediateDescriptor, sf, rightSlotDescriptor.getParent().getTable()); + //sd = context.createSlotDesc(intermediateDescriptor, sf); } rightIntermediateSlotDescriptor.add(sd); } @@ -1533,7 +1539,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla if (requiredByProjectSlotIdSet.size() != requiredSlotIdSet.size() || new HashSet<>(projectionExprs).size() != projectionExprs.size() || projectionExprs.stream().anyMatch(expr -> !(expr instanceof SlotRef))) { - projectionTuple = generateTupleDesc(slots, null, context); + projectionTuple = generateTupleDesc(slots, + ((ScanNode) inputPlanNode).getTupleDesc().getTable(), context); inputPlanNode.setProjectList(projectionExprs); inputPlanNode.setOutputTupleDesc(projectionTuple); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java index a9c9dae012..1c176da409 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java @@ -210,6 +210,7 @@ public class PlanTranslatorContext { } else { slotRef = new SlotRef(slotDescriptor); } + slotRef.setTable(table); slotRef.setLabel(slotReference.getName()); this.addExprIdSlotRefPair(slotReference.getExprId(), slotRef); slotDescriptor.setIsNullable(slotReference.nullable()); diff --git a/regression-test/data/inverted_index_p1/tpcds_sf1_index/sql/q100.out b/regression-test/data/inverted_index_p1/tpcds_sf1_index/sql/q100.out new file mode 100644 index 0000000000..fbb2285d06 --- /dev/null +++ b/regression-test/data/inverted_index_p1/tpcds_sf1_index/sql/q100.out @@ -0,0 +1,8 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q100 -- +site_0 144200 +site_1 519 +site_2 539 +site_3 504 +site_4 563 + diff --git a/regression-test/suites/inverted_index_p1/tpcds_sf1_index/ddl/web_site.sql b/regression-test/suites/inverted_index_p1/tpcds_sf1_index/ddl/web_site.sql index b6f930a728..640926c35a 100644 --- a/regression-test/suites/inverted_index_p1/tpcds_sf1_index/ddl/web_site.sql +++ b/regression-test/suites/inverted_index_p1/tpcds_sf1_index/ddl/web_site.sql @@ -28,7 +28,7 @@ CREATE TABLE IF NOT EXISTS web_site ( INDEX web_site_sk_idx(web_site_sk) USING INVERTED COMMENT "web_site_sk index", INDEX web_site_id_idx(web_site_id) USING INVERTED COMMENT "web_site_id index", INDEX web_rec_start_date_idx(web_rec_start_date) USING INVERTED COMMENT "web_rec_start_date index", - INDEX web_name_idx(web_name) USING INVERTED COMMENT "web_name index", + INDEX web_name_idx(web_name) USING INVERTED PROPERTIES("parser"="unicode") COMMENT "web_name index", INDEX web_class_idx(web_class) USING INVERTED COMMENT "web_class index", INDEX web_manager_idx(web_manager) USING INVERTED PROPERTIES("parser"="standard") COMMENT "web_manager index", INDEX web_market_manager_idx(web_market_manager) USING INVERTED PROPERTIES("parser"="none") COMMENT "web_market_manager index", diff --git a/regression-test/suites/inverted_index_p1/tpcds_sf1_index/sql/q100.sql b/regression-test/suites/inverted_index_p1/tpcds_sf1_index/sql/q100.sql new file mode 100644 index 0000000000..8653806f9e --- /dev/null +++ b/regression-test/suites/inverted_index_p1/tpcds_sf1_index/sql/q100.sql @@ -0,0 +1,14 @@ +SELECT + t1.web_name, + COUNT(t1.web_name) AS count +FROM + web_site t1 +LEFT JOIN + web_sales t2 ON t1.web_site_sk = t2.ws_web_site_sk +WHERE + t1.web_name MATCH 'site_0' + OR t2.ws_item_sk > 17934 +GROUP BY + t1.web_name +ORDER BY + t1.web_name; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org