This is an automated email from the ASF dual-hosted git repository.

abhishek pushed a commit to branch 27.0.0
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/27.0.0 by this push:
     new dd3a4a4962 fixes for nested virtual column array element vector 
selectors and fixes for variant and nested variant numeric columns (#14693)
dd3a4a4962 is described below

commit dd3a4a4962147e6ab60c4824524ad76134d9642e
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Jul 28 23:11:47 2023 -0700

    fixes for nested virtual column array element vector selectors and fixes 
for variant and nested variant numeric columns (#14693)
    
    * fix issue with nested virtual column array element vector selectors when 
input is numeric array but output is non-numeric
    * add vector value selector for mixed numeric type variant and nested 
variant fields, tests
---
 .../nested/CompressedNestedDataComplexColumn.java  | 19 ++++-
 .../nested/NestedFieldDictionaryEncodedColumn.java | 82 ++++++++++++++++++++--
 .../apache/druid/segment/nested/VariantColumn.java | 76 ++++++++++++++++++++
 .../segment/virtual/NestedFieldVirtualColumn.java  | 11 +++
 .../druid/query/scan/NestedDataScanQueryTest.java  | 20 +-----
 .../timeseries/NestedDataTimeseriesQueryTest.java  | 66 +++++++++--------
 .../nested/NestedFieldColumnSelectorsTest.java     | 17 +++--
 .../test/resources/nested-all-types-test-data.json | 14 ++--
 .../sql/calcite/CalciteNestedDataQueryTest.java    | 20 +++++-
 9 files changed, 252 insertions(+), 73 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
index 4c37264560..7b0e99db5f 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
@@ -22,6 +22,7 @@ package org.apache.druid.segment.nested;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import com.google.common.primitives.Doubles;
 import org.apache.druid.collections.bitmap.ImmutableBitmap;
 import org.apache.druid.java.util.common.IAE;
@@ -822,7 +823,23 @@ public abstract class 
CompressedNestedDataComplexColumn<TStringDictionary extend
     String field = getField(path);
     int index = fields.indexOf(field);
     if (index < 0) {
-      return null;
+      if (!path.isEmpty() && path.get(path.size() - 1) instanceof 
NestedPathArrayElement) {
+        final String arrayField = getField(path.subList(0, path.size() - 1));
+        index = fields.indexOf(arrayField);
+      }
+      if (index < 0) {
+        return null;
+      }
+      Set<ColumnType> arrayTypes = 
FieldTypeInfo.convertToSet(fieldInfo.getTypes(index).getByteValue());
+      Set<ColumnType> elementTypes = 
Sets.newHashSetWithExpectedSize(arrayTypes.size());
+      for (ColumnType type : arrayTypes) {
+        if (type.isArray()) {
+          elementTypes.add((ColumnType) type.getElementType());
+        } else {
+          elementTypes.add(type);
+        }
+      }
+      return elementTypes;
     }
     return 
FieldTypeInfo.convertToSet(fieldInfo.getTypes(index).getByteValue());
   }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
index dd883efcdb..e13b86e070 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
@@ -26,8 +26,8 @@ import com.google.common.primitives.Doubles;
 import com.google.common.primitives.Floats;
 import org.apache.druid.collections.bitmap.ImmutableBitmap;
 import org.apache.druid.common.guava.GuavaUtils;
+import org.apache.druid.error.DruidException;
 import org.apache.druid.java.util.common.StringUtils;
-import org.apache.druid.java.util.common.UOE;
 import org.apache.druid.math.expr.ExprEval;
 import org.apache.druid.math.expr.ExpressionType;
 import org.apache.druid.query.extraction.ExtractionFn;
@@ -43,6 +43,7 @@ import org.apache.druid.segment.LongColumnSelector;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.segment.column.DictionaryEncodedColumn;
 import org.apache.druid.segment.column.StringUtf8DictionaryEncodedColumn;
+import org.apache.druid.segment.column.TypeSignature;
 import org.apache.druid.segment.column.Types;
 import org.apache.druid.segment.column.ValueType;
 import org.apache.druid.segment.data.ColumnarDoubles;
@@ -889,7 +890,9 @@ public class 
NestedFieldDictionaryEncodedColumn<TStringDictionary extends Indexe
               longsColumn.get(valueVector, offsets, 
offset.getCurrentVectorSize());
             }
 
-            nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+            if (nullIterator != null) {
+              nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+            }
 
             id = offset.getId();
           }
@@ -942,15 +945,84 @@ public class 
NestedFieldDictionaryEncodedColumn<TStringDictionary extends Indexe
               doublesColumn.get(valueVector, offsets, 
offset.getCurrentVectorSize());
             }
 
-            nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+            if (nullIterator != null) {
+              nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+            }
 
             id = offset.getId();
           }
         };
       }
