[
https://issues.apache.org/jira/browse/CALCITE-2282?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16830001#comment-16830001
]
Lai Zhou edited comment on CALCITE-2282 at 5/1/19 2:01 AM:
-----------------------------------------------------------
[~zhztheplayer] ,thanks, you're right. " That said, you can put a operator with
same NAME, KIND to your own table, then validator will use it to replace the
original one"
It really works. I don't need to rewrite the Parser.jj to replace DIVIDE. I
forgot my new solutions for DIVIDE in last comment.
Here is my code:
{code:java}
newOp = new SqlBinaryOperator(upName,
operatorInSqlStdOperatorTable.getKind(),
operatorInSqlStdOperatorTable.getLeftPrec(),
operatorInSqlStdOperatorTable.getRightPrec(),
HiveSqlUDFReturnTypeInference.INSTANCE, null,
HiveSqlFunction.ArgChecker.INSTANCE);
newOp = new SqlPrefixOperator(upName,
operatorInSqlStdOperatorTable.getKind(),
operatorInSqlStdOperatorTable.getLeftPrec(),
operatorInSqlStdOperatorTable.getRightPrec(),
HiveSqlUDFReturnTypeInference.INSTANCE, null,
HiveSqlFunction.ArgChecker.INSTANCE);
register(newOp);
{code}
If we put an operator with same NAME, KIND,SqlSyntax to replace the original
one, we'd better keep the same class `SqlBinaryOperator` or
`SqlPrefixOperator`. So I introduced a new constructor for them to construct
the Operator.
as [~julianhyde] said, "Another technique could be a visitor that walks over
expressions and replaces Calcite's DIVIDE with Hive's DIVIDE." It also works .
Thanks.
was (Author: hhlai1990):
[~zhztheplayer] ,thanks, you're right. " That said, you can put a operator with
same NAME, KIND to your own table, then validator will use it to replace the
original one"
It really works. I don't need to rewrite the Parser.jj to replace DIVIDE. I
forgot my new solutions for DIVIDE in last comment.
Here is my code:
{code:java}
newOp = new SqlBinaryOperator(upName,
operatorInSqlStdOperatorTable.getKind(),
operatorInSqlStdOperatorTable.getLeftPrec(),
operatorInSqlStdOperatorTable.getRightPrec(),
HiveSqlUDFReturnTypeInference.INSTANCE, null,
HiveSqlFunction.ArgChecker.INSTANCE);
newOp = new SqlPrefixOperator(upName,
operatorInSqlStdOperatorTable.getKind(),
operatorInSqlStdOperatorTable.getLeftPrec(),
operatorInSqlStdOperatorTable.getRightPrec(),
HiveSqlUDFReturnTypeInference.INSTANCE, null,
HiveSqlFunction.ArgChecker.INSTANCE);
register(newOp);
{code}
If we put an operator with same NAME, KIND to replace the original one, we'd
better keep the same class `SqlBinaryOperator` or `SqlPrefixOperator`. So I
introduced a new constructor
for them to construct the Operator.
as [~julianhyde] said, "Another technique could be a visitor that walks over
expressions and replaces Calcite's DIVIDE with Hive's DIVIDE." It also works .
Thanks.
> Allow OperatorTable to be pluggable in the parser
> -------------------------------------------------
>
> Key: CALCITE-2282
> URL: https://issues.apache.org/jira/browse/CALCITE-2282
> Project: Calcite
> Issue Type: Improvement
> Components: core
> Reporter: Sudheesh Katkam
> Priority: Major
> Attachments: CALCITE-2282.patch.txt
>
>
> SqlAbstractParserImpl [hardcodes OperatorTable to
> SqlStdOperatorTable|https://github.com/apache/calcite/blob/8327e674e7f0a768d124fa37fd75cda4b8a35bb6/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java#L334|https://github.com/apache/calcite/blob/8327e674e7f0a768d124fa37fd75cda4b8a35bb6/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java#L334].
> Make this pluggable via a protected method.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)