@@ -92,6 +92,118 @@ def test_json_type_with_cast(self, engine):
9292 ).fetchone ()
9393 assert result .json_types == {"str" : "value" , "num" : 42 , "bool" : True , "nil" : None }
9494
95+ def test_select_nested_struct_query (self , engine ):
96+ """Test SELECT query with nested STRUCT (ROW) types (Issue #627)."""
97+ engine , conn = engine
98+
99+ # Test single level nested struct (simulating Issue #627 scenario)
100+ query = sqlalchemy .text (
101+ """
102+ SELECT
103+ CAST(ROW(
104+ ROW('2024-01-01', 123),
105+ CAST(4.736 AS DOUBLE),
106+ CAST(0.583 AS DOUBLE)
107+ ) AS ROW(header ROW(stamp VARCHAR, seq INTEGER), x DOUBLE, y DOUBLE)) as positions
108+ """
109+ )
110+ result = conn .execute (query ).fetchone ()
111+ assert result is not None
112+ assert result .positions is not None
113+ assert isinstance (result .positions , dict )
114+ assert "header" in result .positions
115+ assert isinstance (result .positions ["header" ], dict )
116+ assert result .positions ["header" ]["stamp" ] == "2024-01-01"
117+ assert result .positions ["header" ]["seq" ] == 123
118+ assert result .positions ["x" ] == 4.736
119+ assert result .positions ["y" ] == 0.583
120+
121+ # Test double nested struct
122+ query = sqlalchemy .text (
123+ """
124+ SELECT
125+ CAST(ROW(
126+ ROW(ROW('value')),
127+ 123
128+ ) AS ROW(level1 ROW(level2 ROW(level3 VARCHAR)), field INTEGER)) as data
129+ """
130+ )
131+ result = conn .execute (query ).fetchone ()
132+ assert result is not None
133+ assert result .data ["level1" ]["level2" ]["level3" ] == "value"
134+ assert result .data ["field" ] == 123
135+
136+ # Test multiple nested fields
137+ query = sqlalchemy .text (
138+ """
139+ SELECT
140+ CAST(ROW(
141+ ROW(1, 2),
142+ ROW(CAST(0.5 AS DOUBLE), CAST(0.3 AS DOUBLE)),
143+ 12345
144+ ) AS ROW(
145+ pos ROW(x INTEGER, y INTEGER),
146+ vel ROW(x DOUBLE, y DOUBLE),
147+ timestamp INTEGER
148+ )) as data
149+ """
150+ )
151+ result = conn .execute (query ).fetchone ()
152+ assert result is not None
153+ assert result .data ["pos" ]["x" ] == 1
154+ assert result .data ["pos" ]["y" ] == 2
155+ assert result .data ["vel" ]["x" ] == 0.5
156+ assert result .data ["vel" ]["y" ] == 0.3
157+ assert result .data ["timestamp" ] == 12345
158+
159+ def test_select_array_with_nested_struct (self , engine ):
160+ """Test SELECT query with ARRAY containing nested STRUCT (Issue #627)."""
161+ engine , conn = engine
162+
163+ # Array with nested structs (simulating Issue #627 scenario)
164+ query = sqlalchemy .text (
165+ """
166+ SELECT
167+ CAST(ARRAY[
168+ ROW(
169+ ROW('2024-01-01', 123),
170+ CAST(4.736 AS DOUBLE)
171+ )
172+ ] AS ARRAY<ROW(header ROW(stamp VARCHAR, seq INTEGER), x DOUBLE)>) as positions
173+ """
174+ )
175+ result = conn .execute (query ).fetchone ()
176+ assert result is not None
177+ assert result .positions is not None
178+ assert isinstance (result .positions , list )
179+ assert len (result .positions ) == 1
180+ assert isinstance (result .positions [0 ], dict )
181+ assert "header" in result .positions [0 ]
182+ assert isinstance (result .positions [0 ]["header" ], dict )
183+ assert result .positions [0 ]["header" ]["stamp" ] == "2024-01-01"
184+ assert result .positions [0 ]["header" ]["seq" ] == 123
185+ assert result .positions [0 ]["x" ] == 4.736
186+
187+ # Multiple elements with nested structs
188+ query = sqlalchemy .text (
189+ """
190+ SELECT
191+ CAST(ARRAY[
192+ ROW(ROW(1, 2), ROW(CAST(0.5 AS DOUBLE))),
193+ ROW(ROW(3, 4), ROW(CAST(1.5 AS DOUBLE)))
194+ ] AS ARRAY<ROW(pos ROW(x INTEGER, y INTEGER), vel ROW(x DOUBLE))>) as data
195+ """
196+ )
197+ result = conn .execute (query ).fetchone ()
198+ assert result is not None
199+ assert len (result .data ) == 2
200+ assert result .data [0 ]["pos" ]["x" ] == 1
201+ assert result .data [0 ]["pos" ]["y" ] == 2
202+ assert result .data [0 ]["vel" ]["x" ] == 0.5
203+ assert result .data [1 ]["pos" ]["x" ] == 3
204+ assert result .data [1 ]["pos" ]["y" ] == 4
205+ assert result .data [1 ]["vel" ]["x" ] == 1.5
206+
95207 def test_reflect_no_such_table (self , engine ):
96208 engine , conn = engine
97209 pytest .raises (
0 commit comments