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 6ba10c8b6c fix bug with json_value expression array extraction (#14461)
6ba10c8b6c is described below
commit 6ba10c8b6caf1de5afd782ba70edda406466c892
Author: Clint Wylie <[email protected]>
AuthorDate: Mon Jun 26 21:02:44 2023 -0700
fix bug with json_value expression array extraction (#14461)
---
.../query/expression/NestedDataExpressions.java | 24 +++--
.../druid/segment/AutoTypeColumnIndexer.java | 2 +-
.../apache/druid/segment/column/TypeSignature.java | 6 ++
.../segment/nested/NestedDataColumnSerializer.java | 4 +-
.../nested/NestedDataColumnSerializerV4.java | 2 +-
.../druid/segment/nested/NestedPathFinder.java | 106 ++++++++-------------
.../segment/virtual/NestedFieldVirtualColumn.java | 22 +++--
.../expression/NestedDataExpressionsTest.java | 73 +++++++++++++-
.../druid/segment/nested/NestedPathFinderTest.java | 12 ---
.../builtin/NestedDataOperatorConversions.java | 2 +-
.../sql/calcite/CalciteNestedDataQueryTest.java | 2 +-
11 files changed, 155 insertions(+), 100 deletions(-)
diff --git
a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
index 7e62207111..57b81116fa 100644
---
a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
+++
b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
@@ -349,10 +349,14 @@ public class NestedDataExpressions
@Override
public ExprEval eval(ObjectBinding bindings)
{
- ExprEval input = args.get(0).eval(bindings);
- return ExprEval.bestEffortOf(
- NestedPathFinder.findLiteral(unwrap(input), parts)
- ).castTo(castTo);
+ final ExprEval input = args.get(0).eval(bindings);
+ final ExprEval valAtPath = ExprEval.bestEffortOf(
+ NestedPathFinder.find(unwrap(input), parts)
+ );
+ if (valAtPath.type().isPrimitive() ||
valAtPath.type().isPrimitiveArray()) {
+ return valAtPath.castTo(castTo);
+ }
+ return ExprEval.ofType(castTo, null);
}
@Override
@@ -382,10 +386,14 @@ public class NestedDataExpressions
@Override
public ExprEval eval(ObjectBinding bindings)
{
- ExprEval input = args.get(0).eval(bindings);
- return ExprEval.bestEffortOf(
- NestedPathFinder.findLiteral(unwrap(input), parts)
+ final ExprEval input = args.get(0).eval(bindings);
+ final ExprEval valAtPath = ExprEval.bestEffortOf(
+ NestedPathFinder.find(unwrap(input), parts)
);
+ if (valAtPath.type().isPrimitive() ||
valAtPath.type().isPrimitiveArray()) {
+ return valAtPath;
+ }
+ return ExprEval.of(null);
}
@Override
@@ -489,7 +497,7 @@ public class NestedDataExpressions
{
// we only want to return a non-null value here if the value is an
array of primitive values
ExprEval<?> eval = ExprEval.bestEffortArray(array);
- if (eval.type().isArray() &&
eval.type().getElementType().isPrimitive()) {
+ if (eval.type().isPrimitiveArray()) {
return ProcessedValue.NULL_LITERAL;
}
return null;
diff --git
a/processing/src/main/java/org/apache/druid/segment/AutoTypeColumnIndexer.java
b/processing/src/main/java/org/apache/druid/segment/AutoTypeColumnIndexer.java
index c52c15d063..3ce8b5f4ba 100644
---
a/processing/src/main/java/org/apache/druid/segment/AutoTypeColumnIndexer.java
+++
b/processing/src/main/java/org/apache/druid/segment/AutoTypeColumnIndexer.java
@@ -104,7 +104,7 @@ public class AutoTypeColumnIndexer implements
DimensionIndexer<StructuredData, S
)
{
final ExprEval<?> eval = ExprEval.bestEffortArray(array);
- if (eval.type().isArray() && eval.type().getElementType().isPrimitive())
{
+ if (eval.type().isPrimitiveArray()) {
final String fieldName =
NestedPathFinder.toNormalizedJsonPath(fieldPath);
FieldIndexer fieldIndexer = fieldIndexers.get(fieldName);
if (fieldIndexer == null) {
diff --git
a/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
b/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
index 0c35a2934f..330a2bb9d5 100644
---
a/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
+++
b/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
@@ -167,6 +167,12 @@ public interface TypeSignature<Type extends TypeDescriptor>
return getType().isArray();
}
+ @JsonIgnore
+ default boolean isPrimitiveArray()
+ {
+ return getType().isArray() && getElementType() != null &&
getElementType().isPrimitive();
+ }
+
/**
* Convert a {@link TypeSignature} into a simple string. This value can be
converted back into a {@link TypeSignature}
* with {@link Types#fromString(TypeFactory, String)}.
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializer.java
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializer.java
index 020298b1b3..3e49edc32a 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializer.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializer.java
@@ -98,7 +98,7 @@ public class NestedDataColumnSerializer extends
NestedCommonFormatColumnSerializ
if (writer != null) {
try {
final ExprEval<?> eval = ExprEval.bestEffortOf(fieldValue);
- if (eval.type().isPrimitive() || (eval.type().isArray() &&
eval.type().getElementType().isPrimitive())) {
+ if (eval.type().isPrimitive() || eval.type().isPrimitiveArray()) {
writer.addValue(rowCount, eval.value());
} else {
// behave consistently with nested column indexer, which defaults
to string
@@ -122,7 +122,7 @@ public class NestedDataColumnSerializer extends
NestedCommonFormatColumnSerializ
)
{
final ExprEval<?> eval = ExprEval.bestEffortArray(array);
- if (eval.type().isArray() && eval.type().getElementType().isPrimitive())
{
+ if (eval.type().isPrimitiveArray()) {
final GlobalDictionaryEncodedFieldColumnWriter<?> writer =
fieldWriters.get(
NestedPathFinder.toNormalizedJsonPath(fieldPath)
);
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializerV4.java
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializerV4.java
index 034c7bc64f..d33d5f68f4 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializerV4.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSerializerV4.java
@@ -90,7 +90,7 @@ public class NestedDataColumnSerializerV4 implements
GenericColumnSerializer<Str
if (writer != null) {
try {
final ExprEval<?> eval = ExprEval.bestEffortOf(fieldValue);
- if (eval.type().isPrimitive() || (eval.type().isArray() &&
eval.type().getElementType().isPrimitive())) {
+ if (eval.type().isPrimitive() || eval.type().isPrimitiveArray()) {
writer.addValue(rowCount, eval.value());
} else {
// behave consistently with nested column indexer, which defaults
to string
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/NestedPathFinder.java
b/processing/src/main/java/org/apache/druid/segment/nested/NestedPathFinder.java
index 5d0596a6cc..2fc52f88df 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/NestedPathFinder.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/NestedPathFinder.java
@@ -34,6 +34,45 @@ public class NestedPathFinder
public static final String JSON_PATH_ROOT = "$";
public static final String JQ_PATH_ROOT = ".";
+ /**
+ * Dig through a thing to find stuff
+ */
+ @Nullable
+ public static Object find(@Nullable Object data, List<NestedPathPart> path)
+ {
+ Object currentObject = data;
+ for (NestedPathPart pathPart : path) {
+ Object objectAtPath = pathPart.find(currentObject);
+ if (objectAtPath == null) {
+ return null;
+ }
+ currentObject = objectAtPath;
+ }
+ return currentObject;
+ }
+
+ /**
+ * find the list of 'keys' at some path.
+ * - if the thing at a path is an object (map), return the fields
+ * - if the thing at a path is an array (list or array), return the 0 based
element numbers
+ * - if the thing is a simple value, return null
+ */
+ @Nullable
+ public static Object[] findKeys(@Nullable Object data, List<NestedPathPart>
path)
+ {
+ Object currentObject = find(data, path);
+ if (currentObject instanceof Map) {
+ return ((Map) currentObject).keySet().toArray();
+ }
+ if (currentObject instanceof List) {
+ return IntStream.range(0, ((List)
currentObject).size()).mapToObj(Integer::toString).toArray();
+ }
+ if (currentObject instanceof Object[]) {
+ return IntStream.range(0, ((Object[])
currentObject).length).mapToObj(Integer::toString).toArray();
+ }
+ return null;
+ }
+
public static String toNormalizedJsonPath(List<NestedPathPart> paths)
{
if (paths.isEmpty()) {
@@ -305,71 +344,4 @@ public class NestedPathFinder
{
throw InvalidInput.exception("JSONPath [%s] is invalid, %s", path,
StringUtils.format(message, args));
}
-
- /**
- * Dig through a thing to find stuff, if that stuff is a not nested itself
- */
- @Nullable
- public static String findStringLiteral(@Nullable Object data,
List<NestedPathPart> path)
- {
- Object currentObject = find(data, path);
- if (currentObject instanceof Map || currentObject instanceof List ||
currentObject instanceof Object[]) {
- return null;
- } else {
- // a literal of some sort, huzzah!
- if (currentObject == null) {
- return null;
- }
- return String.valueOf(currentObject);
- }
- }
-
- @Nullable
- public static Object findLiteral(@Nullable Object data, List<NestedPathPart>
path)
- {
- Object currentObject = find(data, path);
- if (currentObject instanceof Map || currentObject instanceof List ||
currentObject instanceof Object[]) {
- return null;
- } else {
- // a literal of some sort, huzzah!
- if (currentObject == null) {
- return null;
- }
- return currentObject;
- }
- }
-
- @Nullable
- public static Object[] findKeys(@Nullable Object data, List<NestedPathPart>
path)
- {
- Object currentObject = find(data, path);
- if (currentObject instanceof Map) {
- return ((Map) currentObject).keySet().toArray();
- }
- if (currentObject instanceof List) {
- return IntStream.range(0, ((List)
currentObject).size()).mapToObj(Integer::toString).toArray();
- }
- if (currentObject instanceof Object[]) {
- return IntStream.range(0, ((Object[])
currentObject).length).mapToObj(Integer::toString).toArray();
- }
- return null;
- }
-
- /**
- * Dig through a thing to find stuff
- */
- @Nullable
- public static Object find(@Nullable Object data, List<NestedPathPart> path)
- {
- Object currentObject = data;
- for (NestedPathPart pathPart : path) {
- Object objectAtPath = pathPart.find(currentObject);
- if (objectAtPath == null) {
- return null;
- }
- currentObject = objectAtPath;
- }
- return currentObject;
- }
-
}
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 486448c2e9..02c3d879e8 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
@@ -169,7 +169,7 @@ public class NestedFieldVirtualColumn implements
VirtualColumn
String columnName,
String path,
String outputName,
- ColumnType expectedType
+ @Nullable ColumnType expectedType
)
{
this(columnName, outputName, expectedType, null, null, path, false);
@@ -1266,8 +1266,8 @@ public class NestedFieldVirtualColumn implements
VirtualColumn
}
/**
- * Process the "raw" data to extract literals with {@link
NestedPathFinder#findLiteral(Object, List)}. Like
- * {@link RawFieldColumnSelector} but only literals and does not wrap the
results in {@link StructuredData}.
+ * Process the "raw" data to extract non-complex values. Like {@link
RawFieldColumnSelector} but does not return
+ * complex nested objects and does not wrap the results in {@link
StructuredData}.
* <p>
* This is used as a selector on realtime data when the native field columns
are not available.
*/
@@ -1312,7 +1312,7 @@ public class NestedFieldVirtualColumn implements
VirtualColumn
@Override
public boolean isNull()
{
- Object o = getObject();
+ final Object o = getObject();
return !(o instanceof Number || (o instanceof String &&
Doubles.tryParse((String) o) != null));
}
@@ -1320,8 +1320,18 @@ public class NestedFieldVirtualColumn implements
VirtualColumn
@Override
public Object getObject()
{
- StructuredData data = StructuredData.wrap(baseSelector.getObject());
- return NestedPathFinder.findLiteral(data == null ? null :
data.getValue(), parts);
+ final StructuredData data =
StructuredData.wrap(baseSelector.getObject());
+ if (data == null) {
+ return null;
+ }
+
+ final Object valAtPath = NestedPathFinder.find(data.getValue(), parts);
+ final ExprEval eval = ExprEval.bestEffortOf(valAtPath);
+ if (eval.type().isPrimitive() || eval.type().isPrimitiveArray()) {
+ return eval.valueOrDefault();
+ }
+ // not a primitive value, return null;
+ return null;
}
@Override
diff --git
a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
index afb6c9298c..06726289ce 100644
---
a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
+++
b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
@@ -36,6 +36,7 @@ import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.Assert;
import org.junit.Test;
+import java.util.Arrays;
import java.util.Map;
public class NestedDataExpressionsTest extends InitializedNullHandlingTest
@@ -64,11 +65,27 @@ public class NestedDataExpressionsTest extends
InitializedNullHandlingTest
"y", ImmutableMap.of("a", "hello", "b", "world")
);
+ private static final Map<String, Object> NESTERER = ImmutableMap.of(
+ "x",
+ ImmutableMap.of(
+ "a1", Arrays.asList(1, null, 3),
+ "a2", Arrays.asList(1.1, null, 3.3),
+ "a3", Arrays.asList("a", null, "b", "100")
+ ),
+ "y",
+ ImmutableList.of(
+ ImmutableMap.of("x", 1L, "y", 1.1),
+ ImmutableMap.of("x", 2L, "y", 2.2),
+ ImmutableMap.of("x", 3L, "y", 3.3)
+ )
+ );
+
Expr.ObjectBinding inputBindings = InputBindings.forInputSuppliers(
new ImmutableMap.Builder<String, InputBindings.InputSupplier>()
.put("nest", InputBindings.inputSupplier(ExpressionType.NESTED_DATA,
() -> NEST))
.put("nestWrapped",
InputBindings.inputSupplier(ExpressionType.NESTED_DATA, () -> new
StructuredData(NEST)))
.put("nester",
InputBindings.inputSupplier(ExpressionType.NESTED_DATA, () -> NESTER))
+ .put("nesterer",
InputBindings.inputSupplier(ExpressionType.NESTED_DATA, () -> NESTERER))
.put("string", InputBindings.inputSupplier(ExpressionType.STRING, ()
-> "abcdef"))
.put("long", InputBindings.inputSupplier(ExpressionType.LONG, () ->
1234L))
.put("double", InputBindings.inputSupplier(ExpressionType.DOUBLE, ()
-> 1.234))
@@ -144,7 +161,8 @@ public class NestedDataExpressionsTest extends
InitializedNullHandlingTest
expr = Parser.parse("json_value(nester, '$.x')", MACRO_TABLE);
eval = expr.eval(inputBindings);
- Assert.assertNull(eval.value());
+ Assert.assertArrayEquals(new Object[]{"a", "b", "c"}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.STRING_ARRAY, eval.type());
expr = Parser.parse("json_value(nester, '$.x[1]')", MACRO_TABLE);
eval = expr.eval(inputBindings);
@@ -201,6 +219,59 @@ public class NestedDataExpressionsTest extends
InitializedNullHandlingTest
eval = expr.eval(inputBindings);
Assert.assertEquals("100", eval.value());
Assert.assertEquals(ExpressionType.STRING, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a1')", MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{1L, null, 3L}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.LONG_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a1', 'ARRAY<STRING>')",
MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{"1", null, "3"}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.STRING_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a1', 'ARRAY<DOUBLE>')",
MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{1.0, null, 3.0}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.DOUBLE_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a2')", MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{1.1, null, 3.3}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.DOUBLE_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a2', 'ARRAY<LONG>')",
MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{1L, null, 3L}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.LONG_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a2', 'ARRAY<STRING>')",
MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{"1.1", null, "3.3"}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.STRING_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a3')", MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{"a", null, "b", "100"}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.STRING_ARRAY, eval.type());
+
+ expr = Parser.parse("json_value(nesterer, '$.x.a3', 'ARRAY<LONG>')",
MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(
+ new Object[]{null, null, null, 100L},
+ (Object[]) eval.value()
+ );
+ Assert.assertEquals(ExpressionType.LONG_ARRAY, eval.type());
+
+ // arrays of objects are not primitive
+ expr = Parser.parse("json_value(nesterer, '$.y')", MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertNull(eval.value());
+
+ expr = Parser.parse("json_value(json_object('k1', array(1,2,3), 'k2',
array('a', 'b', 'c')), '$.k1', 'ARRAY<STRING>')", MACRO_TABLE);
+ eval = expr.eval(inputBindings);
+ Assert.assertArrayEquals(new Object[]{"1", "2", "3"}, (Object[])
eval.value());
+ Assert.assertEquals(ExpressionType.STRING_ARRAY, eval.type());
}
@Test
diff --git
a/processing/src/test/java/org/apache/druid/segment/nested/NestedPathFinderTest.java
b/processing/src/test/java/org/apache/druid/segment/nested/NestedPathFinderTest.java
index b22131833c..5f0a328f68 100644
---
a/processing/src/test/java/org/apache/druid/segment/nested/NestedPathFinderTest.java
+++
b/processing/src/test/java/org/apache/druid/segment/nested/NestedPathFinderTest.java
@@ -417,51 +417,39 @@ public class NestedPathFinderTest
pathParts = NestedPathFinder.parseJqPath(".");
Assert.assertEquals(NESTER, NestedPathFinder.find(NESTER, pathParts));
- Assert.assertNull(NestedPathFinder.findStringLiteral(NESTER, pathParts));
pathParts = NestedPathFinder.parseJqPath(".z");
Assert.assertEquals("foo", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("foo", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".x");
Assert.assertEquals(NESTER.get("x"), NestedPathFinder.find(NESTER,
pathParts));
- Assert.assertNull(NestedPathFinder.findStringLiteral(NESTER, pathParts));
pathParts = NestedPathFinder.parseJqPath(".x[1]");
Assert.assertEquals("b", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("b", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".x[-1]");
Assert.assertEquals("c", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("c", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".x[-2]");
Assert.assertEquals("b", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("b", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".x[-4]");
Assert.assertNull(NestedPathFinder.find(NESTER, pathParts));
- Assert.assertNull(NestedPathFinder.findStringLiteral(NESTER, pathParts));
// nonexistent
pathParts = NestedPathFinder.parseJqPath(".x[1].y.z");
Assert.assertNull(NestedPathFinder.find(NESTER, pathParts));
- Assert.assertNull(NestedPathFinder.findStringLiteral(NESTER, pathParts));
pathParts = NestedPathFinder.parseJqPath(".y.a");
Assert.assertEquals("hello", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("hello", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".y[1]");
Assert.assertNull(NestedPathFinder.find(NESTER, pathParts));
- Assert.assertNull(NestedPathFinder.findStringLiteral(NESTER, pathParts));
pathParts = NestedPathFinder.parseJqPath(".\"[sneaky]\"");
Assert.assertEquals("bar", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("bar", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
pathParts = NestedPathFinder.parseJqPath(".\"[also_sneaky]\"[1].c");
Assert.assertEquals("z", NestedPathFinder.find(NESTER, pathParts));
- Assert.assertEquals("z", NestedPathFinder.findStringLiteral(NESTER,
pathParts));
}
}
diff --git
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
index c5503f7eb8..949b8b8879 100644
---
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
+++
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
@@ -686,7 +686,7 @@ public class NestedDataOperatorConversions
(name, outputType, expression, macroTable) -> new
NestedFieldVirtualColumn(
druidExpressions.get(0).getDirectColumn(),
name,
- outputType,
+ null,
parts,
false,
null,
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 8386148596..628d7dc324 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
@@ -440,7 +440,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
.setInterval(querySegmentSpec(Filtration.eternity()))
.setGranularity(Granularities.ALL)
.setVirtualColumns(
- new NestedFieldVirtualColumn("nest", "$.x", "v0",
ColumnType.STRING)
+ new NestedFieldVirtualColumn("nest", "$.x", "v0",
null)
)
.setDimensions(
dimensions(
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]