-      throw new UOE("Cannot make vector value selector for [%s] typed nested 
field", types);
+      throw DruidException.defensive("Cannot make vector value selector for 
[%s] typed nested field", types);
+    }
+    if 
(FieldTypeInfo.convertToSet(types.getByteValue()).stream().allMatch(TypeSignature::isNumeric))
 {
+      return new BaseDoubleVectorValueSelector(offset)
+      {
+        private final double[] valueVector = new 
double[offset.getMaxVectorSize()];
+        private final int[] idVector = new int[offset.getMaxVectorSize()];
+        @Nullable
+        private boolean[] nullVector = null;
+        private int id = ReadableVectorInspector.NULL_ID;
+
+        @Nullable
+        private PeekableIntIterator nullIterator = nullBitmap != null ? 
nullBitmap.peekableIterator() : null;
+        private int offsetMark = -1;
+        @Override
+        public double[] getDoubleVector()
+        {
+          computeVectorsIfNeeded();
+          return valueVector;
+        }
+
+        @Nullable
+        @Override
+        public boolean[] getNullVector()
+        {
+          computeVectorsIfNeeded();
+          return nullVector;
+        }
+
+        private void computeVectorsIfNeeded()
+        {
+          if (id == offset.getId()) {
+            return;
+          }
+
+          if (offset.isContiguous()) {
+            if (offset.getStartOffset() < offsetMark) {
+              nullIterator = nullBitmap.peekableIterator();
+            }
+            offsetMark = offset.getStartOffset() + 
offset.getCurrentVectorSize();
+            column.get(idVector, offset.getStartOffset(), 
offset.getCurrentVectorSize());
+          } else {
+            final int[] offsets = offset.getOffsets();
+            if (offsets[offsets.length - 1] < offsetMark) {
+              nullIterator = nullBitmap.peekableIterator();
+            }
+            offsetMark = offsets[offsets.length - 1];
+            column.get(idVector, offsets, offset.getCurrentVectorSize());
+          }
+          for (int i = 0; i < offset.getCurrentVectorSize(); i++) {
+            final int globalId = dictionary.get(idVector[i]);
+            if (globalId == 0) {
+              continue;
+            }
+            if (globalId < adjustDoubleId) {
+              valueVector[i] = globalLongDictionary.get(globalId - 
adjustLongId).doubleValue();
+            } else {
+              valueVector[i] = globalDoubleDictionary.get(globalId - 
adjustDoubleId).doubleValue();
+            }
+          }
+
+          if (nullIterator != null) {
+            nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+          }
+
+          id = offset.getId();
+        }
+      };
     }
-    throw new UOE("Cannot make vector value selector for variant typed [%s] 
nested field", types);
+    throw DruidException.defensive("Cannot make vector value selector for 
variant typed [%s] nested field", types);
   }
 
   @Override
diff --git 
a/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java 
b/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
index 820527b91d..bf7cf0605a 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
@@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.IntArraySet;
 import it.unimi.dsi.fastutil.ints.IntSet;
 import org.apache.druid.collections.bitmap.ImmutableBitmap;
 import org.apache.druid.common.guava.GuavaUtils;
+import org.apache.druid.error.DruidException;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.math.expr.ExprEval;
@@ -53,11 +54,14 @@ import org.apache.druid.segment.data.ReadableOffset;
 import org.apache.druid.segment.data.SingleIndexedInt;
 import org.apache.druid.segment.filter.BooleanValueMatcher;
 import 
org.apache.druid.segment.historical.SingleValueHistoricalDimensionSelector;
+import org.apache.druid.segment.vector.BaseDoubleVectorValueSelector;
 import org.apache.druid.segment.vector.MultiValueDimensionVectorSelector;
 import org.apache.druid.segment.vector.ReadableVectorInspector;
 import org.apache.druid.segment.vector.ReadableVectorOffset;
 import org.apache.druid.segment.vector.SingleValueDimensionVectorSelector;
 import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorSelectorUtils;
+import org.apache.druid.segment.vector.VectorValueSelector;
 import org.roaringbitmap.PeekableIntIterator;
 
 import javax.annotation.Nullable;
@@ -757,6 +761,78 @@ public class VariantColumn<TStringDictionary extends 
Indexed<ByteBuffer>>
     throw new UnsupportedOperationException();
   }
 
+  @Override
+  public VectorValueSelector makeVectorValueSelector(ReadableVectorOffset 
offset)
+  {
+    if 
(FieldTypeInfo.convertToSet(variantTypes.getByteValue()).stream().allMatch(x -> 
x.isNumeric())) {
+      return new BaseDoubleVectorValueSelector(offset)
+      {
+        private final double[] valueVector = new 
double[offset.getMaxVectorSize()];
+        private final int[] idVector = new int[offset.getMaxVectorSize()];
+        @Nullable
+        private boolean[] nullVector = null;
+        private int id = ReadableVectorInspector.NULL_ID;
+
+        @Nullable
+        private PeekableIntIterator nullIterator = nullValueBitmap != null ? 
nullValueBitmap.peekableIterator() : null;
+        private int offsetMark = -1;
+        @Override
+        public double[] getDoubleVector()
+        {
+          computeVectorsIfNeeded();
+          return valueVector;
+        }
+
+        @Nullable
+        @Override
+        public boolean[] getNullVector()
+        {
+          computeVectorsIfNeeded();
+          return nullVector;
+        }
+
+        private void computeVectorsIfNeeded()
+        {
+          if (id == offset.getId()) {
+            return;
+          }
+
+          if (offset.isContiguous()) {
+            if (offset.getStartOffset() < offsetMark) {
+              nullIterator = nullValueBitmap.peekableIterator();
+            }
+            offsetMark = offset.getStartOffset() + 
offset.getCurrentVectorSize();
+            encodedValueColumn.get(idVector, offset.getStartOffset(), 
offset.getCurrentVectorSize());
+          } else {
+            final int[] offsets = offset.getOffsets();
+            if (offsets[offsets.length - 1] < offsetMark) {
+              nullIterator = nullValueBitmap.peekableIterator();
+            }
+            offsetMark = offsets[offsets.length - 1];
+            encodedValueColumn.get(idVector, offsets, 
offset.getCurrentVectorSize());
+          }
+          for (int i = 0; i < offset.getCurrentVectorSize(); i++) {
+            int dictId = idVector[i];
+            if (dictId == 0) {
+              valueVector[i] = 0.0;
+            } else if (dictId < adjustDoubleId) {
+              valueVector[i] = longDictionary.get(dictId - 
adjustLongId).doubleValue();
+            } else {
+              valueVector[i] = doubleDictionary.get(dictId - 
adjustDoubleId).doubleValue();
+            }
+          }
+
+          if (nullIterator != null) {
+            nullVector = VectorSelectorUtils.populateNullVector(nullVector, 
offset, nullIterator);
+          }
+
+          id = offset.getId();
+        }
+      };
+    }
+    throw DruidException.defensive("Cannot make vector value selector for 
variant typed [%s] column", variantTypes);
+  }
+
   @Override
   public VectorObjectSelector makeVectorObjectSelector(ReadableVectorOffset 
offset)
   {
diff --git 
a/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
index c1834e1eb0..897f71c8ff 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
@@ -54,6 +54,7 @@ import org.apache.druid.segment.column.ColumnIndexSupplier;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.segment.column.DictionaryEncodedColumn;
 import org.apache.druid.segment.column.NumericColumn;
+import org.apache.druid.segment.column.Types;
 import org.apache.druid.segment.column.ValueType;
 import org.apache.druid.segment.column.ValueTypes;
 import org.apache.druid.segment.data.IndexedInts;
@@ -524,12 +525,22 @@ public class NestedFieldVirtualColumn implements 
VirtualColumn
           leastRestrictiveType = 
ColumnType.leastRestrictiveType(leastRestrictiveType, type);
         }
       }
+      if (leastRestrictiveType != null && leastRestrictiveType.isNumeric() && 
!Types.isNumeric(expectedType)) {
+        return ExpressionVectorSelectors.castValueSelectorToObject(
+            offset,
+            columnName,
+            complexColumn.makeVectorValueSelector(parts, offset),
+            leastRestrictiveType,
+            expectedType == null ? ColumnType.STRING : expectedType
+        );
+      }
       final VectorObjectSelector objectSelector = 
complexColumn.makeVectorObjectSelector(parts, offset);
       if (leastRestrictiveType != null && leastRestrictiveType.isArray() && 
!expectedType.isArray()) {
         final ExpressionType elementType = 
ExpressionType.fromColumnTypeStrict(leastRestrictiveType.getElementType());
         final ExpressionType castTo = 
ExpressionType.fromColumnTypeStrict(expectedType);
         return makeVectorArrayToScalarObjectSelector(offset, objectSelector, 
elementType, castTo);
       }
+
       return objectSelector;
     }
     // not a nested column, but we can still do stuff if the path is the 
