You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by Nagarajan Chinnasamy <na...@gmail.com> on 2017/01/12 20:00:10 UTC

Re: Invoking UDF that doesn't have parameters without paranthesis

The  CURRENT_DATE is constructed using the SqlFunction constructor:

    public SqlFunction(String name,
        SqlKind kind,
        SqlReturnTypeInference returnTypeInference,
        SqlOperandTypeInference operandTypeInference,
        SqlOperandTypeChecker operandTypeChecker, SqlFunctionCategory
category)

Whereas the DrillSqlOperator (derived from SqlFunction) is using the
following constructor variation:

    super(new SqlIdentifier(name, SqlParserPos.ZERO),
        sqlReturnTypeInference,
        null,
        Checker.getChecker(argCountMin, argCountMax), //
SqlOperandTypeChecker
        null,
        SqlFunctionCategory.USER_DEFINED_FUNCTION);

In DrillSqlOperator (derived from SqlFunction), I  tried:

    1. setting OperandTypeChecker value to OperandTypes.NILADIC
    2. Overriding getSyntax method to return SqlSyntax.FUNCTION_ID

Both of the above did not help.

When invoked without parenthesis, I get the following exception:

0: jdbc:drill:zk=local> select session_id from (values(1));
Jan 13, 2017 12:58:00 AM
org.apache.calcite.sql.validate.SqlValidatorException <init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: Column
'session_id' not found in any table
Jan 13, 2017 12:58:00 AM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 1,
column 8 to line 1, column 17: Column 'session_id' not found in any table
Error: VALIDATION ERROR: From line 1, column 8 to line 1, column 17: Column
'session_id' not found in any table

Looking for your inputs to resolve this issue...

Best Regards,
Nagu.

On Wed, Dec 21, 2016 at 1:20 AM, Jinfeng Ni <jn...@apache.org> wrote:

> For function without parentheses, Calcite validator checks a
> SqlIdentifier against validator's operatorTable. If such identifier
> appears in the operatorTable, the SqlIdentifier is converted to a
> SqlCall. For your use case, you probably need add such function into
> operatorTable. You may follow Julian's suggestion of looking at
> CURRENT_DATE function.
>
> 1. https://github.com/apache/calcite/blob/master/core/src/
> main/java/org/apache/calcite/sql/SqlIdentifier.java#L302-L308
>
> On Tue, Dec 20, 2016 at 11:19 AM, Julian Hyde <jh...@apache.org> wrote:
> > I don’t think you need to change the parser, just the validator (the
> changes to SqlOperator.getSyntax I described already). The parser will
> parse an identifier, and the validator will recognize that it is a call to
> a function with no arguments.
> >
> > Unless Drill has diverged further from Calcite than I imagine it has.
> >
> > Julian
> >
> >
> >> On Dec 20, 2016, at 10:51 AM, Sudheesh Katkam <sk...@maprtech.com>
> wrote:
> >>
> >> I do not know the exact answer.
> >>
> >> Quite likely the Calcite parser needs to be changed, this blob:
> >>
> >> https://github.com/apache/calcite/blob/master/core/src/
> main/codegen/templates/Parser.jj#L4765 <https://github.com/apache/
> calcite/blob/master/core/src/main/codegen/templates/Parser.jj#L4765>
> >>
> >> Drill extends the Calcite parser, not sure if the change can be made
> here:
> >>
> >> https://github.com/apache/drill/blob/master/exec/java-
> exec/src/main/codegen/includes/parserImpls.ftl <https://github.com/apache/
> drill/blob/master/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
> >
> >>
> >> Thank you,
> >> Sudheesh
> >>
> >>> On Dec 19, 2016, at 3:00 PM, Nagarajan Chinnasamy <
> nagarajanchinnasamy@gmail.com> wrote:
> >>>
> >>> Hi Julian Hyde,
> >>>
> >>> Thanks for your response. I am looking for the Drill way of doing it.
> >>>
> >>> In fact I have coded session_id function exactly as one of other
> >>> ContextFunctions of Drill. I seem to be missing something :(
> >>>
> >>>
> >>>
> >>>
> >>> Best Regards,
> >>> Nagu.
> >>>
> >>> On Mon, Dec 19, 2016 at 1:30 PM, Nagarajan Chinnasamy <
> >>> nagarajanchinnasamy@gmail.com> wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> Am developing a UDF called SESSION_ID as detailed in issue:
> >>>>
> >>>>   https://issues.apache.org/jira/browse/DRILL-5043
> >>>>
> >>>> It does not take any input parameters. Now, I can only invoke it using
> >>>> parenthesis as in:
> >>>>
> >>>>   SELECT SESSION_ID() FROM (Values(1));
> >>>>
> >>>> I would like to know what do I need to do if I need to invoke it
> without
> >>>> paranthesis like:
> >>>>
> >>>>   SELECT SESSION_ID FROM (Values(1));
> >>>>
> >>>> Appreciate your input.
> >>>>
> >>>> Best Regards,
> >>>> Nagu.
> >>>>
> >>
> >
>