Stamatis, how were you using FORMAT JSON? One thing I found is that you have to put it on every JSON-producing function
On Tue, Mar 22, 2022 at 4:25 AM Stamatis Zampetakis <[email protected]> wrote: > I left some comments under CALCITE-4989 with respect to FORMAT JSON etc. If > it really solves the problem can someone update the JIRA accordingly? > > Best, > Stamatis > > [1] https://issues.apache.org/jira/browse/CALCITE-4989 > > On Tue, Mar 22, 2022 at 3:56 AM Gavin Ray <[email protected]> wrote: > > > Wow, really appreciate you taking the time to explain how it works. > > > > Now just need to modify my PR to get this one-line change into the SQL > > parser so that it accepts sub-expressions in JSON queries > > (the other changes in that PR are invalid and should be dropped) > > > > > > > https://github.com/apache/calcite/pull/2730/files#diff-e873041549333502af52ece8a1b34301ae5a059ff4719e9bddbaef48929e7047 > > > > One thing that seems odd though -- looking at > > "SqlJsonValueExpressionOperator" the definition seems to imply "FORMAT > > JSON": > > > > > https://github.com/apache/calcite/blob/170035fd97df1afdd0c0a499f63e0ca1606f7837/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonValueExpressionOperator.java#L33 > > > > public SqlJsonValueExpressionOperator() { > > super("FORMAT JSON", SqlKind.JSON_VALUE_EXPRESSION, 28, > > ReturnTypes.explicit(SqlTypeName.ANY) > > .andThen(SqlTypeTransforms.TO_NULLABLE), > > null, OperandTypes.CHARACTER); > > } > > > > Could it be possible that manually adding it FORMAT JSON makes it apply > > twice, or I wonder why it's not doing this by default? > > > > > > > > On Mon, Mar 21, 2022 at 8:06 PM Benchao Li <[email protected]> wrote: > > > > > Gavin, > > > > > > "FORMAT JSON" is an operator, it converts the json string into an > > internal > > > `JsonValueContext`[1], > > > and the `JsonValueContext` holds the deserialized json object which > will > > be > > > further used by > > > the following json functions. > > > > > > "FORMAT JSON" is just one choice of "JSON output clause", which is > stated > > > in the standard as: > > > <JSON output clause> ::= > > > RETURNING <data type> > > > [ FORMAT <JSON representation> ] > > > <JSON representation> ::= > > > JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] > > > | <implementation-defined JSON representation option> > > > > > > Other options could be "FORMAT AVRO", "FORMAT BSON" (which is not > > > implemented yet in calcite). > > > > > > "JSON output clause" only controls the serialization format for json > > > function's output, > > > and "JSON FORMAT" should be the default. Hence the behavior without > > "FORMAT > > > JSON" > > > should be corrected IMHO. > > > > > > [1] > > > > > > > > > https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java#L101 > > > > > > Gavin Ray <[email protected]> 于2022年3月22日周二 03:48写道: > > > > > > > Benchao, > > > > > > > > I owe you a beer, thank you!! > > > > Using FORMAT JSON fixes everything -- it just has to be specified on > > > every > > > > JSON function. > > > > > > > > See images below if curious: > > > > > > > > Without FORMAT JSON: > > > > https://i.imgur.com/ekgFXqe.png > > > > > > > > With FORMAT JSON: > > > > https://i.imgur.com/8lHIqUZ.png > > > > > > > > This is fantastic news =D > > > > Now I am just curious how the "FORMAT JSON" modifier works. > > > > > > > > On Sun, Mar 20, 2022 at 10:42 PM Gavin Ray <[email protected]> > > > wrote: > > > > > > > > > Hot damn, you're right -- that doesn't look like it's > double-escaped! > > > > > I will try to this out ASAP and post an update here, thank you for > > the > > > > tip > > > > > =) > > > > > > > > > > > > > > > On Sun, Mar 20, 2022 at 8:51 PM Benchao Li <[email protected]> > > > wrote: > > > > > > > > > >> Hi Gavin, > > > > >> > > > > >> Have you ever tried 'FORMAT JSON' like this[1], the tests show > that > > > the > > > > >> result of 'format json' is what you want. > > > > >> > > > > >> [1] > > > > >> > > > > >> > > > > > > > > > > https://github.com/apache/calcite/blob/master/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java#L4381 > > > > >> > > > > >> > > > > >> Gavin Ray <[email protected]> 于2022年3月19日周六 05:19写道: > > > > >> > > > > >> > That sounds very reasonable to me > > > > >> > > > > > >> > I don't know the Calcite codebase as well as other folks -- and > > > > >> certainly > > > > >> > not nearly as well as you > > > > >> > Where would be the place to put such a thing/the overall > approach? > > > > >> > > > > > >> > On Fri, Mar 18, 2022 at 1:53 PM Julian Hyde < > > [email protected] > > > > > > > > >> > wrote: > > > > >> > > > > > >> > > I think you’re proposing making the JSON_ functions smarter at > > > > >> runtime. > > > > >> > My > > > > >> > > general philosophy is to have the smarts at prepare time and > > make > > > > the > > > > >> > > runtime operators dumb. I think that philosophy can be applied > > > here. > > > > >> Some > > > > >> > > extra logic would kick in when preparing a query that has > JSON_ > > > > >> > functions, > > > > >> > > and that logic would fold together multiple nested JSON_ > > > functions. > > > > >> > Perhaps > > > > >> > > we need to add a new (internal) JSON_ function that can do all > > of > > > > the > > > > >> > steps. > > > > >> > > > > > > >> > > Julian > > > > >> > > > > > > >> > > > > > > >> > > > On Mar 18, 2022, at 8:50 AM, Gavin Ray < > [email protected] > > > > > > > >> wrote: > > > > >> > > > > > > > >> > > > Sorry to beat a dead horse here, but I'm one of those > weirdos > > > that > > > > >> > gets a > > > > >> > > > lot of use out of Calcite's JSON operators. > > > > >> > > > Calcite's JSON implementation is broken for queries that > have > > > more > > > > >> than > > > > >> > > one > > > > >> > > > depth of JSON object/array calls. > > > > >> > > > > > > > >> > > > The reason is because the operator calls "jsonize()", which > > > parses > > > > >> the > > > > >> > > > (presumably) JVM object as a JSON string > > > > >> > > > This works for something like Map<String, String>, but if > you > > > have > > > > >> > > > Map<String, Map<String, String>>, what happens is this: > > > > >> > > > > > > > >> > > > JSON_OBJECT( > > > > >> > > > foo: 1, > > > > >> > > > bar: JSON_OBJECT( > > > > >> > > > qux: 2 > > > > >> > > > ) > > > > >> > > > ) > > > > >> > > > > > > > >> > > > The parse happens inside-out, so first we get the innermost > > > object > > > > >> > > parsed, > > > > >> > > > which gives: > > > > >> > > > > > > > >> > > > { "qux": 2 } > > > > >> > > > > > > > >> > > > But -- as a string! This is important! > > > > >> > > > Now, when we parse the next object, we get this: > > > > >> > > > > > > > >> > > > { "foo": 1, "bar": \"{ \"qux\": 2 }\" } > > > > >> > > > > > > > >> > > > This is because the object with "qux" isn't an object, but a > > > > string > > > > >> > value > > > > >> > > > Which to be valid JSON, needs to have its quotes and braces > > > > escaped > > > > >> > > > > > > > >> > > > Definitely not what you want, and the value isn't usable =( > > > > >> > > > > > > > >> > > > Since there is no state/context/stack (that I can tell) when > > the > > > > >> parse > > > > >> > > > function is called, > > > > >> > > > how might it be possible to write something to the effect > of: > > > > >> > > > > > > > >> > > > "Analyze the query, and if the number of JSON operations is > > > > greater > > > > >> > than > > > > >> > > > one, > > > > >> > > > only call 'jsonize()' on the outer-most parse/object." > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > https://github.com/apache/calcite/blob/8d21c3f2f0b75d788e70bbeea9746695f2fde552/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java#L1886-L1891 > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > https://github.com/apache/calcite/blob/4bc916619fd286b2c0cc4d5c653c96a68801d74e/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java#L93-L95 > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > >> -- > > > > >> > > > > >> Best, > > > > >> Benchao Li > > > > >> > > > > > > > > > > > > > > > > > > -- > > > > > > Best, > > > Benchao Li > > > > > >
