This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new 1237a436994 branch-4.1: [fix](reverted index) Validate nested variant
MATCH predicates #66207 (#66394)
1237a436994 is described below
commit 1237a436994e069649ded0686d9e2a8ef552a311
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Aug 4 19:08:46 2026 +0800
branch-4.1: [fix](reverted index) Validate nested variant MATCH predicates
#66207 (#66394)
Cherry-picked from #66207
---------
Co-authored-by: lihangyu <[email protected]>
---
.../rules/rewrite/CheckMatchExpression.java | 26 ++++++++++------------
.../rules/rewrite/CheckMatchExpressionTest.java | 14 ++++++++++++
.../search/test_disable_root_variant_match.groovy | 22 +++++++++++++++---
3 files changed, 45 insertions(+), 17 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpression.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpression.java
index 8f0ad8706f3..c5923ab80da 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpression.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpression.java
@@ -47,20 +47,18 @@ public class CheckMatchExpression extends
OneRewriteRuleFactory {
private Plan checkChildren(LogicalFilter<? extends Plan> filter) {
List<Expression> expressions = filter.getExpressions();
- for (Expression expr : expressions) {
- if (expr instanceof Match) {
- Match matchExpression = (Match) expr;
- SlotReference slotReference =
getSlotFromSlotCastOrAliasChain(matchExpression.left());
- if (slotReference == null
- || !(matchExpression.right() instanceof Literal)) {
- throw new AnalysisException(String.format("Only support
match left operand is SlotRef,"
- + " right operand is Literal. But meet expression
%s", matchExpression));
- }
- if (slotReference.getDataType().isVariantType() &&
!slotReference.hasSubColPath()) {
- throw new AnalysisException(String.format("VARIANT root
column does not support MATCH predicates. "
- + "Please query a subcolumn instead, for
example %s['field'] MATCH 'xxx'",
- slotReference.getName()));
- }
+ List<Match> matchExpressions =
ExpressionUtils.collectToList(expressions, Match.class::isInstance);
+ for (Match matchExpression : matchExpressions) {
+ SlotReference slotReference =
getSlotFromSlotCastOrAliasChain(matchExpression.left());
+ if (slotReference == null
+ || !(matchExpression.right() instanceof Literal)) {
+ throw new AnalysisException(String.format("Only support match
left operand is SlotRef,"
+ + " right operand is Literal. But meet expression %s",
matchExpression));
+ }
+ if (slotReference.getDataType().isVariantType() &&
!slotReference.hasSubColPath()) {
+ throw new AnalysisException(String.format("VARIANT root column
does not support MATCH predicates. "
+ + "Please query a subcolumn instead, for
example %s['field'] MATCH 'xxx'",
+ slotReference.getName()));
}
}
return filter;
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpressionTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpressionTest.java
index a127ed0e7c5..9b2cc9d9bb1 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpressionTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/CheckMatchExpressionTest.java
@@ -23,6 +23,7 @@ import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.MatchAny;
+import org.apache.doris.nereids.trees.expressions.Or;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
@@ -63,6 +64,19 @@ class CheckMatchExpressionTest {
exception.getMessage());
}
+ @Test
+ void testRejectsRootVariantMatchNestedInOr() {
+ SlotReference textSlot = new SlotReference("response_body",
StringType.INSTANCE, true);
+ SlotReference rootVariantSlot = new SlotReference("response",
VariantType.INSTANCE, true, Arrays.asList());
+ Or match = new Or(
+ new MatchAny(textSlot, new StringLiteral("doris")),
+ new MatchAny(rootVariantSlot, new StringLiteral("doris")));
+
+ AnalysisException exception =
Assertions.assertThrows(AnalysisException.class, () -> invokeCheck(match));
+ Assertions.assertTrue(exception.getMessage().contains("VARIANT root
column does not support MATCH"),
+ exception.getMessage());
+ }
+
@Test
void testRejectsCastOnRootVariantMatch() {
SlotReference rootVariantSlot = new SlotReference("response",
VariantType.INSTANCE, true, Arrays.asList());
diff --git
a/regression-test/suites/search/test_disable_root_variant_match.groovy
b/regression-test/suites/search/test_disable_root_variant_match.groovy
index f800e8e2341..affb5a82e50 100644
--- a/regression-test/suites/search/test_disable_root_variant_match.groovy
+++ b/regression-test/suites/search/test_disable_root_variant_match.groovy
@@ -26,10 +26,15 @@ suite("test_disable_root_variant_match", "p0") {
sql """
CREATE TABLE test_disable_root_variant_match_tbl (
`id` INT NOT NULL,
+ `response_body` TEXT NULL,
`response` variant<
MATCH_NAME 'msg' : string,
properties("variant_max_subcolumns_count" = "16")
> NULL,
+ INDEX idx_response_body (response_body) USING INVERTED PROPERTIES(
+ "parser" = "unicode",
+ "lower_case" = "true"
+ ),
INDEX idx_response (response) USING INVERTED PROPERTIES(
"parser" = "unicode",
"field_pattern" = "msg",
@@ -45,9 +50,9 @@ suite("test_disable_root_variant_match", "p0") {
"""
sql """INSERT INTO test_disable_root_variant_match_tbl VALUES
- (1, '{"msg": "doris community"}'),
- (2, '{"msg": "apache software"}'),
- (3, '{"msg": "doris variant index"}')
+ (1, 'doris community', '{"msg": "doris community"}'),
+ (2, 'apache software', '{"msg": "apache software"}'),
+ (3, 'doris variant index', '{"msg": "doris variant index"}')
"""
sql "sync"
@@ -63,6 +68,17 @@ suite("test_disable_root_variant_match", "p0") {
exception "VARIANT root column does not support MATCH"
}
+ test {
+ sql """
+ SELECT /*+SET_VAR(enable_common_expr_pushdown=true)*/ id
+ FROM test_disable_root_variant_match_tbl
+ WHERE response_body MATCH_ANY 'doris'
+ OR response MATCH_ANY 'doris'
+ ORDER BY id
+ """
+ exception "VARIANT root column does not support MATCH"
+ }
+
def variantSubcolumnMatchResult = sql """
SELECT /*+SET_VAR(enable_common_expr_pushdown=true)*/ id
FROM test_disable_root_variant_match_tbl
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]