Hi Moritz, Nice FLIP. The # field is a neat solution, and I checked on master that Variant does sort object keys, so it is doing necessary work.
One small question: what does PARSE_XML do with an xmlns declaration in the input? The parser is not namespace-aware, so xmlns:xsi is an attribute, and by the @name rule it would land as "@xmlns:xsi". If XML_STRING writes that back and also adds its own xmlns:xsi declaration for xsi:nil, the root would carry that attribute twice, which is not well-formed, so that Variant would not round trip. <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <a xsi:nil="true"/> </root> Dropping xmlns at parse time would instead leave other prefixes undeclared. Maybe I am misreading the mapping, but a line either way might help. Best, Sai Krishna Sepuri On Thu, Sep 17, 2026 at 7:51 PM Moritz Manner <[email protected]> wrote: > > Hi Fabian, > > Good point, and I agree this is a real problem. A consistent VARIANT > structure across documents with the same schema is important, especially > for streaming SQL where you don't want CASE WHEN everywhere, or a job > failing because it tries to access an array that doesn't exist. Initially, > the structure optimized for queryability, i.e. a single element stays a > single node instead of an array. But I think consistency should probably > win here. > > The idea would be to make ARRAY the default for all elements, so the > structure stays the same no matter how many elements are actually there. > The downside is that for simple XMLs, where most elements only ever appear > once, you'd need to add [1] everywhere just to access them. > > One option would be to start with ARRAY by default and see how it goes > based on feedback. If it turns out to be too cumbersome for simple XMLs, we > could add an opt-out parameter later, that would be a backward-compatible > addition so it doesn't need to be solved now. > Does this make sense, or is there a better way to approach this? > > Best, > Moritz > > On Thu, 17 Sept 2026 at 15:07, Fabian Hüske via dev <[email protected]> > wrote: > > > Hi everyone and thanks for the proposal Moritz, > > > > The FLIP reads very well and I agree (mostly) with the design. > > > > I have only one concern, which is about the representation of repeated > > elements as arrays. > > I think it is very important that a batch of XML documents with the same > > structure converts into an identical VARIANT structure. > > If I understand the current proposal correctly, this would not be the case > > for two documents: one with a single element and one with a repeated > > element. > > The first document would have a single node, while the second document > > would have an array. > > If you want to access the nodes, you would need a cumbersome CASE WHEN > > construct to handle both cases. > > It would be better to convert both documents into a VARIANT containing an > > ARRAY (one only holding a single element). > > > > Since deriving the right conversion strategy from a single XML document > > isn't possible, could we add an optional argument to pass conversion hints? > > There might be other solutions to this problem. > > > > IMO, it would also be fine to continue with this FLIP and address this > > issue later, but having a proposal for it would be good. > > Do you have any thoughts on this, Moritz? > > > > Best, Fabian > > > > > > On Mon, Sep 14, 2026 at 11:37 AM Timo Walther <[email protected]> wrote: > > > > > Hi Moritz, > > > > > > this is an excellent design document with the right level of detail. I > > > really like the design, it is a nice mixture of concerns. The result of > > > PARSE_XML looks and feels like a VARIANT while the XML content is > > > preserved in a lossless fashion and all attributes and text is > > > accessible. It is a nice combination of what other vendors offer (modulo > > > the historical legacy they have to deal with). > > > > > > Looking at various UDF implementations, XML handling is by far the most > > > important reason for the need of a custom function. So +1 for this FLIP. > > > > > > Thanks, > > > Timo > > > > > > On 11.09.26 14:54, Moritz Manner wrote: > > > > Hey everyone, > > > > > > > > I'd like to start a discussion on FLIP-612: Native XML Functions for > > > Flink > > > > SQL [1]. > > > > > > > > The goal is native XML parsing in Flink SQL, parsing XML into a VARIANT > > > > instead of requiring custom UDFs. > > > > > > > > The FLIP proposes three functions. PARSE_XML and TRY_PARSE_XML turn an > > > XML > > > > string into a VARIANT, and XML_STRING turns a VARIANT back into an XML > > > > string. > > > > This mirrors the existing JSON functions PARSE_JSON, TRY_PARSE_JSON, > > and > > > > JSON_STRING. > > > > > > > > Once XML is a VARIANT, you query it the same way as the output of > > > PARSE_JSON: > > > > with the variant accessors (variant.key, variant['key'], > > variant[index]) > > > > and a CAST to the type you need. > > > > > > > > The main part is the XML→VARIANT mapping: attributes and text go into > > @/$ > > > > fields, and since Variant objects store fields sorted by key rather > > than > > > in > > > > document order, a # field is used to recover the original order between > > > > differently-named siblings. Details and examples are in the FLIP. > > > > > > > > It's a small, additive API, no new SQL grammar or Table API methods > > > needed. > > > > > > > > Looking forward to your thoughts! > > > > > > > > Best, > > > > Moritz > > > > > > > > [1] > > > > > > > > > https://urldefense.com/v3/__https://cwiki.apache.org/confluence/spaces/FLINK/pages/451974259/FLIP-612*Native*XML*Functions*for*Flink*SQL__;KysrKysr!!Ayb5sqE7!pusFK_SVIXLRWBYFy7nKxC-f5N7Uj1ePbB2T6nFANBnqs-0S_zubmv9UygMYHTQQ1LFe9LUt4tGSVL3srSc$ > > > > > > > >
