[ 
https://issues.apache.org/jira/browse/CALCITE-525?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16644441#comment-16644441
 ] 

Hongze Zhang commented on CALCITE-525:
--------------------------------------

Hi [~julianhyde] and [~vlsi], thank you for the suggestions.

In the newest commit, I have made all new classes @Experimental, and made Util 
class to be compliance with spec, and some other changes.

bq. You seem to handle each and every EnumerableCalc, however a single query 
might have multiple EnumerableCalc instances. Does it really make sense to 
handle all of them?

IMO, It is a little tricky to choose a place in which we put the 
catch-and-handle logic, there are some possible choices: 
1. Decorate the root enumerable returned from root bindable;
2. Decorate the inner enumerables (Just like the PR does);
3. Directly change the code generated by RexToLixTranslator#translateCall 
(Maybe use a lambda to wrap the implemented expression).

1 is OK but some exceptions could not be caught in this way (E.g. when use 
group by query);
3 needs a lot of test work since it changes generated code wildly, and we could 
not easily implement "drop a row" only by changing the RexToLix code.

So I choose 2 in the PR.

bq. What sense log action means? What is the result of SQL when exception is 
logged and/or ignored?
ExceptionHandlerEnum.LOG indicates "log the error and discard it". And 
ExceptionHandlerEnum.DISCARD means "discard it". If the names are confusing, I 
can give them a longer name maybe (E.g. ExceptionHandlerEnum.LOG_AND_DISCARD).

bq. Some of the strategy can occur at code-generation time (and could therefore 
apply to engines other than Enumerable).

In the newest commit, I have made changes to ExceptionHandler to make it handle 
exceptions only, rather than handling enumerable directly, so that the handler 
could be used in anywhere.

> Exception-handling in built-in functions
> ----------------------------------------
>
>                 Key: CALCITE-525
>                 URL: https://issues.apache.org/jira/browse/CALCITE-525
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Assignee: Hongze Zhang
>            Priority: Major
>
> The standard calls for certain built-in functions to throw exceptions.
> Examples:
> * 1 / 0
> * MOD(1, 0)
> * OVERLAY('foo' PLACING 'x' FROM -1)
> * 'x' NOT LIKE 'x' ESCAPE 'x'
> First, these exceptions should occur at run time. They should cause the 
> current value to become null, or the row to be omitted, but should not abort 
> the query. (Actual behavior TBD.)
> Second, EnumerableCalc does constant reduction and generates code like 
> 'static final int X = 0 / 0'. This code blows up when the class is loaded. It 
> should not. The code should give errors for each row, as described above.
> While fixing this bug, see SqlOperatorBaseTest.testArgumentBounds and remove 
> restrictions related to /, MOD and OVERLAY, LIKE.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to