Your "aggr" needs to implement the interface SqlAggFunction <https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlAggFunction.java> .
dawangli <[email protected]> 于2020年10月27日周二 下午3:24写道: > sorry, i means udaf > > > > > > > > > > > > > > > > > > At 2020-10-27 15:21:36, "Danny Chan" <[email protected]> wrote: > >Do you mean DUTF or UDAF ? > > > >dawangli <[email protected]> 于2020年10月27日周二 上午11:35写道: > > > >> I hive the following code,it just valid a simple group by sql with a > udaf, > >> but i doesn't work, it seems like the calcite cannot identify the aggr > udaf > >> ,code and error displayed below > >> code > >> String sql = "SELECT\n" + > >> " dim,\n" + > >> " aggr(val)\n" + > >> "FROM\n" + > >> " tb\n" + > >> "GROUP BY\n" + > >> " dim"; > >> > >> CalciteSchema rootSchema = CalciteSchema > >> .createRootSchema(false, false); > >> > >> rootSchema.add("tb", new AbstractTable() { //note: add a table > >> @Override > >> public RelDataType getRowType(final RelDataTypeFactory typeFactory) { > >> RelDataTypeFactory.Builder builder = typeFactory.builder(); > >> > >> builder.add("dim", new BasicSqlType(new RelDataTypeSystemImpl() {}, > >> SqlTypeName.VARCHAR)); > >> builder.add("val", new BasicSqlType(new RelDataTypeSystemImpl() {}, > >> SqlTypeName.BIGINT)); > >> return builder.build(); > >> } > >> }); > >> > >> SqlParser.ConfigBuilder builder = SqlParser.configBuilder(); > >> builder.setQuotedCasing(Casing.TO_UPPER); > >> builder.setUnquotedCasing(Casing.TO_UPPER); > >> builder.setCaseSensitive(false); > >> builder.setLex(Lex.JAVA); > >> SqlStdOperatorTable sqlStdOperatorTable = > SqlStdOperatorTable.instance(); > >> > >> sqlStdOperatorTable.register(new SqlFunction( > >> new SqlIdentifier("aggr", SqlParserPos.ZERO), > >> ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.ANY), > >> SqlTypeTransforms.TO_NULLABLE), > >> null, > >> OperandTypes.family(SqlTypeFamily.ANY), > >> Lists.newArrayList(new > >> > SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT).createSqlType(SqlTypeName.ANY)), > >> SqlFunctionCategory.USER_DEFINED_FUNCTION)); > >> > >> final FrameworkConfig config = Frameworks.newConfigBuilder() > >> .defaultSchema(rootSchema.plus()) > >> .parserConfig(builder.build()) > >> .operatorTable(sqlStdOperatorTable) > >> .build(); > >> Planner planner = Frameworks.getPlanner(config); > >> > >> SqlNode originSqlNode = planner.parse(sql); > >> > >> SqlNode sqlNode = planner.validate(originSqlNode); > >> > >> > >> error: > >> > >> > >> Exception in thread "main" org.apache.calcite.tools.ValidationException: > >> org.apache.calcite.runtime.CalciteContextException: From line 3, column > 8 > >> to line 3, column 10: Expression 'val' is not being grouped > >> at > >> org.apache.calcite.prepare.PlannerImpl.validate(PlannerImpl.java:217) > >> at com.kuaishou.dp.stream.metadata.sql.Test.main(Test.java:422) > >> Caused by: org.apache.calcite.runtime.CalciteContextException: From line > >> 3, column 8 to line 3, column 10: Expression 'val' is not being grouped > >> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > >> Method) > >> at > >> > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) > >> at > >> > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > >> at > java.lang.reflect.Constructor.newInstance(Constructor.java:423) > >> at > >> > org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:463) > >> at > >> org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:834) > >> at > >> org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:819) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:4867) > >> at > >> org.apache.calcite.sql.validate.AggChecker.visit(AggChecker.java:113) > >> at > >> org.apache.calcite.sql.validate.AggChecker.visit(AggChecker.java:40) > >> at > >> org.apache.calcite.sql.SqlIdentifier.accept(SqlIdentifier.java:317) > >> at > >> > org.apache.calcite.sql.util.SqlBasicVisitor$ArgHandlerImpl.visitChild(SqlBasicVisitor.java:123) > >> at > >> org.apache.calcite.sql.SqlOperator.acceptCall(SqlOperator.java:868) > >> at > >> org.apache.calcite.sql.validate.AggChecker.visit(AggChecker.java:212) > >> at > >> org.apache.calcite.sql.validate.AggChecker.visit(AggChecker.java:40) > >> at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:139) > >> at > >> > org.apache.calcite.sql.validate.AggregatingSelectScope.checkAggregateExpr(AggregatingSelectScope.java:228) > >> at > >> > org.apache.calcite.sql.validate.AggregatingSelectScope.validateExpr(AggregatingSelectScope.java:237) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateExpr(SqlValidatorImpl.java:4162) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:4136) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3392) > >> at > >> > org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60) > >> at > >> > org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1005) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:965) > >> at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:216) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:940) > >> at > >> > org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:647) > >> at > >> org.apache.calcite.prepare.PlannerImpl.validate(PlannerImpl.java:215) > >> ... 1 more > >> Caused by: org.apache.calcite.sql.validate.SqlValidatorException: > >> Expression 'val' is not being grouped > >> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > >> Method) > >> at > >> > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) > >> at > >> > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > >> at > java.lang.reflect.Constructor.newInstance(Constructor.java:423) > >> at > >> > org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:463) > >> at > >> org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:572) > >> ... 25 more > >> > >> > >> > >> > >> > >> >
