You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by su...@apache.org on 2021/12/22 01:41:37 UTC
[druid] branch master updated: ARRAY_AGG and STRING_AGG will through errors if invoked on a complex datatype (#12089)
This is an automated email from the ASF dual-hosted git repository.
suneet 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 1871a1a ARRAY_AGG and STRING_AGG will through errors if invoked on a complex datatype (#12089)
1871a1a is described below
commit 1871a1ab18067c3db1e65e52538a861af2f5800d
Author: somu-imply <93...@users.noreply.github.com>
AuthorDate: Tue Dec 21 17:41:04 2021 -0800
ARRAY_AGG and STRING_AGG will through errors if invoked on a complex datatype (#12089)
---
.../aggregation/builtin/ArraySqlAggregator.java | 4 +++
.../aggregation/builtin/StringSqlAggregator.java | 27 ++++++++++++++++--
.../apache/druid/sql/calcite/CalciteQueryTest.java | 33 ++++++++++++++++++++++
3 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/ArraySqlAggregator.java b/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/ArraySqlAggregator.java
index 56f1fe8..e2213a3 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/ArraySqlAggregator.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/ArraySqlAggregator.java
@@ -51,6 +51,7 @@ import org.apache.druid.sql.calcite.planner.Calcites;
import org.apache.druid.sql.calcite.planner.PlannerContext;
import org.apache.druid.sql.calcite.planner.UnsupportedSQLQueryException;
import org.apache.druid.sql.calcite.rel.VirtualColumnRegistry;
+import org.apache.druid.sql.calcite.table.RowSignatures;
import javax.annotation.Nullable;
@@ -187,6 +188,9 @@ public class ArraySqlAggregator implements SqlAggregator
if (SqlTypeUtil.isArray(type)) {
throw new UnsupportedSQLQueryException("Cannot use ARRAY_AGG on array inputs %s", type);
}
+ if (type instanceof RowSignatures.ComplexSqlType) {
+ throw new UnsupportedSQLQueryException("Cannot use ARRAY_AGG on complex inputs %s", type);
+ }
return Calcites.createSqlArrayTypeWithNullability(
sqlOperatorBinding.getTypeFactory(),
type.getSqlTypeName(),
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/StringSqlAggregator.java b/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/StringSqlAggregator.java
index c11f5a0..72bfe9e 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/StringSqlAggregator.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/aggregation/builtin/StringSqlAggregator.java
@@ -22,14 +22,17 @@ package org.apache.druid.sql.calcite.aggregation.builtin;
import com.google.common.collect.ImmutableSet;
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.sql.SqlAggFunction;
import org.apache.calcite.sql.SqlFunctionCategory;
import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlOperatorBinding;
import org.apache.calcite.sql.type.InferTypes;
import org.apache.calcite.sql.type.OperandTypes;
+import org.apache.calcite.sql.type.SqlReturnTypeInference;
import org.apache.calcite.sql.type.SqlTypeFamily;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.util.Optionality;
@@ -49,7 +52,9 @@ import org.apache.druid.sql.calcite.expression.DruidExpression;
import org.apache.druid.sql.calcite.expression.Expressions;
import org.apache.druid.sql.calcite.planner.Calcites;
import org.apache.druid.sql.calcite.planner.PlannerContext;
+import org.apache.druid.sql.calcite.planner.UnsupportedSQLQueryException;
import org.apache.druid.sql.calcite.rel.VirtualColumnRegistry;
+import org.apache.druid.sql.calcite.table.RowSignatures;
import javax.annotation.Nullable;
import java.util.List;
@@ -181,16 +186,34 @@ public class StringSqlAggregator implements SqlAggregator
}
}
+ static class StringAggReturnTypeInference implements SqlReturnTypeInference
+ {
+ @Override
+ public RelDataType inferReturnType(SqlOperatorBinding sqlOperatorBinding)
+ {
+ RelDataType type = sqlOperatorBinding.getOperandType(0);
+ if (type instanceof RowSignatures.ComplexSqlType) {
+ throw new UnsupportedSQLQueryException("Cannot use STRING_AGG on complex inputs %s", type);
+ }
+ return Calcites.createSqlTypeWithNullability(
+ sqlOperatorBinding.getTypeFactory(),
+ SqlTypeName.VARCHAR,
+ true
+ );
+ }
+ }
+
private static class StringAggFunction extends SqlAggFunction
{
+ private static final StringAggReturnTypeInference RETURN_TYPE_INFERENCE = new StringAggReturnTypeInference();
+
StringAggFunction()
{
super(
NAME,
null,
SqlKind.OTHER_FUNCTION,
- opBinding ->
- Calcites.createSqlTypeWithNullability(opBinding.getTypeFactory(), SqlTypeName.VARCHAR, true),
+ RETURN_TYPE_INFERENCE,
InferTypes.ANY_NULLABLE,
OperandTypes.or(
OperandTypes.and(
diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
index 90b2912..01a994b 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
@@ -5249,6 +5249,39 @@ public class CalciteQueryTest extends BaseCalciteQueryTest
}
@Test
+ public void testArrayAggQueryOnComplexDatatypes() throws Exception
+ {
+ try {
+ testQuery("SELECT ARRAY_AGG(unique_dim1) FROM druid.foo", ImmutableList.of(), ImmutableList.of());
+ Assert.fail("query execution should fail");
+ }
+ catch (SqlPlanningException e) {
+ Assert.assertTrue(
+ e.getMessage().contains("Cannot use ARRAY_AGG on complex inputs COMPLEX<hyperUnique>")
+ );
+ Assert.assertEquals(PlanningError.VALIDATION_ERROR.getErrorCode(), e.getErrorCode());
+ Assert.assertEquals(PlanningError.VALIDATION_ERROR.getErrorClass(), e.getErrorClass());
+ }
+ }
+
+ @Test
+ public void testStringAggQueryOnComplexDatatypes() throws Exception
+ {
+ try {
+ testQuery("SELECT STRING_AGG(unique_dim1, ',') FROM druid.foo", ImmutableList.of(), ImmutableList.of());
+ Assert.fail("query execution should fail");
+ }
+ catch (SqlPlanningException e) {
+ Assert.assertTrue(
+ e.getMessage().contains("Cannot use STRING_AGG on complex inputs COMPLEX<hyperUnique>")
+ );
+ Assert.assertEquals(PlanningError.VALIDATION_ERROR.getErrorCode(), e.getErrorCode());
+ Assert.assertEquals(PlanningError.VALIDATION_ERROR.getErrorClass(), e.getErrorClass());
+ }
+ }
+
+
+ @Test
public void testCountStarWithBoundFilterSimplifyAnd() throws Exception
{
testQuery(
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org