You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Eames Trinh (Jira)" <ji...@apache.org> on 2026/08/16 23:01:00 UTC

[jira] [Created] (SPARK-58816) INSERT with a column list resolves structs inside arrays and maps by name instead of position

Eames Trinh created SPARK-58816:
-----------------------------------

             Summary: INSERT with a column list resolves structs inside arrays and maps by name instead of position
                 Key: SPARK-58816
                 URL: https://issues.apache.org/jira/browse/SPARK-58816
             Project: Spark
          Issue Type: Bug
          Components: Bug
    Affects Versions: 3.3.0
            Reporter: Eames Trinh


h3. Problem

For {{{}INSERT INTO table (column_list){}}}, nested structs should be resolved by position.

Spark currently behaves inconsistently:
 * Direct structs are resolved by position.
 * Structs inside arrays and maps are resolved by name.

This can silently write values into different fields depending only on where the struct is nested.
h3. Reproduction
{code:java}
CREATE TABLE target (
  s   STRUCT<x: INT, y: INT>,
  arr ARRAY<STRUCT<x: INT, y: INT>>,
  m   MAP<STRING, STRUCT<x: INT, y: INT>>
) USING parquet;

INSERT INTO target (s, arr, m)
SELECT
  named_struct('y', 20, 'x', 10),
  array(named_struct('y', 20, 'x', 10)),
  map('k', named_struct('y', 20, 'x', 10));

SELECT
  to_json(s) AS direct_struct,
  to_json(arr[0]) AS array_struct,
  to_json(m['k']) AS map_struct
FROM target; {code}
h3. Expected result

All three structs should be resolved by position: {{{"x":20,"y":10}}}
h3. Actual result

Only the direct struct is resolved by position. For the array and map structs we get: {{{"x":10,"y":20}}}
h2. Root cause

{{ResolveInsertionBase.createProjectForByNameQuery}} adds a projection that renames direct struct fields according to their positions. However, {{renameFieldsInStruct}} only recurses through {{{}StructType{}}}; it does not descend into {{ArrayType}} or {{{}MapType{}}}.

Consequently, field names inside arrays and maps remain unchanged, and {{TableOutputResolver}} later resolves those nested structs by name.
h2. Proposed behavior

For {{{}INSERT INTO table (column_list){}}}, struct fields should be resolved positionally at every nesting level, including:
 * Array elements
 * Map keys
 * Map values

The projection’s field-renaming logic should recursively traverse arrays and maps, or the resolver should otherwise preserve positional semantics throughout the nested type.
h2. Impact

Queries can silently write values into the wrong nested fields when source and target struct field names differ in order. The behavior is also inconsistent with direct structs and with the positional semantics of {{INSERT INTO}} column lists.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org