thanks!!! it works
















At 2020-10-27 15:30:57, "Danny Chan" <[email protected]> wrote:
>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
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>

Reply via email to