Moritz Manner created FLINK-41439:
-------------------------------------

             Summary: XML_STRING can run out of memory for a variant within the 
size limit
                 Key: FLINK-41439
                 URL: https://issues.apache.org/jira/browse/FLINK-41439
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Runtime
            Reporter: Moritz Manner


The output of {{XML_STRING}} isn’t bounded by the size of the input variant. A 
variant stores each key once, but {{XML_STRING}} writes the key name for every 
array item. For an array of nulls it also adds an {{xsi:nil}} attribute to each 
item. So a small variant can turn into a very large string.

{{XmlStringFunction.eval}} rethrows an {{{}OutOfMemoryError{}}}. A single row 
can fail the TaskManager instead of the query failing with a 
{{{}TableRuntimeException{}}}.

The variant and {{JSON_STRING}} write the key once per array, {{XML_STRING}} 
writes it once per item. The table shows the structure with a small example, 
and the measured sizes for a key of 1,000 characters and an array of nulls:
||Nulls||Variant||{{JSON_STRING}}||{{XML_STRING}}||
|2, key {{kkk}} 
(example)|{{{"r":\{"kkk":[null,null]}}}}|{{{"r":\{"kkk":[null,null]}}}}|{{<r 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>}}
{{  <kkk xsi:nil="true"/>}}
{{  <kkk xsi:nil="true"/>}}
{{</r>}}|
|10,000, key of 1,000 chars|31 KB|51,012 chars|10,180,061 chars (328x)|
|3,000,000, key of 1,000 chars|12 MB|–|{{OutOfMemoryError}}|

The last variant is below the variant size limit of 16 MiB. Depending on the 
heap, it fails with {{Java heap space}} or because the output exceeds the 
maximum length of a Java string:
 
 
*How to reproduce:*

 
SELECT XML_STRING(PARSE_JSON(CONCAT(
'\{"r":{"', REPEAT('k', 1000), '":[null', REPEAT(',null', 2999999), ']}}')));



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to