From 2fc18bfe06224ec5014669fb92ea151f0c76350b Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Fri, 23 Feb 2024 12:40:43 -0800 Subject: [PATCH] fix bug with expression virtual column indexes on missing columns for expressions that turn null values into not null values --- .../java/org/apache/druid/math/expr/Expr.java | 5 +++++ .../druid/segment/filter/BaseFilterTest.java | 1 + .../druid/segment/filter/EqualityFilterTests.java | 15 +++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Expr.java b/processing/src/main/java/org/apache/druid/math/expr/Expr.java index d118bf475b88..43d669081c06 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Expr.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Expr.java @@ -207,6 +207,11 @@ default ColumnIndexSupplier asColumnIndexSupplier( final ColumnIndexSupplier delegateIndexSupplier = columnIndexSelector.getIndexSupplier(column); if (delegateIndexSupplier == null) { + // if the column doesn't exist, check to see if the expression evaluates to a non-null result... if so, we might + // need to make a value matcher anyway + if (eval(InputBindings.nilBindings()).valueOrDefault() != null) { + return NoIndexesColumnIndexSupplier.getInstance(); + } return null; } final DictionaryEncodedValueIndex delegateRawIndex = delegateIndexSupplier.as( diff --git a/processing/src/test/java/org/apache/druid/segment/filter/BaseFilterTest.java b/processing/src/test/java/org/apache/druid/segment/filter/BaseFilterTest.java index f4ecad4485bc..a907bc7cd02d 100644 --- a/processing/src/test/java/org/apache/druid/segment/filter/BaseFilterTest.java +++ b/processing/src/test/java/org/apache/druid/segment/filter/BaseFilterTest.java @@ -152,6 +152,7 @@ public abstract class BaseFilterTest extends InitializedNullHandlingTest new ExpressionVirtualColumn("vdim3-concat", "dim3 + dim3", ColumnType.LONG, TestExprMacroTable.INSTANCE), new ExpressionVirtualColumn("vdim2-offset", "array_offset(dim2, 1)", ColumnType.STRING, TestExprMacroTable.INSTANCE), new ExpressionVirtualColumn("nestedArrayLong", "array(arrayLong)", ColumnType.ofArray(ColumnType.LONG_ARRAY), TestExprMacroTable.INSTANCE), + new ExpressionVirtualColumn("fake-nvl", "nvl(fake, 'hello')", ColumnType.STRING, TestExprMacroTable.INSTANCE), new ListFilteredVirtualColumn("allow-dim0", DefaultDimensionSpec.of("dim0"), ImmutableSet.of("3", "4"), true), new ListFilteredVirtualColumn("deny-dim0", DefaultDimensionSpec.of("dim0"), ImmutableSet.of("3", "4"), false), new ListFilteredVirtualColumn("allow-dim2", DefaultDimensionSpec.of("dim2"), ImmutableSet.of("a"), true), diff --git a/processing/src/test/java/org/apache/druid/segment/filter/EqualityFilterTests.java b/processing/src/test/java/org/apache/druid/segment/filter/EqualityFilterTests.java index 9c2bd90071c5..78b40ea43d7d 100644 --- a/processing/src/test/java/org/apache/druid/segment/filter/EqualityFilterTests.java +++ b/processing/src/test/java/org/apache/druid/segment/filter/EqualityFilterTests.java @@ -124,6 +124,7 @@ public void testSingleValueVirtualStringColumnWithoutNulls() assertFilterMatches(new EqualityFilter("vdim0", ColumnType.LONG, 1L, null), ImmutableList.of("1")); } + @Test public void testListFilteredVirtualColumn() { @@ -407,6 +408,20 @@ public void testSingleValueVirtualStringColumnWithNulls() } } + + @Test + public void testSingleValueVirtualStringColumnMissingColumnCoalesce() + { + assertFilterMatches( + new EqualityFilter("fake-nvl", ColumnType.STRING, "0", null), + ImmutableList.of() + ); + assertFilterMatches( + new EqualityFilter("fake-nvl", ColumnType.STRING, "hello", null), + ImmutableList.of("0", "1", "2", "3", "4", "5") + ); + } + @Test public void testMultiValueStringColumn() {