[ 
https://issues.apache.org/jira/browse/CALCITE-2871?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hongze Zhang updated CALCITE-2871:
----------------------------------
    Description: 
Below is the syntax of JSON_TABLE published by ISO/IEC TR 19075-5[1]:
{code}
<JSON table> ::=
        JSON_TABLE <left paren>
        <JSON API common syntax>
        <JSON table columns clause>
         [ <JSON table plan clause> ]
         [ <JSON table error behavior> ON ERROR ]
        <right paren>
        
<JSON table columns clause> ::=
        COLUMNS <left paren>
                <JSON table column definition>
                [ { <comma> <JSON table column definition> }... ]
                <right paren>
                
<JSON table column definition> ::=
        <JSON table ordinality column definition>
        | <JSON table regular column definition>
        | <JSON table formatted column definition>
        | <JSON table nested columns>

<JSON table ordinality column definition> ::=
        <column name> FOR ORDINALITY
        
<JSON table regular column definition> ::=
        <column name> <data type>
         [ PATH <JSON table column path specification> ]
         [ <JSON table column empty behavior> ON EMPTY ]
         [ <JSON table column error behavior> ON ERROR ]
         
<JSON table column empty behavior> ::=
        ERROR
        | NULL
        | DEFAULT <value expression>
        
<JSON table column error behavior> ::=
        ERROR
        | NULL
        | DEFAULT <value expression>
        
<JSON table column path specification> ::=
        <JSON path specification>

<JSON table formatted column definition> ::=
        <column name> <data type>
        FORMAT <JSON representation>
        [ PATH <JSON table column path specification> ]
        [ <JSON table formatted column wrapper behavior> WRAPPER ]
        [ <JSON table formatted column quotes behavior> QUOTES
                [ ON SCALAR STRING ] ]
        [ <JSON table formatted column empty behavior> ON EMPTY ]
        [ <JSON table formatted column error behavior> ON ERROR ]

<JSON table formatted column wrapper behavior> ::=
        WITHOUT [ ARRAY ]
        | WITH [ CONDITIONAL | UNCONDITIONAL ] [ ARRAY ]
        
<JSON table formatted column quotes behavior> ::=
        KEEP
        | OMIT
        
<JSON table formatted column empty behavior> ::=
        ERROR
        | NULL
        | EMPTY ARRAY
        | EMPTY OBJECT
        
<JSON table formatted column error behavior> ::=
        ERROR
        | NULL
        | EMPTY ARRAY
        | EMPTY OBJECT

<JSON table error behavior> ::=
        ERROR
        | EMPTY

<JSON table nested columns> ::=
        NESTED [ PATH ] <JSON table nested path specification>
        [ AS <JSON table nested path name> ]
        <JSON table columns clause>

<JSON table nested path specification> ::=
        <JSON path specification>

<JSON table nested path name> ::=
        <JSON table path name>

<JSON table path name> ::=
        <identifier>
        
<JSON table plan clause> ::=
        <JSON table specific plan>
        | <JSON table default plan>

<JSON table specific plan> ::=
        PLAN <left paren> <JSON table plan> <right paren>

<JSON table plan> ::=
        <JSON table path name>
        | <JSON table plan parent/child>
        | <JSON table plan sibling>

<JSON table plan parent/child> ::=
        <JSON table plan outer>
        | <JSON table plan inner>
        
<JSON table plan outer> ::=
        <JSON table path name> OUTER <JSON table plan primary>
        
<JSON table plan inner> ::=
        <JSON table path name> INNER <JSON table plan primary>
        
<JSON table plan sibling> ::=
        <JSON table plan union>
        | <JSON table plan cross>
        
<JSON table plan union> ::=
        <JSON table plan primary> UNION <JSON table plan primary>
        [ { UNION <JSON table plan primary> }... ]

<JSON table plan cross> ::=
        <JSON table plan primary> CROSS <JSON table plan primary>
        [ { CROSS <JSON table plan primary> }... ]
        
<JSON table plan primary> ::=
        <JSON table path name>
        | <left paren> <JSON table plan> <right paren>
        
<JSON table default plan> ::=
        PLAN DEFAULT <left paren> <JSON table default plan choices> <right 
paren>

<JSON table default plan choices> ::=
        <JSON table default plan inner/outer>
        [ <comma> <JSON table default plan union/cross> ]
        | <JSON table default plan union/cross>
        [ <comma> <JSON table default plan inner/outer> ]
        
<JSON table default plan inner/outer> ::=
        INNER
        | OUTER
        
<JSON table default plan union/cross> ::=
        UNION
        | CROSS
{code}

A usage example:
{code:sql}
SELECT bookclub.id, jt.name, jt.type, jt.number
    FROM bookclub,
        JSON_TABLE ( bookclub.jcol, 'lax $'
                     COLUMNS ( name VARCHAR(30) PATH 'lax $.Name',
                               NESTED PATH 'lax $.phoneNumber[*]'
                               COLUMNS ( type VARCHAR(10) PATH 'lax $.type',
                                           number CHAR(12) PATH 'lax $.number' )
                                ) AS jt;
{code}

As another reference, Oracle has a non-standard implementation[2] of this 
function.


[1] 
http://standards.iso.org/ittf/PubliclyAvailableStandards/c065143_ISO_IEC_TR_19075-5_2016.zip
[2] https://docs.oracle.com/database/121/SQLRF/functions092.htm#SQLRF56973

  was:
Below is the syntax of JSON_TABLE published by ISO/IEC TR 19075-5[1]:
{code}
<JSON table> ::=
        JSON_TABLE <left paren>
        <JSON API common syntax>
        <JSON table columns clause>
         [ <JSON table plan clause> ]
         [ <JSON table error behavior> ON ERROR ]
        <right paren>
        
<JSON table columns clause> ::=
        COLUMNS <left paren>
                <JSON table column definition>
                [ { <comma> <JSON table column definition> }... ]
                <right paren>
                
<JSON table column definition> ::=
                <JSON table ordinality column definition>
        | <JSON table regular column definition>
        | <JSON table formatted column definition>
        | <JSON table nested columns>

<JSON table ordinality column definition> ::=
        <column name> FOR ORDINALITY
        
<JSON table regular column definition> ::=
        <column name> <data type>
         [ PATH <JSON table column path specification> ]
         [ <JSON table column empty behavior> ON EMPTY ]
         [ <JSON table column error behavior> ON ERROR ]
         
<JSON table column empty behavior> ::=
        ERROR
        | NULL
        | DEFAULT <value expression>
        
<JSON table column error behavior> ::=
        ERROR
        | NULL
        | DEFAULT <value expression>
        
<JSON table column path specification> ::=
        <JSON path specification>

<JSON table formatted column definition> ::=
        <column name> <data type>
        FORMAT <JSON representation>
        [ PATH <JSON table column path specification> ]
        [ <JSON table formatted column wrapper behavior> WRAPPER ]
        [ <JSON table formatted column quotes behavior> QUOTES
                [ ON SCALAR STRING ] ]
        [ <JSON table formatted column empty behavior> ON EMPTY ]
        [ <JSON table formatted column error behavior> ON ERROR ]

<JSON table formatted column wrapper behavior> ::=
        WITHOUT [ ARRAY ]
        | WITH [ CONDITIONAL | UNCONDITIONAL ] [ ARRAY ]
        
<JSON table formatted column quotes behavior> ::=
        KEEP
        | OMIT
        
<JSON table formatted column empty behavior> ::=
        ERROR
        | NULL
        | EMPTY ARRAY
        | EMPTY OBJECT
        
<JSON table formatted column error behavior> ::=
        ERROR
        | NULL
        | EMPTY ARRAY
        | EMPTY OBJECT

<JSON table error behavior> ::=
        ERROR
        | EMPTY
{code}

A usage example:
{code:sql}
SELECT bookclub.id, jt.name, jt.type, jt.number
    FROM bookclub,
        JSON_TABLE ( bookclub.jcol, 'lax $'
                     COLUMNS ( name VARCHAR(30) PATH 'lax $.Name',
                               NESTED PATH 'lax $.phoneNumber[*]'
                               COLUMNS ( type VARCHAR(10) PATH 'lax $.type',
                                           number CHAR(12) PATH 'lax $.number' )
                                ) AS jt;
{code}

As another reference, Oracle has a non-standard implementation[2] of this 
function.


[1] 
http://standards.iso.org/ittf/PubliclyAvailableStandards/c065143_ISO_IEC_TR_19075-5_2016.zip
[2] https://docs.oracle.com/database/121/SQLRF/functions092.htm#SQLRF56973


> Implement JSON_TABLE table function
> -----------------------------------
>
>                 Key: CALCITE-2871
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2871
>             Project: Calcite
>          Issue Type: Sub-task
>            Reporter: Hongze Zhang
>            Priority: Major
>
> Below is the syntax of JSON_TABLE published by ISO/IEC TR 19075-5[1]:
> {code}
> <JSON table> ::=
>       JSON_TABLE <left paren>
>       <JSON API common syntax>
>       <JSON table columns clause>
>        [ <JSON table plan clause> ]
>        [ <JSON table error behavior> ON ERROR ]
>       <right paren>
>       
> <JSON table columns clause> ::=
>       COLUMNS <left paren>
>               <JSON table column definition>
>               [ { <comma> <JSON table column definition> }... ]
>               <right paren>
>               
> <JSON table column definition> ::=
>       <JSON table ordinality column definition>
>       | <JSON table regular column definition>
>       | <JSON table formatted column definition>
>       | <JSON table nested columns>
> <JSON table ordinality column definition> ::=
>       <column name> FOR ORDINALITY
>       
> <JSON table regular column definition> ::=
>       <column name> <data type>
>        [ PATH <JSON table column path specification> ]
>        [ <JSON table column empty behavior> ON EMPTY ]
>        [ <JSON table column error behavior> ON ERROR ]
>        
> <JSON table column empty behavior> ::=
>       ERROR
>       | NULL
>       | DEFAULT <value expression>
>       
> <JSON table column error behavior> ::=
>       ERROR
>       | NULL
>       | DEFAULT <value expression>
>       
> <JSON table column path specification> ::=
>       <JSON path specification>
> <JSON table formatted column definition> ::=
>       <column name> <data type>
>       FORMAT <JSON representation>
>       [ PATH <JSON table column path specification> ]
>       [ <JSON table formatted column wrapper behavior> WRAPPER ]
>       [ <JSON table formatted column quotes behavior> QUOTES
>               [ ON SCALAR STRING ] ]
>       [ <JSON table formatted column empty behavior> ON EMPTY ]
>       [ <JSON table formatted column error behavior> ON ERROR ]
> <JSON table formatted column wrapper behavior> ::=
>       WITHOUT [ ARRAY ]
>       | WITH [ CONDITIONAL | UNCONDITIONAL ] [ ARRAY ]
>       
> <JSON table formatted column quotes behavior> ::=
>       KEEP
>       | OMIT
>       
> <JSON table formatted column empty behavior> ::=
>       ERROR
>       | NULL
>       | EMPTY ARRAY
>       | EMPTY OBJECT
>       
> <JSON table formatted column error behavior> ::=
>       ERROR
>       | NULL
>       | EMPTY ARRAY
>       | EMPTY OBJECT
> <JSON table error behavior> ::=
>       ERROR
>       | EMPTY
> <JSON table nested columns> ::=
>       NESTED [ PATH ] <JSON table nested path specification>
>       [ AS <JSON table nested path name> ]
>       <JSON table columns clause>
> <JSON table nested path specification> ::=
>       <JSON path specification>
> <JSON table nested path name> ::=
>       <JSON table path name>
> <JSON table path name> ::=
>       <identifier>
>       
> <JSON table plan clause> ::=
>       <JSON table specific plan>
>       | <JSON table default plan>
> <JSON table specific plan> ::=
>       PLAN <left paren> <JSON table plan> <right paren>
> <JSON table plan> ::=
>       <JSON table path name>
>       | <JSON table plan parent/child>
>       | <JSON table plan sibling>
> <JSON table plan parent/child> ::=
>       <JSON table plan outer>
>       | <JSON table plan inner>
>       
> <JSON table plan outer> ::=
>       <JSON table path name> OUTER <JSON table plan primary>
>       
> <JSON table plan inner> ::=
>       <JSON table path name> INNER <JSON table plan primary>
>       
> <JSON table plan sibling> ::=
>       <JSON table plan union>
>       | <JSON table plan cross>
>       
> <JSON table plan union> ::=
>       <JSON table plan primary> UNION <JSON table plan primary>
>       [ { UNION <JSON table plan primary> }... ]
> <JSON table plan cross> ::=
>       <JSON table plan primary> CROSS <JSON table plan primary>
>       [ { CROSS <JSON table plan primary> }... ]
>       
> <JSON table plan primary> ::=
>       <JSON table path name>
>       | <left paren> <JSON table plan> <right paren>
>       
> <JSON table default plan> ::=
>       PLAN DEFAULT <left paren> <JSON table default plan choices> <right 
> paren>
> <JSON table default plan choices> ::=
>       <JSON table default plan inner/outer>
>       [ <comma> <JSON table default plan union/cross> ]
>       | <JSON table default plan union/cross>
>       [ <comma> <JSON table default plan inner/outer> ]
>       
> <JSON table default plan inner/outer> ::=
>       INNER
>       | OUTER
>       
> <JSON table default plan union/cross> ::=
>       UNION
>       | CROSS
> {code}
> A usage example:
> {code:sql}
> SELECT bookclub.id, jt.name, jt.type, jt.number
>     FROM bookclub,
>         JSON_TABLE ( bookclub.jcol, 'lax $'
>                      COLUMNS ( name VARCHAR(30) PATH 'lax $.Name',
>                                NESTED PATH 'lax $.phoneNumber[*]'
>                                COLUMNS ( type VARCHAR(10) PATH 'lax $.type',
>                                            number CHAR(12) PATH 'lax 
> $.number' )
>                                 ) AS jt;
> {code}
> As another reference, Oracle has a non-standard implementation[2] of this 
> function.
> [1] 
> http://standards.iso.org/ittf/PubliclyAvailableStandards/c065143_ISO_IEC_TR_19075-5_2016.zip
> [2] https://docs.oracle.com/database/121/SQLRF/functions092.htm#SQLRF56973



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

Reply via email to