'root', indicated by an empty path parts
diff --git 
a/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
 
b/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
index 53bb1b11c4..b4fe9ce869 100644
--- 
a/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
@@ -785,28 +785,12 @@ public class NestedDataScanQueryTest extends 
InitializedNullHandlingTest
     Assert.assertEquals(resultsRealtime.size(), resultsSegments.size());
     if (NullHandling.replaceWithDefault()) {
       Assert.assertEquals(
-          "["
-          + "[1672531200000, null, 0, 0.0, true, 51, 1, [], [51, -35], {a=700, 
b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5}, {l=[a, 
b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null], null, 
[true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1, 
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 
3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, null, 2, 0.0, false, b, b, 2, b, {a=200, b={x=b, 
y=1.1, z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}, [1, 2, 3]], 
z={a=[5.5], b=false}}, [a, b, c], [null, b], [2, 3], null, [3.3, 4.4, 5.5], 
[999.0, null, 5.5], [null, null, 2.2], [true, true], [null, [null], []], 
[{x=3}, {x=4}], null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, 
c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], 
[{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, a, 1, 1.0, true, 1, 1, 1, 1, {a=100, b={x=a, 
y=1.1, z=[1, 2, 3, 4]}}, {x=1234, y=[{l=[a, b, c], m=a, n=1}, {l=[a, b, c], 
m=a, n=1}], z={a=[1.1, 2.2, 3.3], b=true}}, [a, b], [a, b], [1, 2, 3], [1, 
null, 3], [1.1, 2.2, 3.3], [1.1, 2.2, null], [a, 1, 2.2], [true, false, true], 
[[1, 2, null], [3, 4]], [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1, 
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 
3.3], [], {}, [null, null], [{}, {}, {}], [...]
-          + "[1672531200000, b, 4, 3.3, true, 1, {}, 4, 1, {a=400, b={x=d, 
y=1.1, z=[3, 4]}}, {x=1234, z={a=[1.1, 2.2, 3.3], b=true}}, [d, e], [b, b], [1, 
4], [1], [2.2, 3.3, 4.0], null, [a, b, c], [null, false, true], [[1, 2], [3, 
4], [5, 6, 7]], [{x=null}, {x=2}], null, hello, 1234, 1.234, {x=1, y=hello, 
z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, 
[null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, c, 0, 4.4, true, hello, {}, [], hello, {a=500, 
b={x=e, z=[1, 2, 3, 4]}}, {x=11, y=[], z={a=[null], b=false}}, null, null, [1, 
2, 3], [], [1.1, 2.2, 3.3], null, null, [false], null, [{x=1000}, {y=2000}], 
null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, 
b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, 
x=1, y=1.3}], 1], "
-          + "[1672531200000, d, 5, 5.9, false, null, a, 6, null, {a=600, 
b={x=f, y=1.1, z=[6, 7, 8, 9]}}, null, [a, b], null, null, [null, 2, 9], null, 
[999.0, 5.5, null], [a, 1, 2.2], [], [[1], [1, 2, null]], [{a=1}, {b=2}], null, 
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], 
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, 
y=1.3}], 1], "
-          + "[1672531200000, null, 3, 2.0, null, 3.0, 3.3, 3, 3.0, {a=300}, 
{x=4, y=[{l=[], m=100, n=3}, {l=[a]}, {l=[b], n=[]}], z={a=[], b=true}}, [b, 
c], [d, null, b], [1, 2, 3, 4], [1, 2, 3], [1.1, 3.3], [null, 2.2, null], [1, 
null, 1], [true, null, true], [[1], null, [1, 2, 3]], [null, {x=2}], null, 
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], 
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, 
y=1.3}], 1]"
-          + "]",
+          "[[1672531200000, null, 0, 0.0, true, 51, -0.13, 1, [], [51, -35], 
{a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5}, 
{l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null], 
null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234, 
{x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 
2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], 
[1672531200000, null, 2, 0.0, false, b [...]
           resultsSegments.get(0).getEvents().toString()
       );
     } else {
       Assert.assertEquals(
-          "["
-          + "[1672531200000, null, null, null, true, 51, 1, [], [51, -35], 
{a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5}, 
{l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null], 
null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234, 
{x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 
2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, , 2, null, false, b, b, 2, b, {a=200, b={x=b, 
y=1.1, z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}, [1, 2, 3]], 
z={a=[5.5], b=false}}, [a, b, c], [null, b], [2, 3], null, [3.3, 4.4, 5.5], 
[999.0, null, 5.5], [null, null, 2.2], [true, true], [null, [null], []], 
[{x=3}, {x=4}], null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, 
c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], 
[{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, a, 1, 1.0, true, 1, 1, 1, 1, {a=100, b={x=a, 
y=1.1, z=[1, 2, 3, 4]}}, {x=1234, y=[{l=[a, b, c], m=a, n=1}, {l=[a, b, c], 
m=a, n=1}], z={a=[1.1, 2.2, 3.3], b=true}}, [a, b], [a, b], [1, 2, 3], [1, 
null, 3], [1.1, 2.2, 3.3], [1.1, 2.2, null], [a, 1, 2.2], [true, false, true], 
[[1, 2, null], [3, 4]], [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1, 
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 
3.3], [], {}, [null, null], [{}, {}, {}], [...]
-          + "[1672531200000, b, 4, 3.3, true, 1, {}, 4, 1, {a=400, b={x=d, 
y=1.1, z=[3, 4]}}, {x=1234, z={a=[1.1, 2.2, 3.3], b=true}}, [d, e], [b, b], [1, 
4], [1], [2.2, 3.3, 4.0], null, [a, b, c], [null, false, true], [[1, 2], [3, 
4], [5, 6, 7]], [{x=null}, {x=2}], null, hello, 1234, 1.234, {x=1, y=hello, 
z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, 
[null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
-          + "[1672531200000, c, null, 4.4, true, hello, {}, [], hello, {a=500, 
b={x=e, z=[1, 2, 3, 4]}}, {x=11, y=[], z={a=[null], b=false}}, null, null, [1, 
2, 3], [], [1.1, 2.2, 3.3], null, null, [false], null, [{x=1000}, {y=2000}], 
null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, 
b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, 
x=1, y=1.3}], 1], "
-          + "[1672531200000, d, 5, 5.9, false, null, a, 6, null, {a=600, 
b={x=f, y=1.1, z=[6, 7, 8, 9]}}, null, [a, b], null, null, [null, 2, 9], null, 
[999.0, 5.5, null], [a, 1, 2.2], [], [[1], [1, 2, null]], [{a=1}, {b=2}], null, 
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], 
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, 
y=1.3}], 1], "
-          + "[1672531200000, null, 3, 2.0, null, 3.0, 3.3, 3, 3.0, {a=300}, 
{x=4, y=[{l=[], m=100, n=3}, {l=[a]}, {l=[b], n=[]}], z={a=[], b=true}}, [b, 
c], [d, null, b], [1, 2, 3, 4], [1, 2, 3], [1.1, 3.3], [null, 2.2, null], [1, 
null, 1], [true, null, true], [[1], null, [1, 2, 3]], [null, {x=2}], null, 
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], 
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, 
y=1.3}], 1]"
-          + "]",
+          "[[1672531200000, null, null, null, true, 51, -0.13, 1, [], [51, 
-35], {a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, 
n=5}, {l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, 
[null], null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 
1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], 
[1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], 
[1672531200000, , 2, null, false,  [...]
           resultsSegments.get(0).getEvents().toString()
       );
     }
