Details
Description
Filing this for https://www.mail-archive.com/maria-developers@lists.launchpad.net/msg12296.html
At the moment MariaDB requires that the values in DEFAULT clauses are quoted.
Example:
select * |
from |
json_table(
|
'{"intval": 1000}', |
'$' columns( |
col1 int path '$.intval_' |
default '100' on empty |
)
|
) as T; |
here, "100" must be quoted, otherwise one gets a parse error. However, the quoted value is interpreted as an SQL literal. This looks puzzling.
MySQL-8 also requires that the default value is quoted, but they have a (very odd) reason for it: they interpret the default value as JSON:
https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-table-functions.html
says:
DEFAULT json_string ON EMPTY: the provided json_string is parsed as JSON, as
long as it is valid, and stored instead of the missing value. Column type
rules also apply to the default value.
I am not sure why MySQL chose to do this. Looking into the SQL Standard, one
can see:
<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>
|
This doesn't say whether the <value expression> should be interepreted as JSON
or just as a value. But one can find this passage:
Without Feature T826, "General value expression in ON ERROR or ON EMPTY
|
clauses", the <value
|
expression> contained in <JSON table column empty behavior> or <JSON table
|
column error behavior>
|
contained in a <JSON table regular column definition> JTRCD shall be a
|
<literal> that can be cast to the
|
data type specified by the <data type> contained in JTRCD without raising an
|
exception condition
|
according to the General Rules of Subclause 6.13, "<cast specification>".
|
The important part is:
... shall be a <literal> that can be cast to the data type specified ...
|
which means it is not JSON. It is just a literal, and literal can be a string
literal (in quotes, 'string') or an integer literal (without quotes) or other
kind of literal.
Btw, Oracle Database allows non-string literals in the default clause:
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9af7e43ede77ee285e1a65f1f419d3bd
Attachments
Activity
Field | Original Value | New Value |
---|---|---|
Description |
Filing this for https://www.mail-archive.com/maria-developers@lists.launchpad.net/msg12296.html
At the moment MariaDB requires that the values in DEFAULT clauses are quoted. Example: {code:sql} select * from json_table( '{"intval": 1000}', '$' columns( col1 int path '$.intval_' default '100' on empty ) ) as T; {code} here, "100" must be quoted, otherwise one gets a parse error. However, the quoted value is interpreted as an SQL literal. This looks puzzling. MySQL-8 also requires that the default value is quoted, but they have a (very odd) reason for it: they interpret the default value as JSON: https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-table-functions.html says: {quote} DEFAULT json_string ON EMPTY: the provided json_string is parsed as JSON, as long as it is valid, and stored instead of the missing value. Column type rules also apply to the default value. {quote} I am not sure why MySQL chose to do this. Looking into the SQL Standard, one can see: {quote} <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> {quote} This doesn't say whether the <value expression> should be interepreted as JSON or just as a value. But one can find this passage: {quote} <quote> Without Feature T826, "General value expression in ON ERROR or ON EMPTY clauses", the <value expression> contained in <JSON table column empty behavior> or <JSON table column error behavior> contained in a <JSON table regular column definition> JTRCD shall be a <literal> that can be cast to the data type specified by the <data type> contained in JTRCD without raising an exception condition according to the General Rules of Subclause 6.13, "<cast specification>". </quote> {quote} The important part is: {quote} ... shall be a <literal> that can be cast to the data type specified ... {quote} which means it is not JSON. It is just a literal, and literal can be a string literal (in quotes, 'string') or an integer literal (without quotes) or other kind of literal. Btw, Oracle Database allows non-string literals in the default clause: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9af7e43ede77ee285e1a65f1f419d3bd |
Filing this for https://www.mail-archive.com/maria-developers@lists.launchpad.net/msg12296.html
At the moment MariaDB requires that the values in DEFAULT clauses are quoted. Example: {code:sql} select * from json_table( '{"intval": 1000}', '$' columns( col1 int path '$.intval_' default '100' on empty ) ) as T; {code} here, "100" must be quoted, otherwise one gets a parse error. However, the quoted value is interpreted as an SQL literal. This looks puzzling. MySQL-8 also requires that the default value is quoted, but they have a (very odd) reason for it: they interpret the default value as JSON: https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-table-functions.html says: {quote} DEFAULT json_string ON EMPTY: the provided json_string is parsed as JSON, as long as it is valid, and stored instead of the missing value. Column type rules also apply to the default value. {quote} I am not sure why MySQL chose to do this. Looking into the SQL Standard, one can see: {code} <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> {code} This doesn't say whether the <value expression> should be interepreted as JSON or just as a value. But one can find this passage: {code} Without Feature T826, "General value expression in ON ERROR or ON EMPTY clauses", the <value expression> contained in <JSON table column empty behavior> or <JSON table column error behavior> contained in a <JSON table regular column definition> JTRCD shall be a <literal> that can be cast to the data type specified by the <data type> contained in JTRCD without raising an exception condition according to the General Rules of Subclause 6.13, "<cast specification>". {code} The important part is: {code} ... shall be a <literal> that can be cast to the data type specified ... {code} which means it is not JSON. It is just a literal, and literal can be a string literal (in quotes, 'string') or an integer literal (without quotes) or other kind of literal. Btw, Oracle Database allows non-string literals in the default clause: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9af7e43ede77ee285e1a65f1f419d3bd |
Status | Open [ 1 ] | Confirmed [ 10101 ] |
Assignee | Alexey Botchkov [ holyfoot ] | Sergei Petrunia [ psergey ] |
Status | Confirmed [ 10101 ] | In Review [ 10002 ] |
Assignee | Sergei Petrunia [ psergey ] | Alexey Botchkov [ holyfoot ] |
Status | In Review [ 10002 ] | Stalled [ 10000 ] |
Status | Stalled [ 10000 ] | In Progress [ 3 ] |
Assignee | Alexey Botchkov [ holyfoot ] | Sergei Petrunia [ psergey ] |
Status | In Progress [ 3 ] | In Review [ 10002 ] |
Workflow | MariaDB v3 [ 122334 ] | MariaDB v4 [ 143793 ] |
Priority | Major [ 3 ] | Critical [ 2 ] |
Assignee | Sergei Petrunia [ psergey ] | Alexey Botchkov [ holyfoot ] |
Status | In Review [ 10002 ] | Stalled [ 10000 ] |
Status | Stalled [ 10000 ] | In Progress [ 3 ] |
Assignee | Alexey Botchkov [ holyfoot ] | Sergei Petrunia [ psergey ] |
Fix Version/s | 10.6.20 [ 29903 ] | |
Fix Version/s | 10.11.10 [ 29904 ] | |
Fix Version/s | 11.2.6 [ 29906 ] | |
Fix Version/s | 11.4.4 [ 29907 ] | |
Fix Version/s | 11.6.2 [ 29908 ] | |
Fix Version/s | 11.7.1 [ 29913 ] | |
Fix Version/s | 10.6 [ 24028 ] | |
Resolution | Fixed [ 1 ] | |
Status | In Progress [ 3 ] | Closed [ 6 ] |
A patch by Alexey: https://github.com/MariaDB/server/commit/9c518e4cc9b0569cae2daa5a4024e209293eca45