Success :) I could invoke SESSION_ID without parenthesis. Following did the trick:
1. In DrillSqlOperator, overriding getSyntax method to return SqlSyntax.FUNCTION_ID 2. In DrillOperatorTable, adding operator when SqlSyntax is (FUNCTION || FUNCTION_ID) Thanks for your inputs. Best Regards, Nagu. On Fri, Jan 13, 2017 at 1:30 AM, Nagarajan Chinnasamy < [email protected]> wrote: > 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> >> 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/cal >> cite/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/dri >> ll/blob/master/exec/java-exec/src/main/codegen/includes/parserImpls.ftl> >> >> >> >> Thank you, >> >> Sudheesh >> >> >> >>> On Dec 19, 2016, at 3:00 PM, Nagarajan Chinnasamy < >> [email protected]> 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 < >> >>> [email protected]> 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. >> >>>> >> >> >> > >> > >