diff --git 
a/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
 
b/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
index 60de2c0e23..ac63221472 100644
--- 
a/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
@@ -21,6 +21,7 @@ package org.apache.druid.query.timeseries;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.guice.NestedDataModule;
 import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.Intervals;
@@ -38,6 +39,8 @@ import org.apache.druid.query.filter.AndDimFilter;
 import org.apache.druid.query.filter.EqualityFilter;
 import org.apache.druid.query.filter.Filter;
 import org.apache.druid.query.filter.FilterTuning;
+import org.apache.druid.query.filter.NullFilter;
+import org.apache.druid.query.filter.OrDimFilter;
 import org.apache.druid.segment.Segment;
 import org.apache.druid.segment.TestHelper;
 import org.apache.druid.segment.column.ColumnType;
@@ -140,13 +143,13 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   public void testSums()
   {
     /*
-      "long":1,     "double":1.0,     "obj":{"a": 100, "b": {"x": "a", "y": 
1.1, "z": [1, 2, 3, 4]}},
-      "long":2,                       "obj":{"a": 200, "b": {"x": "b", "y": 
1.1, "z": [2, 4, 6]}},
-      "long":3,     "double":2.0,     "obj":{"a": 300},
-      "long":4,     "double":3.3,     "obj":{"a": 400, "b": {"x": "d", "y": 
1.1, "z": [3, 4]}},
-      "long": null, "double":4.4,     "obj":{"a": 500, "b": {"x": "e", "z": 
[1, 2, 3, 4]}},
-      "long":5,     "double":5.9,     "obj":{"a": 600, "b": {"x": "f", "y": 
1.1, "z": [6, 7, 8, 9]}},
-                    "double":null,    "obj":{"a": 700, "b": {"x": "g", "y": 
1.1, "z": [9, null, 9, 9]}},
+      "long":1,     "double":1.0,  "variantNumeric": 1,     "obj":{"a": 100, 
"b": {"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}},     "complexObj":{"x": 1234, ...}
+      "long":2,                    "variantNumeric": 1.1,   "obj":{"a": 200, 
"b": {"x": "b", "y": 1.1, "z": [2, 4, 6]}},        "complexObj":{"x": 10,  ... }
+      "long":3,     "double":2.0,  "variantNumeric": 1.0,   "obj":{"a": 300},  
                                                 "complexObj":{"x": 4.4, ... }
+      "long":4,     "double":3.3,                           "obj":{"a": 400, 
"b": {"x": "d", "y": 1.1, "z": [3, 4]}},           "complexObj":{"x": 1234,... }
+      "long": null, "double":4.4,  "variantNumeric": -1000, "obj":{"a": 500, 
"b": {"x": "e", "z": [1, 2, 3, 4]}},               "complexObj":{"x": 11,  ... }
+      "long":5,     "double":5.9,  "variantNumeric": 3.33,  "obj":{"a": 600, 
"b": {"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},
+                    "double":null, "variantNumeric": -0.13, "obj":{"a": 700, 
"b": {"x": "g", "y": 1.1, "z": [9, null, 9, 9]}},  "complexObj":{"x": 400, ... }
      */
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
@@ -157,12 +160,15 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
                                       new 
DoubleSumAggregatorFactory("sumDouble", "double"),
                                       new 
LongSumAggregatorFactory("sumNestedLong", "v0"),
                                       new 
DoubleSumAggregatorFactory("sumNestedDouble", "v1"),
-                                      new 
DoubleSumAggregatorFactory("sumNestedLongFromArray", "v2")
+                                      new 
DoubleSumAggregatorFactory("sumNestedLongFromArray", "v2"),
+                                      new 
DoubleSumAggregatorFactory("sumVariantNumeric", "variantNumeric"),
+                                      new 
DoubleSumAggregatorFactory("sumNestedVariantNumeric", "v3")
                                   )
                                   .virtualColumns(
                                       new NestedFieldVirtualColumn("obj", 
"$.a", "v0", ColumnType.LONG),
                                       new NestedFieldVirtualColumn("obj", 
"$.b.y", "v1", ColumnType.DOUBLE),
-                                      new NestedFieldVirtualColumn("obj", 
"$.b.z[0]", "v2", ColumnType.LONG)
+                                      new NestedFieldVirtualColumn("obj", 
"$.b.z[0]", "v2", ColumnType.LONG),
+                                      new 
NestedFieldVirtualColumn("complexObj", "$.x", "v3", ColumnType.DOUBLE)
                                   )
                                   .context(getContext())
                                   .build();
