You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Hongze Zhang (JIRA)" <ji...@apache.org> on 2019/05/09 07:11:00 UTC

[jira] [Comment Edited] (CALCITE-3017) Improve null handling of JsonValueExpressionOperator

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

Hongze Zhang edited comment on CALCITE-3017 at 5/9/19 7:10 AM:
---------------------------------------------------------------

I am about to finish a patch resolving this (the work is at https://github.com/zhztheplayer/calcite/tree/3017). The main approach is to remove the implicit add of calls to {{JsonValueExpressionOperator}}, and use Java method overload instead. This way a dejsonized NULL can be wrapped and represent by a {{JsonValueContext}} object.

A downside of removing implicit calls is that users should implement the implicit behavior by themselves. In a sense this is not quite a bad thing because:

 * It reduces complexity;
 * "Implicit" behavior is reasonable to be considered in a lower level/layer.

Also, some minor refactors/changes done:
* Remove {{JsonApiCommonSyntaxOperator}}, the reason to do this is similar: complexity reduced, and more flexibility gained;
* Move JSON processing functions out from {{SqlFunctions}}, create new one named {{JsonFunctions}};
* Rex2Lix: Add explicit cast to Java type for null literal, to avoid error on calling overloaded methods.


was (Author: zhztheplayer):
I am about to finished a patch resolving this (the work is at https://github.com/zhztheplayer/calcite/tree/3017). The main approach is to remove the implicit add of calls to {{JsonValueExpressionOperator}}, and use Java method overload instead. This way a dejsonized NULL can be wrapped and represent by a {{JsonValueContext}} object.

A downside of removing implicit calls is that users should implement the implicit behavior by themselves. In a sense this is not quite a bad thing because:

 * It reduces complexity;
 * "Implicit" behavior is reasonable to be considered in a lower level/layer.

Also, some minor refactors/changes done:
* Remove {{JsonApiCommonSyntaxOperator}}, the reason to do this is similar: complexity reduced, and more flexibility gained;
* Move JSON processing functions out from {{SqlFunctions}}, create new one named {{JsonFunctions}};
* Rex2Lix: Add explicit cast to Java type for null literal, to avoid error on calling overloaded methods.

> Improve null handling of JsonValueExpressionOperator
> ----------------------------------------------------
>
>                 Key: CALCITE-3017
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3017
>             Project: Calcite
>          Issue Type: Sub-task
>            Reporter: Hongze Zhang
>            Assignee: Hongze Zhang
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.20.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> In Calcite's implementation, {{JsonValueExpressionOperator}} currently returns a null value no matter the argument is JSON NULL value or SQL NULL value. But in MySQL, some JSON functions behave differently on different null inputs. For instance for a MySQL JSON function {{JSON_STORAGE_SIZE}}, if we execute:
> {code:sql}
> SELECT JSON_STORAGE_SIZE(null), JSON_STORAGE_SIZE('null')
> {code}
> The result should be:
> ||JSON_STORAGE_SIZE(null)||JSON_STORAGE_SIZE('null')||
> |null|2|
> We should improve the operator a bit to support different behaviors.



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