From f974fccff96f293d0d1df16d756747406682e280 Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Wed, 29 Nov 2023 16:49:19 -0800 Subject: [PATCH] fix --- .../expression/builtin/ArrayContainsOperatorConversion.java | 5 +++++ .../expression/builtin/ArrayOverlapOperatorConversion.java | 5 +++++ .../apache/druid/sql/calcite/CalciteNestedDataQueryTest.java | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayContainsOperatorConversion.java b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayContainsOperatorConversion.java index d0083c157297..9036d7e406d6 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayContainsOperatorConversion.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayContainsOperatorConversion.java @@ -154,6 +154,11 @@ public DimFilter toDruidFilter( ExprEval exprEval = expr.eval(InputBindings.nilBindings()); if (exprEval.isArray()) { final Object[] arrayElements = exprEval.asArray(); + if (arrayElements.length == 0) { + // this isn't likely possible today because array constructor function does not accept empty argument list + // but just in case, return null + return null; + } final List filters = new ArrayList<>(arrayElements.length); final ColumnType elementType = ExpressionType.toColumnType(ExpressionType.elementType(exprEval.type())); for (final Object val : arrayElements) { diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayOverlapOperatorConversion.java b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayOverlapOperatorConversion.java index a840a2f6c2e9..af5c65d9f841 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayOverlapOperatorConversion.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ArrayOverlapOperatorConversion.java @@ -164,6 +164,11 @@ public DimFilter toDruidFilter( ExprEval exprEval = expr.eval(InputBindings.nilBindings()); if (exprEval.isArray()) { final Object[] arrayElements = exprEval.asArray(); + if (arrayElements.length == 0) { + // this isn't likely possible today because array constructor function does not accept empty argument list + // but just in case, return null + return null; + } final List filters = new ArrayList<>(arrayElements.length); final ColumnType elementType = ExpressionType.toColumnType(ExpressionType.elementType(exprEval.type())); for (final Object val : arrayElements) { diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java index 9c0677a0f15e..22e16f6e7e1f 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java @@ -1563,7 +1563,8 @@ public void testGroupByRootSingleTypeArrayLongNullsFilteredMore() .setDimFilter( or( new ArrayContainsElementFilter("arrayLongNulls", ColumnType.LONG, 1L, null), - expressionFilter("array_overlap(\"arrayLongNulls\",array(2,3))") + new ArrayContainsElementFilter("arrayLongNulls", ColumnType.LONG, 2L, null), + new ArrayContainsElementFilter("arrayLongNulls", ColumnType.LONG, 3L, null) ) ) .setAggregatorSpecs(aggregators(new LongSumAggregatorFactory("a0", "cnt")))