Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;


/**
Expand Down Expand Up @@ -57,7 +58,16 @@ public int getMaxNumericPrecision() {
@Override
public RelDataType deriveAvgAggType(RelDataTypeFactory typeFactory,
RelDataType argumentType) {
return typeFactory.createTypeWithNullability(
typeFactory.createSqlType(SqlTypeName.DOUBLE), false);
assert SqlTypeUtil.isNumeric(argumentType);

switch (argumentType.getSqlTypeName()) {
case DECIMAL: {
// For BIG_DECIMAL, set the return type to BIG_DECIMAL. Check OSS issue #10318 for more details.
return argumentType;
}
default: {
return typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.DOUBLE), false);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -296,18 +296,18 @@ private Object[][] provideQueriesWithExplainedPlan() {
+ " \"table\": [\n" + " \"a\"\n" + " ],\n" + " \"inputs\": []\n" + " },\n"
+ " {\n" + " \"id\": \"1\",\n" + " \"relOp\": \"LogicalProject\",\n" + " \"fields\": [\n"
+ " \"col1\",\n" + " \"col3\"\n" + " ],\n" + " \"exprs\": [\n" + " {\n"
+ " \"input\": 2,\n" + " \"name\": \"$2\"\n" + " },\n" + " {\n"
+ " \"input\": 1,\n" + " \"name\": \"$1\"\n" + " }\n" + " ]\n" + " }\n"
+ " \"input\": 3,\n" + " \"name\": \"$3\"\n" + " },\n" + " {\n"
+ " \"input\": 2,\n" + " \"name\": \"$2\"\n" + " }\n" + " ]\n" + " }\n"
+ " ]\n" + "}"},
new Object[]{"EXPLAIN PLAN EXCLUDING ATTRIBUTES AS DOT FOR SELECT col1, COUNT(*) FROM a GROUP BY col1",
"Execution Plan\n" + "digraph {\n" + "\"LogicalExchange\\n\" -> \"LogicalAggregate\\n\" [label=\"0\"]\n"
+ "\"LogicalAggregate\\n\" -> \"LogicalExchange\\n\" [label=\"0\"]\n"
+ "\"LogicalTableScan\\n\" -> \"LogicalAggregate\\n\" [label=\"0\"]\n" + "}\n"},
new Object[]{"EXPLAIN PLAN FOR SELECT a.col1, b.col3 FROM a JOIN b ON a.col1 = b.col1", "Execution Plan\n"
+ "LogicalProject(col1=[$0], col3=[$1])\n" + " LogicalJoin(condition=[=($0, $2)], joinType=[inner])\n"
+ " LogicalExchange(distribution=[hash[0]])\n" + " LogicalProject(col1=[$2])\n"
+ " LogicalExchange(distribution=[hash[0]])\n" + " LogicalProject(col1=[$3])\n"
+ " LogicalTableScan(table=[[a]])\n" + " LogicalExchange(distribution=[hash[1]])\n"
+ " LogicalProject(col3=[$1], col1=[$2])\n" + " LogicalTableScan(table=[[b]])\n"},
+ " LogicalProject(col3=[$2], col1=[$3])\n" + " LogicalTableScan(table=[[b]])\n"},
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class QueryEnvironmentTestBase {
.addSingleValueDimension("col2", FieldSpec.DataType.STRING, "")
.addDateTime("ts", FieldSpec.DataType.LONG, "1:MILLISECONDS:EPOCH", "1:HOURS")
.addMetric("col3", FieldSpec.DataType.INT, 0)
.addMetric("col4", FieldSpec.DataType.BIG_DECIMAL, 0)
.setSchemaName("defaultSchemaName");
TABLE_SCHEMAS.put("a_REALTIME", SCHEMA_BUILDER.setSchemaName("a").build());
TABLE_SCHEMAS.put("b_REALTIME", SCHEMA_BUILDER.setSchemaName("b").build());
Expand Down
54 changes: 43 additions & 11 deletions pinot-query-planner/src/test/resources/queries/AggregatePlans.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,38 @@
{
"aggregates_planning_tests": {
"queries": [
{
"description": "Select AVG aggregation for a BIG_DECIMAL column",
"sql": "EXPLAIN PLAN FOR SELECT AVG(a.col4) as avg FROM a WHERE a.col3 >= 0 AND a.col2 = 'pink floyd'",
"output": [
"Execution Plan",
"\nLogicalProject(avg=[/($0, $1)])",
"\n LogicalProject($f0=[CASE(=($1, 0), null:DECIMAL(1000, 0), $0)], $f1=[$1])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[COUNT()])",
"\n LogicalProject(col4=[$0], col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
},
{
"description": "Select many aggregations for a BIG_DECIMAL column",
"sql": "EXPLAIN PLAN FOR SELECT AVG(a.col4) as avg, SUM(a.col4) as sum, MAX(a.col4) as max FROM a WHERE a.col3 >= 0 AND a.col2 = 'pink floyd'",
"output": [
"Execution Plan",
"\nLogicalProject(avg=[/($0, $1)], sum=[CASE(=($1, 0), null:DECIMAL(1000, 0), $2)], max=[$3])",
"\n LogicalProject($f0=[CASE(=($1, 0), null:DECIMAL(1000, 0), $0)], $f1=[$1], sum=[$0], max=[$2])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[$SUM0($1)], max=[MAX($2)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[COUNT()], max=[MAX($0)])",
"\n LogicalProject(col4=[$0], col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
},
{
"description": "Select aggregates with filters and select alias",
"sql": "EXPLAIN PLAN FOR SELECT AVG(a.col3) as avg, COUNT(*) as count FROM a WHERE a.col3 >= 0 AND a.col2 = 'pink floyd'",
Expand All @@ -11,8 +43,8 @@
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalProject(col2=[$0], col3=[$1])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'pink floyd'))])",
"\n LogicalProject(col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -25,7 +57,7 @@
"\nLogicalProject(EXPR$0=[CASE(=($1, 0), null:INTEGER, $0)], EXPR$1=[$1])",
"\n LogicalAggregate(group=[{}], EXPR$0=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], EXPR$0=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalAggregate(group=[{}], EXPR$0=[$SUM0($2)], agg#1=[COUNT()])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -39,8 +71,8 @@
"\n LogicalAggregate(group=[{}], EXPR$0=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], EXPR$0=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalProject(col2=[$0], col3=[$1])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'a'))])",
"\n LogicalProject(col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'a'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -54,8 +86,8 @@
"\n LogicalAggregate(group=[{}], sum=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], sum=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalProject(col2=[$0], col3=[$1])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'pink floyd'))])",
"\n LogicalProject(col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -70,8 +102,8 @@
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], agg#0=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalProject(col2=[$0], col3=[$1])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'pink floyd'))])",
"\n LogicalProject(col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -85,8 +117,8 @@
"\n LogicalAggregate(group=[{}], sum=[$SUM0($0)], agg#1=[$SUM0($1)])",
"\n LogicalExchange(distribution=[hash])",
"\n LogicalAggregate(group=[{}], sum=[$SUM0($1)], agg#1=[COUNT()])",
"\n LogicalProject(col2=[$0], col3=[$1])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'pink floyd'))])",
"\n LogicalProject(col2=[$1], col3=[$2])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'pink floyd'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
"sql": "EXPLAIN PLAN FOR SELECT a.col1, a.col3 + a.ts FROM a WHERE a.col3 >= 0 AND a.col2 = 'a'",
"output": [
"Execution Plan",
"\nLogicalProject(col1=[$2], EXPR$1=[+($1, $3)])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'a'))])",
"\nLogicalProject(col1=[$3], EXPR$1=[+($2, $4)])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'a'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -26,8 +26,8 @@
"sql": "EXPLAIN PLAN FOR SELECT a.col1, a.col3 + a.ts AS colsum FROM a WHERE a.col3 >= 0 AND a.col2 = 'a'",
"output": [
"Execution Plan",
"\nLogicalProject(col1=[$2], colsum=[+($1, $3)])",
"\n LogicalFilter(condition=[AND(>=($1, 0), =($0, 'a'))])",
"\nLogicalProject(col1=[$3], colsum=[+($2, $4)])",
"\n LogicalFilter(condition=[AND(>=($2, 0), =($1, 'a'))])",
"\n LogicalTableScan(table=[[a]])",
"\n"
]
Expand All @@ -37,7 +37,7 @@
"sql": "EXPLAIN PLAN FOR SELECT dateTrunc('DAY', ts) FROM a LIMIT 10",
"output": [
"Execution Plan",
"\nLogicalProject(EXPR$0=[dateTrunc('DAY', $3)])",
"\nLogicalProject(EXPR$0=[dateTrunc('DAY', $4)])",
"\n LogicalSort(offset=[0], fetch=[10])",
"\n LogicalSortExchange(distribution=[hash], collation=[[]])",
"\n LogicalSort(fetch=[10])",
Expand All @@ -50,7 +50,7 @@
"sql": "EXPLAIN PLAN FOR SELECT dateTrunc('DAY', ts) AS day FROM a LIMIT 10",
"output": [
"Execution Plan",
"\nLogicalProject(day=[dateTrunc('DAY', $3)])",
"\nLogicalProject(day=[dateTrunc('DAY', $4)])",
"\n LogicalSort(offset=[0], fetch=[10])",
"\n LogicalSortExchange(distribution=[hash], collation=[[]])",
"\n LogicalSort(fetch=[10])",
Expand Down
Loading