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 26f9b174dee Handling nil selector column in vector math processors
(#16128)
26f9b174dee is described below
commit 26f9b174deec71db02fb58f2f04a47bc62e25fbe
Author: Sree Charan Manamala <[email protected]>
AuthorDate: Tue Apr 2 14:36:57 2024 +0530
Handling nil selector column in vector math processors (#16128)
---
.../java/org/apache/druid/math/expr/Function.java | 9 +++++-
.../math/expr/vector/VectorMathProcessors.java | 37 ++++++++++------------
.../druid/math/expr/VectorExprSanityTest.java | 8 ++++-
3 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java
b/processing/src/main/java/org/apache/druid/math/expr/Function.java
index e8ff45d90f1..e870541c909 100644
--- a/processing/src/main/java/org/apache/druid/math/expr/Function.java
+++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java
@@ -241,7 +241,14 @@ public interface Function extends NamedFunction
@Override
public boolean canVectorize(Expr.InputBindingInspector inspector,
List<Expr> args)
{
- return inspector.areNumeric(args) && inspector.canVectorize(args);
+ // can not vectorize in default mode for 'missing' columns
+ // it creates inconsistencies as we default the output type to STRING,
making the value null
+ // but the numeric columns expect a non null value
+ final ExpressionType outputType = args.get(0).getOutputType(inspector);
+ if (outputType == null && NullHandling.replaceWithDefault()) {
+ return false;
+ }
+ return (outputType == null || outputType.isNumeric()) &&
inspector.canVectorize(args);
}
}
diff --git
a/processing/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java
b/processing/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java
index b45764e935e..c4240405378 100644
---
a/processing/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java
+++
b/processing/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java
@@ -47,13 +47,12 @@ public class VectorMathProcessors
final ExpressionType inputType = arg.getOutputType(inspector);
ExprVectorProcessor<?> processor = null;
- if (inputType != null) {
- if (inputType.is(ExprType.LONG)) {
- processor = longOutLongInSupplier.get();
- } else if (inputType.is(ExprType.DOUBLE)) {
- processor = doubleOutDoubleInSupplier.get();
- }
+ if (Types.isNullOr(inputType, ExprType.DOUBLE)) {
+ processor = doubleOutDoubleInSupplier.get();
+ } else if (inputType.is(ExprType.LONG)) {
+ processor = longOutLongInSupplier.get();
}
+
if (processor == null) {
throw Exprs.cannotVectorize();
}
@@ -75,13 +74,12 @@ public class VectorMathProcessors
final ExpressionType inputType = arg.getOutputType(inspector);
ExprVectorProcessor<?> processor = null;
- if (inputType != null) {
- if (inputType.is(ExprType.LONG)) {
- processor = doubleOutLongInSupplier.get();
- } else if (inputType.is(ExprType.DOUBLE)) {
- processor = doubleOutDoubleInSupplier.get();
- }
+ if (Types.isNullOr(inputType, ExprType.DOUBLE)) {
+ processor = doubleOutDoubleInSupplier.get();
+ } else if (inputType.is(ExprType.LONG)) {
+ processor = doubleOutLongInSupplier.get();
}
+
if (processor == null) {
throw Exprs.cannotVectorize();
}
@@ -103,13 +101,12 @@ public class VectorMathProcessors
final ExpressionType inputType = arg.getOutputType(inspector);
ExprVectorProcessor<?> processor = null;
- if (inputType != null) {
- if (inputType.is(ExprType.LONG)) {
- processor = longOutLongInSupplier.get();
- } else if (inputType.is(ExprType.DOUBLE)) {
- processor = longOutDoubleInSupplier.get();
- }
+ if (Types.isNullOr(inputType, ExprType.DOUBLE)) {
+ processor = longOutDoubleInSupplier.get();
+ } else if (inputType.is(ExprType.LONG)) {
+ processor = longOutLongInSupplier.get();
}
+
if (processor == null) {
throw Exprs.cannotVectorize();
}
@@ -2035,7 +2032,7 @@ public class VectorMathProcessors
return Double.doubleToLongBits(input);
}
};
- } else if (Types.is(inputType, ExprType.DOUBLE)) {
+ } else if (Types.isNullOr(inputType, ExprType.DOUBLE)) {
processor = new LongOutDoubleInFunctionVectorValueProcessor(
arg.asVectorProcessor(inspector),
inspector.getMaxVectorSize()
@@ -2074,7 +2071,7 @@ public class VectorMathProcessors
return Double.longBitsToDouble(input);
}
};
- } else if (Types.is(inputType, ExprType.DOUBLE)) {
+ } else if (Types.isNullOr(inputType, ExprType.DOUBLE)) {
processor = new DoubleOutDoubleInFunctionVectorValueProcessor(
arg.asVectorProcessor(inspector),
inspector.getMaxVectorSize()
diff --git
a/processing/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java
b/processing/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java
index d25220f0929..f96c648c9fa 100644
---
a/processing/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java
+++
b/processing/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java
@@ -176,7 +176,13 @@ public class VectorExprSanityTest extends
InitializedNullHandlingTest
"bitwiseConvertDoubleToLongBits",
"bitwiseConvertLongBitsToDouble"
};
- final String[] templates = new String[]{"%s(l1)", "%s(d1)", "%s(pi())",
"%s(null)"};
+ final String[] templates;
+ if (NullHandling.sqlCompatible()) {
+ templates = new String[]{"%s(l1)", "%s(d1)", "%s(pi())", "%s(null)",
"%s(missing)"};
+ } else {
+ // missing columns are not vectorizable in default value mode
+ templates = new String[]{"%s(l1)", "%s(d1)", "%s(pi())", "%s(null)"};
+ }
testFunctions(types, templates, functions);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]