This is an automated email from the ASF dual-hosted git repository.
cwylie 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 359bd63cc9 allow expression "best effort" type determination to better
handle mixed type arrays (#14438)
359bd63cc9 is described below
commit 359bd63cc99a543e65e9814fdc39718a630316e3
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Jun 16 00:02:43 2023 -0700
allow expression "best effort" type determination to better handle mixed
type arrays (#14438)
---
.../java/org/apache/druid/math/expr/ExprEval.java | 8 ++-
.../druid/math/expr/ExpressionTypeConversion.java | 71 ++++++++++++++++++----
.../java/org/apache/druid/math/expr/EvalTest.java | 11 +++-
.../org/apache/druid/math/expr/ExprEvalTest.java | 61 +++++++++++++++----
.../druid/query/scan/NestedDataScanQueryTest.java | 4 +-
.../test/resources/nested-all-types-test-data.json | 2 +-
.../sql/calcite/CalciteNestedDataQueryTest.java | 4 +-
7 files changed, 130 insertions(+), 31 deletions(-)
diff --git a/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java
b/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java
index 1786632cd3..15334ce919 100644
--- a/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java
+++ b/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java
@@ -36,6 +36,7 @@ import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
/**
* Generic result holder for evaluated {@link Expr} containing the value and
{@link ExprType} of the value to allow
@@ -183,7 +184,7 @@ public abstract class ExprEval<T>
for (Object o : val) {
if (o != null) {
ExprEval<?> eval = ExprEval.bestEffortOf(o);
- elementType =
ExpressionTypeConversion.coerceArrayTypes(elementType, eval.type());
+ elementType =
ExpressionTypeConversion.leastRestrictiveType(elementType, eval.type());
evals[i++] = eval;
} else {
evals[i++] = null;
@@ -506,6 +507,11 @@ public abstract class ExprEval<T>
return new StringExprEval(StringUtils.encodeBase64String((byte[]) val));
}
+
+ if (val instanceof Map) {
+ return ofComplex(ExpressionType.NESTED_DATA, val);
+ }
+
// is this cool?
return ofComplex(ExpressionType.UNKNOWN_COMPLEX, val);
}
diff --git
a/processing/src/main/java/org/apache/druid/math/expr/ExpressionTypeConversion.java
b/processing/src/main/java/org/apache/druid/math/expr/ExpressionTypeConversion.java
index 1221fa5500..eb0e021946 100644
---
a/processing/src/main/java/org/apache/druid/math/expr/ExpressionTypeConversion.java
+++
b/processing/src/main/java/org/apache/druid/math/expr/ExpressionTypeConversion.java
@@ -19,6 +19,7 @@
package org.apache.druid.math.expr;
+import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.Types;
import javax.annotation.Nullable;
@@ -151,8 +152,13 @@ public class ExpressionTypeConversion
return numeric(type, other);
}
+ /**
+ * {@link ColumnType#leastRestrictiveType(ColumnType, ColumnType)} but for
expression
+ * types
+ */
@Nullable
- public static ExpressionType coerceArrayTypes(@Nullable ExpressionType type,
@Nullable ExpressionType other)
+ public static ExpressionType leastRestrictiveType(@Nullable ExpressionType
type, @Nullable ExpressionType other)
+ throws Types.IncompatibleTypeException
{
if (type == null) {
return other;
@@ -160,23 +166,66 @@ public class ExpressionTypeConversion
if (other == null) {
return type;
}
-
- if (Objects.equals(type, other)) {
+ if (type.is(ExprType.COMPLEX) && other.is(ExprType.COMPLEX)) {
+ if (type.getComplexTypeName() == null) {
+ return other;
+ }
+ if (other.getComplexTypeName() == null) {
+ return type;
+ }
+ if (!Objects.equals(type, other)) {
+ throw new Types.IncompatibleTypeException(type, other);
+ }
return type;
}
+ // if either is nested data, use nested data, otherwise error
+ if (type.is(ExprType.COMPLEX) || other.is(ExprType.COMPLEX)) {
+ if (ExpressionType.NESTED_DATA.equals(type) ||
ExpressionType.NESTED_DATA.equals(other)) {
+ return ExpressionType.NESTED_DATA;
+ }
+ throw new Types.IncompatibleTypeException(type, other);
+ }
+
+ // arrays convert based on least restrictive element type
+ if (type.isArray()) {
+ if (other.equals(type.getElementType())) {
+ return type;
+ }
+ final ExpressionType commonElementType;
+ // commonElementType cannot be null if we got this far, we always return
a value unless both args are null
+ if (other.isArray()) {
+ commonElementType = leastRestrictiveType(
+ (ExpressionType) type.getElementType(),
+ (ExpressionType) other.getElementType()
+ );
- ExpressionType typeArrayType = type.isArray() ? type :
ExpressionTypeFactory.getInstance().ofArray(type);
- ExpressionType otherArrayType = other.isArray() ? other :
ExpressionTypeFactory.getInstance().ofArray(other);
+ return ExpressionTypeFactory.getInstance().ofArray(commonElementType);
+ } else {
+ commonElementType = leastRestrictiveType(
+ (ExpressionType) type.getElementType(),
+ other
+ );
+ }
+ return ExpressionTypeFactory.getInstance().ofArray(commonElementType);
+ }
+ if (other.isArray()) {
+ if (type.equals(type.getElementType())) {
+ return type;
+ }
+ final ExpressionType commonElementType;
- if (typeArrayType.getElementType().isPrimitive() &&
otherArrayType.getElementType().isPrimitive()) {
- ExpressionType newElementType = function(
- (ExpressionType) typeArrayType.getElementType(),
- (ExpressionType) otherArrayType.getElementType()
+ commonElementType = leastRestrictiveType(
+ type,
+ (ExpressionType) other.getElementType()
);
- return ExpressionTypeFactory.getInstance().ofArray(newElementType);
+ return ExpressionTypeFactory.getInstance().ofArray(commonElementType);
+ }
+ // if either argument is a string, type becomes a string
+ if (Types.is(type, ExprType.STRING) || Types.is(other, ExprType.STRING)) {
+ return ExpressionType.STRING;
}
- throw new Types.IncompatibleTypeException(type, other);
+ return numeric(type, other);
}
diff --git a/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java
b/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java
index 433d32c245..1171e0f509 100644
--- a/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java
+++ b/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java
@@ -22,6 +22,7 @@ package org.apache.druid.math.expr;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import junitparams.converters.Nullable;
+import org.apache.druid.collections.SerializablePair;
import org.apache.druid.common.config.NullHandling;
import org.apache.druid.java.util.common.IAE;
import org.apache.druid.java.util.common.StringUtils;
@@ -1383,12 +1384,18 @@ public class EvalTest extends
InitializedNullHandlingTest
new Object[] {"1.0", "2", "3", "true", "false"}
);
- // best effort of doesn't know of nested type, what happens if we have
some nested data?
assertBestEffortOf(
ImmutableMap.of("x", 1L, "y", 2L),
- ExpressionType.UNKNOWN_COMPLEX,
+ ExpressionType.NESTED_DATA,
ImmutableMap.of("x", 1L, "y", 2L)
);
+
+ SerializablePair<String, Long> someOtherComplex = new
SerializablePair<>("hello", 1234L);
+ assertBestEffortOf(
+ someOtherComplex,
+ ExpressionType.UNKNOWN_COMPLEX,
+ someOtherComplex
+ );
}
private void assertBestEffortOf(@Nullable Object val, ExpressionType
expectedType, @Nullable Object expectedValue)
diff --git
a/processing/src/test/java/org/apache/druid/math/expr/ExprEvalTest.java
b/processing/src/test/java/org/apache/druid/math/expr/ExprEvalTest.java
index ca807076b4..99acecd309 100644
--- a/processing/src/test/java/org/apache/druid/math/expr/ExprEvalTest.java
+++ b/processing/src/test/java/org/apache/druid/math/expr/ExprEvalTest.java
@@ -21,11 +21,13 @@ package org.apache.druid.math.expr;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import org.apache.druid.collections.SerializablePair;
import org.apache.druid.java.util.common.ISE;
import org.apache.druid.java.util.common.NonnullPair;
import org.apache.druid.java.util.common.StringUtils;
import org.apache.druid.segment.column.TypeStrategies;
import org.apache.druid.segment.column.TypeStrategiesTest;
+import org.apache.druid.segment.column.Types;
import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -342,35 +344,35 @@ public class ExprEvalTest extends
InitializedNullHandlingTest
coerced.rhs
);
- Map<String, Object> unknown1 = ImmutableMap.of("x", 1L, "y", 2L);
- Map<String, Object> unknown2 = ImmutableMap.of("x", 4L, "y", 5L);
- List<Map<String, Object>> listUnknownComplex = ImmutableList.of(unknown1,
unknown2);
+ Map<String, Object> nested1 = ImmutableMap.of("x", 1L, "y", 2L);
+ Map<String, Object> nested2 = ImmutableMap.of("x", 4L, "y", 5L);
+ List<Map<String, Object>> listUnknownComplex = ImmutableList.of(nested1,
nested2);
coerced = ExprEval.coerceListToArray(listUnknownComplex, false);
-
Assert.assertEquals(ExpressionTypeFactory.getInstance().ofArray(ExpressionType.UNKNOWN_COMPLEX),
coerced.lhs);
+
Assert.assertEquals(ExpressionTypeFactory.getInstance().ofArray(ExpressionType.NESTED_DATA),
coerced.lhs);
Assert.assertArrayEquals(
- new Object[]{unknown1, unknown2},
+ new Object[]{nested1, nested2},
coerced.rhs
);
- Map<String, Object> unknown3 = ImmutableMap.of("x", 5L, "y", 7L);
- Map<String, Object> unknown4 = ImmutableMap.of("x", 6L, "y", 8L);
+ Map<String, Object> nested3 = ImmutableMap.of("x", 5L, "y", 7L);
+ Map<String, Object> nested4 = ImmutableMap.of("x", 6L, "y", 8L);
List<List<Map<String, Object>>> nestedListsComplex = ImmutableList.of(
- ImmutableList.of(unknown1, unknown2),
- ImmutableList.of(unknown3, unknown4)
+ ImmutableList.of(nested1, nested2),
+ ImmutableList.of(nested3, nested4)
);
coerced = ExprEval.coerceListToArray(nestedListsComplex, false);
Assert.assertEquals(
ExpressionTypeFactory.getInstance().ofArray(
-
ExpressionTypeFactory.getInstance().ofArray(ExpressionType.UNKNOWN_COMPLEX)
+
ExpressionTypeFactory.getInstance().ofArray(ExpressionType.NESTED_DATA)
),
coerced.lhs
);
Assert.assertArrayEquals(
new Object[]{
- new Object[]{unknown1, unknown2},
- new Object[]{unknown3, unknown4}
+ new Object[]{nested1, nested2},
+ new Object[]{nested3, nested4}
},
coerced.rhs
);
@@ -395,6 +397,41 @@ public class ExprEvalTest extends
InitializedNullHandlingTest
},
coerced.rhs
);
+
+ List<List<Object>> mixedNested = ImmutableList.of(
+ ImmutableList.of("a", "b", "c"),
+ ImmutableList.of(1L, 2L, 3L),
+ ImmutableList.of(3.0, 4.0, 5.0),
+ ImmutableList.of("a", 2L, 3.0, nested1)
+ );
+ coerced = ExprEval.coerceListToArray(mixedNested, false);
+ Assert.assertEquals(
+ ExpressionTypeFactory.getInstance().ofArray(
+
ExpressionTypeFactory.getInstance().ofArray(ExpressionType.NESTED_DATA)
+ ),
+ coerced.lhs
+ );
+ Assert.assertArrayEquals(
+ new Object[]{
+ new Object[]{"a", "b", "c"},
+ new Object[]{1L, 2L, 3L},
+ new Object[]{3.0, 4.0, 5.0},
+ new Object[]{"a", 2L, 3.0, nested1}
+ },
+ coerced.rhs
+ );
+
+ List<List<Object>> mixedUnknown = ImmutableList.of(
+ ImmutableList.of("a", "b", "c"),
+ ImmutableList.of(1L, 2L, 3L),
+ ImmutableList.of(3.0, 4.0, 5.0, new SerializablePair<>("hello",
1234L)),
+ ImmutableList.of("a", 2L, 3.0, nested1)
+ );
+ Throwable t = Assert.assertThrows(
+ Types.IncompatibleTypeException.class,
+ () -> ExprEval.coerceListToArray(mixedUnknown, false)
+ );
+ Assert.assertEquals("Cannot implicitly cast [DOUBLE] to [COMPLEX]",
t.getMessage());
}
@Test
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 36e0a5d95a..2f510cae56 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
@@ -787,7 +787,7 @@ public class NestedDataScanQueryTest extends
InitializedNullHandlingTest
Assert.assertEquals(
"["
+ "[1672531200000, null, 0, 0.0, true, 51, 1, [], {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, {a=200, b={x=b,
y=1.1, z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}], 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, null, 2, 0.0, false, b, b, 2, {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, {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, 4, {}, 4, {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, {}, [], {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], "
@@ -800,7 +800,7 @@ public class NestedDataScanQueryTest extends
InitializedNullHandlingTest
Assert.assertEquals(
"["
+ "[1672531200000, null, null, null, true, 51, 1, [], {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, {a=200, b={x=b, y=1.1,
z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}], 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, , 2, null, false, b, b, 2, {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, {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, 4, {}, 4, {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, {}, [], {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], "
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 a4ff85a592..832c4de7cf 100644
--- a/processing/src/test/resources/nested-all-types-test-data.json
+++ b/processing/src/test/resources/nested-all-types-test-data.json
@@ -1,5 +1,5 @@
{"timestamp": "2023-01-01T00:00:00", "str":"a", "long":1, "double":1.0,
"bool": true, "variant": 1, "variantEmptyObj":1,
"variantEmtpyArray":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"], "arrayLong":[1, 2, 3], "arr [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"", "long":2,
"bool": false, "variant": "b", "variantEmptyObj":"b",
"variantEmtpyArray":2, "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}], "z": {"a": [5.5], "b":
false}}, "arrayString": ["a", "b", "c"], "arrayStringNulls":
[null, "b"], "arrayLong":[2, 3], [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"", "long":2,
"bool": false, "variant": "b", "variantEmptyObj":"b",
"variantEmtpyArray":2, "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"], "arrayLong":[2, 3], [...]
{"timestamp": "2023-01-01T00:00:00", "str":"null", "long":3, "double":2.0,
"variant": 3.0, "variantEmptyObj":3.3,
"variantEmtpyArray":3, "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"], "arrayLong":[1, 2, 3, 4], "arr [...]
{"timestamp": "2023-01-01T00:00:00", "str":"b", "long":4, "double":3.3,
"bool": true, "variant": "4", "variantEmptyObj":{},
"variantEmtpyArray":4, "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"], "arrayLong":[1, 4], "arr [...]
{"timestamp": "2023-01-01T00:00:00", "str":"c", "long": null, "double":4.4,
"bool": true, "variant": "hello", "variantEmptyObj":{},
"variantEmtpyArray":[], "obj":{"a": 500, "b": {"x": "e", "z": [1, 2, 3, 4]}},
"complexObj":{"x": 11, "y": [],
"z": {"a": [null], "b": false}},
"arrayString": null,
"arrayLong":[1, 2, 3], "arr [...]
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 9c17f5edb8..007bb4926d 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
@@ -5229,7 +5229,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
useDefault ?
ImmutableList.of(
new Object[]{1672531200000L, "", 0L, 0.0D, "true", "51", "1",
"[]", "{\"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}]", "", "hello",
1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1.1,\"b\":1234,\"c\":[\"a\",\"b\",\"c\"]}}",
[...]
- new Object[]{1672531200000L, "", 2L, 0.0D, "false", "b", "\"b\"",
"2", "{\"a\":200,\"b\":{\"x\":\"b\",\"y\":1.1,\"z\":[2,4,6]}}",
"{\"x\":10,\"y\":[{\"l\":[\"b\",\"b\",\"c\"],\"m\":\"b\",\"n\":2}],\"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}]", "", "hello", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1.1 [...]
+ new Object[]{1672531200000L, "", 2L, 0.0D, "false", "b", "\"b\"",
"2", "{\"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}]", "", "hello", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\ [...]
new Object[]{1672531200000L, "a", 1L, 1.0D, "true", "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\": [...]
new Object[]{1672531200000L, "b", 4L, 3.3D, "true", "4", "{}",
"4", "{\"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}]", "", "hello", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1.1,\"b\":1234,\"c\":[\"a\",\"b\",\"c\"]}}",
"[\"a\",\" [...]
new Object[]{1672531200000L, "c", 0L, 4.4D, "true", "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}]", "", "hello", 1234L, 1.234D,
"{\"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]",
[...]
@@ -5238,7 +5238,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
) :
ImmutableList.of(
new Object[]{1672531200000L, null, null, null, "true", "51", "1",
"[]", "{\"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",
1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1.1,\"b\":1234,\"c\":[\"a\",\"b\",\"c\
[...]
- new Object[]{1672531200000L, "", 2L, null, "false", "b", "\"b\"",
"2", "{\"a\":200,\"b\":{\"x\":\"b\",\"y\":1.1,\"z\":[2,4,6]}}",
"{\"x\":10,\"y\":[{\"l\":[\"b\",\"b\",\"c\"],\"m\":\"b\",\"n\":2}],\"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", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1 [...]
+ new Object[]{1672531200000L, "", 2L, null, "false", "b", "\"b\"",
"2", "{\"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", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\": [...]
new Object[]{1672531200000L, "a", 1L, 1.0D, "true", "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\": [...]
new Object[]{1672531200000L, "b", 4L, 3.3D, "true", "4", "{}",
"4", "{\"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", 1234L, 1.234D,
"{\"x\":1,\"y\":\"hello\",\"z\":{\"a\":1.1,\"b\":1234,\"c\":[\"a\",\"b\",\"c\"]}}",
"[\"a\", [...]
new Object[]{1672531200000L, "c", null, 4.4D, "true", "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", 1234L, 1.234D,
"{\"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
[...]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]