You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by ro...@apache.org on 2023/05/08 06:05:12 UTC
[druid] branch master updated: Fix planning in CASE expressions with complex WHEN and ELSE expressions (#14220)
This is an automated email from the ASF dual-hosted git repository.
rohangarg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 4d8feeb279 Fix planning in CASE expressions with complex WHEN and ELSE expressions (#14220)
4d8feeb279 is described below
commit 4d8feeb279cc144998e06bd2c9ab30044a77862b
Author: Rohan Garg <77...@users.noreply.github.com>
AuthorDate: Mon May 8 11:35:04 2023 +0530
Fix planning in CASE expressions with complex WHEN and ELSE expressions (#14220)
---
.../expression/builtin/CaseOperatorConversion.java | 20 ++++----------
.../apache/druid/sql/calcite/CalciteQueryTest.java | 32 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 15 deletions(-)
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/CaseOperatorConversion.java b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/CaseOperatorConversion.java
index 45282e86fa..392a965fa1 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/CaseOperatorConversion.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/CaseOperatorConversion.java
@@ -67,7 +67,7 @@ public class CaseOperatorConversion implements SqlOperatorConversion
// at the native layer
// this conversion won't help if the condition expression is only part of then expression, like if the input
// expression to coalesce was an expression itself, but this is better than nothing
- if (druidExpressions.size() == 3) {
+ if (druidExpressions != null && druidExpressions.size() == 3) {
final DruidExpression condition = druidExpressions.get(0);
final DruidExpression thenExpression = druidExpressions.get(1);
final DruidExpression elseExpression = druidExpressions.get(2);
@@ -109,7 +109,7 @@ public class CaseOperatorConversion implements SqlOperatorConversion
// rewrite case_searched(notnull(someColumn), then, else) into better native filters
// or(then, and(else, isNull(someColumn))
- if (druidExpressions.size() == 3) {
+ if (druidExpressions != null && druidExpressions.size() == 3) {
final DruidExpression condition = druidExpressions.get(0);
final DruidExpression thenExpression = druidExpressions.get(1);
final DruidExpression elseExpression = druidExpressions.get(2);
@@ -124,15 +124,10 @@ public class CaseOperatorConversion implements SqlOperatorConversion
if (call.getOperands().get(1) instanceof RexCall) {
final RexCall thenCall = (RexCall) call.getOperands().get(1);
- final SqlOperatorConversion thenConversion = plannerContext.getPlannerToolbox()
- .operatorTable()
- .lookupOperatorConversion(thenCall.getOperator());
- if (thenConversion != null) {
- thenFilter = thenConversion.toDruidFilter(plannerContext, rowSignature, virtualColumnRegistry, thenCall);
- }
+ thenFilter = Expressions.toFilter(plannerContext, rowSignature, virtualColumnRegistry, thenCall);
}
- if (call.getOperands().get(2) instanceof RexLiteral) {
+ if (thenFilter != null && call.getOperands().get(2) instanceof RexLiteral) {
if (call.getOperands().get(2).isAlwaysTrue()) {
return new OrDimFilter(thenFilter, isNull);
} else {
@@ -141,12 +136,7 @@ public class CaseOperatorConversion implements SqlOperatorConversion
}
} else if (call.getOperands().get(2) instanceof RexCall) {
RexCall elseCall = (RexCall) call.getOperands().get(2);
- SqlOperatorConversion elseConversion = plannerContext.getPlannerToolbox()
- .operatorTable()
- .lookupOperatorConversion(elseCall.getOperator());
- if (elseConversion != null) {
- elseFilter = elseConversion.toDruidFilter(plannerContext, rowSignature, virtualColumnRegistry, elseCall);
- }
+ elseFilter = Expressions.toFilter(plannerContext, rowSignature, virtualColumnRegistry, elseCall);
}
// if either then or else filters produced a native filter (that wasn't just another expression filter)
diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
index 14d8cba123..54036f705a 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
@@ -14642,4 +14642,36 @@ public class CalciteQueryTest extends BaseCalciteQueryTest
)
);
}
+
+ @Test
+ public void testFilterWithNVLAndNotIn()
+ {
+ testQuery(
+ "select __time, dim1 from druid.foo where nvl(dim1, '') NOT IN ('a' , '')",
+ ImmutableList.of(
+ newScanQueryBuilder()
+ .intervals(querySegmentSpec(Filtration.eternity()))
+ .dataSource(new TableDataSource(CalciteTests.DATASOURCE1))
+ .context(QUERY_CONTEXT_DEFAULT)
+ .intervals(querySegmentSpec(Intervals.of(
+ "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z")))
+ .columns(ImmutableList.of("__time", "dim1"))
+ .filters(and(
+ or(
+ not(selector("dim1", "a", null)),
+ selector("dim1", null, null)
+ ),
+ not(selector("dim1", NullHandling.sqlCompatible() ? "" : null, null))
+ ))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{946771200000L, "10.1"},
+ new Object[]{946857600000L, "2"},
+ new Object[]{978307200000L, "1"},
+ new Object[]{978393600000L, "def"},
+ new Object[]{978480000000L, "abc"}
+ )
+ );
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org