@@ -179,6 +185,8 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
                                 .put("sumNestedLong", 5600L)
                                 .put("sumNestedDouble", 11.0)
                                 .put("sumNestedLongFromArray", 44.0)
+                                .put("sumVariantNumeric", -1987.3999999999999)
+                                .put("sumNestedVariantNumeric", 5786.8)
                                 .build()
                 )
             )
@@ -190,7 +198,7 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   public void testSumsNoVectorize()
   {
     if (QueryContexts.Vectorize.FORCE.equals(vectorize)) {
-      // variant types cannot vectorize aggregators
+      // variant types cannot vectorize aggregators because string wrapper for 
numbers is not supported for vectorize
       return;
     }
     /*
@@ -236,15 +244,17 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterLong()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
                                   .filters(
-                                      new AndDimFilter(
-                                          new EqualityFilter("long", 
ColumnType.LONG, 2L, null),
-                                          new EqualityFilter("v0", 
ColumnType.LONG, 2L, null)
+                                      new OrDimFilter(
+                                        new AndDimFilter(
+                                            new EqualityFilter("long", 
ColumnType.LONG, 2L, null),
+                                            new EqualityFilter("v0", 
ColumnType.LONG, 2L, null)
+                                        ),
+                                        NullFilter.forColumn("long"),
+                                        NullFilter.forColumn("v1")
                                       )
                                   )
                                   .virtualColumns(
@@ -253,6 +263,12 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
                                           "$.",
                                           "v0",
                                           ColumnType.LONG
+                                      ),
+                                      new NestedFieldVirtualColumn(
+                                          "obj",
+                                          "$.b.z[1]",
+                                          "v1",
+                                          ColumnType.STRING
                                       )
                                   )
                                   .aggregators(new 
CountAggregatorFactory("count"))
@@ -264,7 +280,7 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
             new Result<>(
                 DateTimes.of("2023-01-01T00:00:00.000Z"),
                 new TimeseriesResultValue(
-                    ImmutableMap.of("count", 2L)
+                    ImmutableMap.of("count", NullHandling.replaceWithDefault() 
? 6L : 8L)
                 )
             )
         )
@@ -274,8 +290,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantAsString()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -312,8 +326,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantAsStringNoIndexes()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -350,8 +362,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantAsLong()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -388,8 +398,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantAsLongNoIndexes()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -426,8 +434,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantArrayAsString()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -464,8 +470,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantArrayAsDouble()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -502,8 +506,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantArrayAsArray()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -540,8 +542,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantArrayStringArray()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -575,8 +575,6 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
   @Test
   public void testFilterVariantArrayStringArrayNoIndexes()
   {
-    // this doesn't really have anything to do with nested columns
-    // just a smoke test to make sure everything else is sane
     TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
                                   .dataSource("test_datasource")
                                   
.intervals(Collections.singletonList(Intervals.ETERNITY))
diff --git 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
index 282b403ff9..86455f12c6 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
@@ -21,9 +21,9 @@ package org.apache.druid.segment.nested;
 
 import com.fasterxml.jackson.databind.Module;
 import com.google.common.collect.ImmutableList;
+import org.apache.druid.error.DruidException;
 import org.apache.druid.guice.NestedDataModule;
 import org.apache.druid.java.util.common.Intervals;
-import org.apache.druid.java.util.common.UOE;
 import org.apache.druid.java.util.common.granularity.Granularities;
 import org.apache.druid.java.util.common.guava.Sequence;
 import org.apache.druid.java.util.common.guava.Yielder;
@@ -51,6 +51,7 @@ import org.apache.druid.segment.vector.VectorCursor;
 import org.apache.druid.segment.vector.VectorObjectSelector;
 import org.apache.druid.segment.vector.VectorValueSelector;
 import org.apache.druid.segment.virtual.NestedFieldVirtualColumn;
+import org.apache.druid.testing.InitializedNullHandlingTest;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -60,7 +61,7 @@ import org.junit.rules.TemporaryFolder;
 import java.io.IOException;
 import java.util.List;
 
-public class NestedFieldColumnSelectorsTest
+public class NestedFieldColumnSelectorsTest extends InitializedNullHandlingTest
 {
   private static final String NESTED_LONG_FIELD = "long";
   private static final String NESTED_DOUBLE_FIELD = "double";
@@ -179,8 +180,12 @@ public class NestedFieldColumnSelectorsTest
     Assert.assertNotNull(doubleValueSelector);
     Assert.assertTrue(doubleValueSelector instanceof 
BaseDoubleVectorValueSelector);
 
-    Assert.assertThrows(UOE.class, () -> 
factory.makeValueSelector(NESTED_MIXED_NUMERIC_FIELD));
-    Assert.assertThrows(UOE.class, () -> 
factory.makeValueSelector(NESTED_MIXED_FIELD));
+    Assert.assertThrows(DruidException.class, () -> 
factory.makeValueSelector(NESTED_MIXED_FIELD));
+
+    VectorValueSelector mixedNumericValueSelector = factory.makeValueSelector(
+        NESTED_MIXED_NUMERIC_FIELD
+    );
+    Assert.assertTrue(mixedNumericValueSelector instanceof 
BaseDoubleVectorValueSelector);
 
     // can also make single value dimension selectors for all nested column 
types
     SingleValueDimensionVectorSelector longDimensionSelector = 
factory.makeSingleValueDimensionSelector(
@@ -193,10 +198,10 @@ public class NestedFieldColumnSelectorsTest
     );
     Assert.assertNotNull(doubleDimensionSelector);
 
-    SingleValueDimensionVectorSelector mixedNumericValueSelector = 
factory.makeSingleValueDimensionSelector(
+    SingleValueDimensionVectorSelector mixedNumericDimensionValueSelector = 
factory.makeSingleValueDimensionSelector(
         DefaultDimensionSpec.of(NESTED_MIXED_NUMERIC_FIELD)
     );
-    Assert.assertNotNull(mixedNumericValueSelector);
+    Assert.assertNotNull(mixedNumericDimensionValueSelector);
 
     SingleValueDimensionVectorSelector mixedValueSelector = 
factory.makeSingleValueDimensionSelector(
         DefaultDimensionSpec.of(NESTED_MIXED_FIELD)
diff --git a/processing/src/test/resources/nested-all-types-test-data.json 
b/processing/src/test/resources/nested-all-types-test-data.json
index e7219e42a4..34d92b52ae 100644
--- a/processing/src/test/resources/nested-all-types-test-data.json
+++ b/processing/src/test/resources/nested-all-types-test-data.json
@@ -1,7 +1,7 @@
-{"timestamp": "2023-01-01T00:00:00", "str":"a",    "long":1,     "double":1.0, 
 "bool": true,  "variant": 1,       "variantEmptyObj":1,   
"variantEmtpyArray":1,  "variantWithArrays": 1,         "obj":{"a": 100, "b": 
{"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}},    "complexObj":{"x": 1234, "y": 
[{"l": ["a", "b", "c"], "m": "a", "n": 1},{"l": ["a", "b", "c"], "m": "a", "n": 
1}], "z": {"a": [1.1, 2.2, 3.3], "b": true}},     "arrayString": ["a", "b"],    
   "arrayStringNulls": ["a", "b"],        [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"",     "long":2,                   
 "bool": false, "variant": "b",     "variantEmptyObj":"b", 
"variantEmtpyArray":2,  "variantWithArrays": "b",       "obj":{"a": 200, "b": 
{"x": "b", "y": 1.1, "z": [2, 4, 6]}},       "complexObj":{"x": 10,   "y": 
[{"l": ["b", "b", "c"], "m": "b", "n": 2}, [1, 2, 3]],                          
     "z": {"a": [5.5], "b": false}},              "arrayString": ["a", "b", 
"c"],  "arrayStringNulls": [null, "b"],       [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"null", "long":3,     "double":2.0, 
                "variant": 3.0,     "variantEmptyObj":3.3, 
"variantEmtpyArray":3,  "variantWithArrays": 3.0,       "obj":{"a": 300},       
                                           "complexObj":{"x": 4,    "y": [{"l": 
[], "m": 100, "n": 3},{"l": ["a"]}, {"l": ["b"], "n": []}],                   
"z": {"a": [], "b": true}},                  "arrayString": ["b", "c"],       
"arrayStringNulls": ["d", null, "b"],  [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"b",    "long":4,     "double":3.3, 
 "bool": true,  "variant": "1",     "variantEmptyObj":{},  
"variantEmtpyArray":4,  "variantWithArrays": "1",       "obj":{"a": 400, "b": 
{"x": "d", "y": 1.1, "z": [3, 4]}},          "complexObj":{"x": 1234,           
                                                                                
"z": {"a": [1.1, 2.2, 3.3], "b": true}},     "arrayString": ["d", "e"],       
"arrayStringNulls": ["b", "b"],        [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"c",    "long": null, "double":4.4, 
 "bool": true,  "variant": "hello", "variantEmptyObj":{},  
"variantEmtpyArray":[], "variantWithArrays": "hello",   "obj":{"a": 500, "b": 
{"x": "e", "z": [1, 2, 3, 4]}},              "complexObj":{"x": 11,   "y": [],  
                                                                                
"z": {"a": [null], "b": false}},             "arrayString": null,               
                                     [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"d",    "long":5,     "double":5.9, 
 "bool": false,                     "variantEmptyObj":"a", 
"variantEmtpyArray":6,                                  "obj":{"a": 600, "b": 
{"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},                                       
                                                                                
                                             "arrayString": ["a", "b"],       
"arrayStringNulls": null,              [...]
-{"timestamp": "2023-01-01T00:00:00", "str":null,                 
"double":null, "bool": true,  "variant": 51,      "variantEmptyObj":1,   
"variantEmtpyArray":[], "variantWithArrays": [51, -35], "obj":{"a": 700, "b": 
{"x": "g", "y": 1.1, "z": [9, null, 9, 9]}}, "complexObj":{"x": 400,  "y": 
[{"l": [null], "m": 100, "n": 5},{"l": ["a", "b", "c"], "m": "a", "n": 1}],     
     "z": {}},                                                                  
   "arrayStringNulls": ["a", "b"],        [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"a",    "long":1,     "double":1.0, 
 "bool": true,  "variant": 1,       "variantNumeric": 1,     
"variantEmptyObj":1,   "variantEmtpyArray":1,  "variantWithArrays": 1,         
"obj":{"a": 100, "b": {"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}},    
"complexObj":{"x": 1234, "y": [{"l": ["a", "b", "c"], "m": "a", "n": 1},{"l": 
["a", "b", "c"], "m": "a", "n": 1}], "z": {"a": [1.1, 2.2, 3.3], "b": true}},   
  "arrayString": ["a", "b"],       "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"",     "long":2,                   
 "bool": false, "variant": "b",     "variantNumeric": 1.1,   
"variantEmptyObj":"b", "variantEmtpyArray":2,  "variantWithArrays": "b",       
"obj":{"a": 200, "b": {"x": "b", "y": 1.1, "z": [2, 4, 6]}},       
"complexObj":{"x": 10,   "y": [{"l": ["b", "b", "c"], "m": "b", "n": 2}, [1, 2, 
3]],                               "z": {"a": [5.5], "b": false}},              
"arrayString": ["a", "b", "c"],  "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"null", "long":3,     "double":2.0, 
                "variant": 3.0,     "variantNumeric": 1.0,   
"variantEmptyObj":3.3, "variantEmtpyArray":3,  "variantWithArrays": 3.0,       
"obj":{"a": 300},                                                  
"complexObj":{"x": 4.4,  "y": [{"l": [], "m": 100, "n": 3},{"l": ["a"]}, {"l": 
["b"], "n": []}],                   "z": {"a": [], "b": true}},                 
 "arrayString": ["b", "c"],       "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"b",    "long":4,     "double":3.3, 
 "bool": true,  "variant": "1",                              
"variantEmptyObj":{},  "variantEmtpyArray":4,  "variantWithArrays": "1",       
"obj":{"a": 400, "b": {"x": "d", "y": 1.1, "z": [3, 4]}},          
"complexObj":{"x": 1234,                                                        
                                   "z": {"a": [1.1, 2.2, 3.3], "b": true}},     
"arrayString": ["d", "e"],       "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"c",    "long": null, "double":4.4, 
 "bool": true,  "variant": "hello", "variantNumeric": -1000, 
"variantEmptyObj":{},  "variantEmtpyArray":[], "variantWithArrays": "hello",   
"obj":{"a": 500, "b": {"x": "e", "z": [1, 2, 3, 4]}},              
"complexObj":{"x": 11,   "y": [],                                               
                                   "z": {"a": [null], "b": false}},             
"arrayString": null,                           [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"d",    "long":5,     "double":5.9, 
 "bool": false,                     "variantNumeric": 3.33,  
"variantEmptyObj":"a", "variantEmtpyArray":6,                                  
"obj":{"a": 600, "b": {"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},                 
                                                                                
                                                                   
"arrayString": ["a", "b"],       "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":null,                 
"double":null, "bool": true,  "variant": 51,      "variantNumeric": -0.13, 
"variantEmptyObj":1,   "variantEmtpyArray":[], "variantWithArrays": [51, -35], 
"obj":{"a": 700, "b": {"x": "g", "y": 1.1, "z": [9, null, 9, 9]}}, 
"complexObj":{"x": 400,  "y": [{"l": [null], "m": 100, "n": 5},{"l": ["a", "b", 
"c"], "m": "a", "n": 1}],          "z": {}},                                    
                                 "arrayStringN [...]
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 93e542345e..899c44b0e1 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
@@ -5646,6 +5646,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                       "variant",
                       "variantEmptyObj",
                       "variantEmtpyArray",
+                      "variantNumeric",
                       "variantWithArrays"
                   )
                   
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
@@ -5661,6 +5662,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 0.0D,
                 "true",
                 "51",
+                -0.13D,
                 "1",
                 "[]",
                 "[51,-35]",
@@ -5698,6 +5700,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 0.0D,
                 "false",
                 "b",
+                1.1D,
                 "\"b\"",
                 "2",
                 "b",
@@ -5735,6 +5738,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 1.0D,
                 "true",
                 "1",
+                1.0D,
                 "1",
                 "1",
                 "1",
@@ -5772,6 +5776,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 3.3D,
                 "true",
                 "1",
+                0.0D,
                 "{}",
                 "4",
                 "1",
@@ -5809,6 +5814,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 4.4D,
                 "true",
                 "hello",
+                -1000.0D,
                 "{}",
                 "[]",
                 "hello",
@@ -5846,6 +5852,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 5.9D,
                 "false",
                 "",
+                3.33D,
                 "\"a\"",
                 "6",
                 null,
@@ -5883,11 +5890,12 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 2.0D,
                 "",
                 "3.0",
+                1.0D,
                 "3.3",
                 "3",
                 "3.0",
                 "{\"a\":300}",
-                
"{\"x\":4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
+                
"{\"x\":4.4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
                 "[\"b\",\"c\"]",
                 "[\"d\",null,\"b\"]",
                 "[1,2,3,4]",
@@ -5922,6 +5930,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 null,
                 "true",
                 "51",
+                -0.13D,
                 "1",
                 "[]",
                 "[51,-35]",
@@ -5959,6 +5968,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 null,
                 "false",
                 "b",
+                1.1D,
                 "\"b\"",
                 "2",
                 "b",
@@ -5996,6 +6006,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 1.0D,
                 "true",
                 "1",
+                1.0D,
                 "1",
                 "1",
                 "1",
@@ -6033,6 +6044,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 3.3D,
                 "true",
                 "1",
+                null,
                 "{}",
                 "4",
                 "1",
@@ -6070,6 +6082,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 4.4D,
                 "true",
                 "hello",
+                -1000.0D,
                 "{}",
                 "[]",
                 "hello",
@@ -6107,6 +6120,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 5.9D,
                 "false",
                 null,
+                3.33D,
                 "\"a\"",
                 "6",
                 null,
@@ -6144,11 +6158,12 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                 2.0D,
                 null,
                 "3.0",
+                1.0D,
                 "3.3",
                 "3",
                 "3.0",
                 "{\"a\":300}",
-                
"{\"x\":4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
+                
"{\"x\":4.4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
                 "[\"b\",\"c\"]",
                 "[\"d\",null,\"b\"]",
                 "[1,2,3,4]",
@@ -6182,6 +6197,7 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
                     .add("double", ColumnType.DOUBLE)
                     .add("bool", ColumnType.STRING)
                     .add("variant", ColumnType.STRING)
+                    .add("variantNumeric", ColumnType.DOUBLE)
                     .add("variantEmptyObj", ColumnType.NESTED_DATA)
                     .add("variantEmtpyArray", ColumnType.LONG_ARRAY)
                     .add("variantWithArrays", ColumnType.STRING_ARRAY)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to