|
817 | 817 | import org.apache.doris.nereids.trees.plans.commands.use.UseCommand; |
818 | 818 | import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; |
819 | 819 | import org.apache.doris.nereids.trees.plans.logical.LogicalCTE; |
| 820 | +import org.apache.doris.nereids.trees.plans.logical.LogicalCommonHint; |
820 | 821 | import org.apache.doris.nereids.trees.plans.logical.LogicalExcept; |
821 | 822 | import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink; |
822 | 823 | import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; |
@@ -2029,12 +2030,15 @@ public LogicalPlan visitRegularQuerySpecification(RegularQuerySpecificationConte |
2029 | 2030 | return selectPlan; |
2030 | 2031 | } |
2031 | 2032 | List<ParserRuleContext> selectHintContexts = Lists.newArrayList(); |
| 2033 | + List<ParserRuleContext> commonHintContexts = Lists.newArrayList(); |
2032 | 2034 | for (Integer key : selectHintMap.keySet()) { |
2033 | 2035 | if (key > selectCtx.getStart().getStopIndex() && key < selectCtx.getStop().getStartIndex()) { |
2034 | 2036 | selectHintContexts.add(selectHintMap.get(key)); |
| 2037 | + } else { |
| 2038 | + commonHintContexts.add(selectHintMap.get(key)); |
2035 | 2039 | } |
2036 | 2040 | } |
2037 | | - return withSelectHint(selectPlan, selectHintContexts); |
| 2041 | + return withHints(selectPlan, selectHintContexts, commonHintContexts); |
2038 | 2042 | }); |
2039 | 2043 | } |
2040 | 2044 |
|
@@ -3690,82 +3694,97 @@ private List<List<String>> getTableList(List<MultipartIdentifierContext> ctx) { |
3690 | 3694 | return tableList; |
3691 | 3695 | } |
3692 | 3696 |
|
3693 | | - private LogicalPlan withSelectHint(LogicalPlan logicalPlan, List<ParserRuleContext> hintContexts) { |
3694 | | - if (hintContexts.isEmpty()) { |
| 3697 | + private LogicalPlan withHints(LogicalPlan logicalPlan, List<ParserRuleContext> selectHintContexts, |
| 3698 | + List<ParserRuleContext> commonHintContexts) { |
| 3699 | + if (selectHintContexts.isEmpty() && commonHintContexts.isEmpty()) { |
3695 | 3700 | return logicalPlan; |
3696 | 3701 | } |
3697 | | - ImmutableList.Builder<SelectHint> hints = ImmutableList.builder(); |
3698 | | - for (ParserRuleContext hintContext : hintContexts) { |
3699 | | - SelectHintContext selectHintContext = (SelectHintContext) hintContext; |
3700 | | - for (HintStatementContext hintStatement : selectHintContext.hintStatements) { |
3701 | | - if (hintStatement.USE_MV() != null) { |
3702 | | - hints.add(new SelectHintUseMv("USE_MV", getTableList(hintStatement.tableList), true)); |
3703 | | - continue; |
3704 | | - } else if (hintStatement.NO_USE_MV() != null) { |
3705 | | - hints.add(new SelectHintUseMv("NO_USE_MV", getTableList(hintStatement.tableList), false)); |
3706 | | - continue; |
3707 | | - } |
3708 | | - String hintName = hintStatement.hintName.getText().toLowerCase(Locale.ROOT); |
3709 | | - switch (hintName) { |
3710 | | - case "set_var": |
3711 | | - Map<String, Optional<String>> parameters = Maps.newLinkedHashMap(); |
3712 | | - for (HintAssignmentContext kv : hintStatement.parameters) { |
3713 | | - if (kv.key != null) { |
3714 | | - String parameterName = visitIdentifierOrText(kv.key); |
3715 | | - Optional<String> value = Optional.empty(); |
3716 | | - if (kv.constantValue != null) { |
3717 | | - Literal literal = (Literal) visit(kv.constantValue); |
3718 | | - value = Optional.ofNullable(literal.toLegacyLiteral().getStringValue()); |
3719 | | - } else if (kv.identifierValue != null) { |
3720 | | - // maybe we should throw exception when the identifierValue is quoted identifier |
3721 | | - value = Optional.ofNullable(kv.identifierValue.getText()); |
| 3702 | + LogicalPlan newPlan = logicalPlan; |
| 3703 | + if (!selectHintContexts.isEmpty()) { |
| 3704 | + ImmutableList.Builder<SelectHint> hints = ImmutableList.builder(); |
| 3705 | + for (ParserRuleContext hintContext : selectHintContexts) { |
| 3706 | + SelectHintContext selectHintContext = (SelectHintContext) hintContext; |
| 3707 | + for (HintStatementContext hintStatement : selectHintContext.hintStatements) { |
| 3708 | + if (hintStatement.USE_MV() != null) { |
| 3709 | + hints.add(new SelectHintUseMv("USE_MV", getTableList(hintStatement.tableList), true)); |
| 3710 | + continue; |
| 3711 | + } else if (hintStatement.NO_USE_MV() != null) { |
| 3712 | + hints.add(new SelectHintUseMv("NO_USE_MV", getTableList(hintStatement.tableList), false)); |
| 3713 | + continue; |
| 3714 | + } |
| 3715 | + String hintName = hintStatement.hintName.getText().toLowerCase(Locale.ROOT); |
| 3716 | + switch (hintName) { |
| 3717 | + case "set_var": |
| 3718 | + Map<String, Optional<String>> parameters = Maps.newLinkedHashMap(); |
| 3719 | + for (HintAssignmentContext kv : hintStatement.parameters) { |
| 3720 | + if (kv.key != null) { |
| 3721 | + String parameterName = visitIdentifierOrText(kv.key); |
| 3722 | + Optional<String> value = Optional.empty(); |
| 3723 | + if (kv.constantValue != null) { |
| 3724 | + Literal literal = (Literal) visit(kv.constantValue); |
| 3725 | + value = Optional.ofNullable(literal.toLegacyLiteral().getStringValue()); |
| 3726 | + } else if (kv.identifierValue != null) { |
| 3727 | + // maybe we should throw exception when the identifierValue is quoted identifier |
| 3728 | + value = Optional.ofNullable(kv.identifierValue.getText()); |
| 3729 | + } |
| 3730 | + parameters.put(parameterName, value); |
3722 | 3731 | } |
3723 | | - parameters.put(parameterName, value); |
3724 | 3732 | } |
3725 | | - } |
3726 | | - SelectHintSetVar setVar = new SelectHintSetVar(hintName, parameters); |
3727 | | - setVar.setVarOnceInSql(ConnectContext.get().getStatementContext()); |
3728 | | - hints.add(setVar); |
3729 | | - break; |
3730 | | - case "leading": |
3731 | | - List<String> leadingParameters = new ArrayList<>(); |
3732 | | - for (HintAssignmentContext kv : hintStatement.parameters) { |
3733 | | - if (kv.key != null) { |
3734 | | - String parameterName = visitIdentifierOrText(kv.key); |
3735 | | - leadingParameters.add(parameterName); |
| 3733 | + SelectHintSetVar setVar = new SelectHintSetVar(hintName, parameters); |
| 3734 | + setVar.setVarOnceInSql(ConnectContext.get().getStatementContext()); |
| 3735 | + hints.add(setVar); |
| 3736 | + break; |
| 3737 | + case "leading": |
| 3738 | + List<String> leadingParameters = new ArrayList<>(); |
| 3739 | + for (HintAssignmentContext kv : hintStatement.parameters) { |
| 3740 | + if (kv.key != null) { |
| 3741 | + String parameterName = visitIdentifierOrText(kv.key); |
| 3742 | + leadingParameters.add(parameterName); |
| 3743 | + } |
3736 | 3744 | } |
3737 | | - } |
3738 | | - hints.add(new SelectHintLeading(hintName, leadingParameters)); |
3739 | | - break; |
3740 | | - case "ordered": |
3741 | | - hints.add(new SelectHintOrdered(hintName)); |
3742 | | - break; |
3743 | | - case "use_cbo_rule": |
3744 | | - List<String> useRuleParameters = new ArrayList<>(); |
3745 | | - for (HintAssignmentContext kv : hintStatement.parameters) { |
3746 | | - if (kv.key != null) { |
3747 | | - String parameterName = visitIdentifierOrText(kv.key); |
3748 | | - useRuleParameters.add(parameterName); |
| 3745 | + hints.add(new SelectHintLeading(hintName, leadingParameters)); |
| 3746 | + break; |
| 3747 | + case "ordered": |
| 3748 | + hints.add(new SelectHintOrdered(hintName)); |
| 3749 | + break; |
| 3750 | + case "use_cbo_rule": |
| 3751 | + List<String> useRuleParameters = new ArrayList<>(); |
| 3752 | + for (HintAssignmentContext kv : hintStatement.parameters) { |
| 3753 | + if (kv.key != null) { |
| 3754 | + String parameterName = visitIdentifierOrText(kv.key); |
| 3755 | + useRuleParameters.add(parameterName); |
| 3756 | + } |
3749 | 3757 | } |
3750 | | - } |
3751 | | - hints.add(new SelectHintUseCboRule(hintName, useRuleParameters, false)); |
3752 | | - break; |
3753 | | - case "no_use_cbo_rule": |
3754 | | - List<String> noUseRuleParameters = new ArrayList<>(); |
3755 | | - for (HintAssignmentContext kv : hintStatement.parameters) { |
3756 | | - String parameterName = visitIdentifierOrText(kv.key); |
3757 | | - if (kv.key != null) { |
3758 | | - noUseRuleParameters.add(parameterName); |
| 3758 | + hints.add(new SelectHintUseCboRule(hintName, useRuleParameters, false)); |
| 3759 | + break; |
| 3760 | + case "no_use_cbo_rule": |
| 3761 | + List<String> noUseRuleParameters = new ArrayList<>(); |
| 3762 | + for (HintAssignmentContext kv : hintStatement.parameters) { |
| 3763 | + String parameterName = visitIdentifierOrText(kv.key); |
| 3764 | + if (kv.key != null) { |
| 3765 | + noUseRuleParameters.add(parameterName); |
| 3766 | + } |
3759 | 3767 | } |
3760 | | - } |
3761 | | - hints.add(new SelectHintUseCboRule(hintName, noUseRuleParameters, true)); |
3762 | | - break; |
3763 | | - default: |
3764 | | - break; |
| 3768 | + hints.add(new SelectHintUseCboRule(hintName, noUseRuleParameters, true)); |
| 3769 | + break; |
| 3770 | + default: |
| 3771 | + break; |
| 3772 | + } |
| 3773 | + } |
| 3774 | + } |
| 3775 | + newPlan = new LogicalSelectHint<>(hints.build(), newPlan); |
| 3776 | + } |
| 3777 | + if (!commonHintContexts.isEmpty()) { |
| 3778 | + for (ParserRuleContext hintContext : commonHintContexts) { |
| 3779 | + SelectHintContext commonHintContext = (SelectHintContext) hintContext; |
| 3780 | + String text = commonHintContext.hintStatement.hintName.getText(); |
| 3781 | + if (text.equalsIgnoreCase("PREAGGOPEN")) { |
| 3782 | + newPlan = new LogicalCommonHint<>(newPlan); |
| 3783 | + break; |
3765 | 3784 | } |
3766 | 3785 | } |
3767 | 3786 | } |
3768 | | - return new LogicalSelectHint<>(hints.build(), logicalPlan); |
| 3787 | + return newPlan; |
3769 | 3788 | } |
3770 | 3789 |
|
3771 | 3790 | @Override |
|
0 commit comments