You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Stamatis Zampetakis (Jira)" <ji...@apache.org> on 2019/08/20 13:53:00 UTC

[jira] [Resolved] (CALCITE-1882) Can't obtain the user defined aggregate function such as sum,avg by calcite

     [ https://issues.apache.org/jira/browse/CALCITE-1882?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Stamatis Zampetakis resolved CALCITE-1882.
------------------------------------------
    Resolution: Cannot Reproduce

I am marking this as resolved since after CALCITE-2282 the issue should no longer appear. 

> Can't obtain the user defined aggregate function such as sum,avg by calcite
> ---------------------------------------------------------------------------
>
>                 Key: CALCITE-1882
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1882
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 1.12.0
>            Reporter: yuemeng
>            Assignee: yuemeng
>            Priority: Critical
>              Labels: pull-request-available
>             Fix For: 1.21.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> If we want to register a sum or avg aggregate function to deal with different data type such as sum(double) ,we implement a SqlUserDefinedAggFunction and register with name sum,but when we execute a sql like:
> {code}
> select id,sum(payment) from table test group by id
> {code}
> in fact,it always give the SqlSumAggFunction function which builtin by calcite,never find the exactly function which we register by ourself.
> During sql parse process,method createCall in SqlAbstractParserImpl will be called,
> {code}
>   protected SqlCall createCall(
>       SqlIdentifier funName,
>       SqlParserPos pos,
>       SqlFunctionCategory funcType,
>       SqlLiteral functionQualifier,
>       SqlNode[] operands) {
>     SqlOperator fun = null;
>     // First, try a half-hearted resolution as a builtin function.
>     // If we find one, use it; this will guarantee that we
>     // preserve the correct syntax (i.e. don't quote builtin function
>     /// name when regenerating SQL).
>     if (funName.isSimple()) {
>       final List<SqlOperator> list = Lists.newArrayList();
>       opTab.lookupOperatorOverloads(funName, funcType, SqlSyntax.FUNCTION, list);//we lookup in SqlStdOperatorTable,and always find buidin function for sum ,avg .eg
>       if (list.size() == 1) {
>         fun = list.get(0);
>       }
>     }
>     // Otherwise, just create a placeholder function.  Later, during
>     // validation, it will be resolved into a real function reference.
>     if (fun == null) {
>       fun = new SqlUnresolvedFunction(funName, null, null, null, null,
>           funcType);
>     }
>     return fun.createCall(functionQualifier, pos, operands);
>   }
> {code}
> but the problem will be appear in deriveType,because of we get the SqlSumAggFunction previously,and the sqlKind of SqlSumAggFunction is AVG,but the sqlKind of sql user defined agg function (sum) which we register by ourself is OTHER_FUNCTION,so it filter out our sum function.
> {code}
>   private static Iterator<SqlOperator>
>   filterOperatorRoutinesByKind(Iterator<SqlOperator> routines,
>       final SqlKind sqlKind) {
>     return Iterators.filter(routines,
>         new PredicateImpl<SqlOperator>() {
>           public boolean test(SqlOperator input) {
>             return input.getKind() == sqlKind;
>           }
>         });
>   }
> {code}
> that cause we never obtain sum function which registered by user .



--
This message was sent by Atlassian Jira
(v8.3.2#803003)