@@ -67,6 +67,17 @@ def limit(self) -> Optional[int]:
6767 """
6868 return None
6969
70+ def nested_name_paths (self ) -> Optional [List [List [str ]]]:
71+ """Parallel name paths for a nested-leaf projection, or ``None``.
72+
73+ Forwarded to the per-task ``TableRead`` so a projection like
74+ ``['mv.latest_value.x']`` is read by widening to the parent struct and
75+ extracting the requested leaves. Without it the worker treats the
76+ flattened leaf names as missing top-level columns and reads every
77+ projected leaf as NULL.
78+ """
79+ return None
80+
7081
7182class CatalogSplitProvider (SplitProvider ):
7283 """Plan splits from a fully-qualified table identifier and catalog options.
@@ -124,6 +135,7 @@ def __init__(
124135 self ._table_cached = None
125136 self ._splits_cached = None
126137 self ._read_type_cached = None
138+ self ._nested_name_paths_cached = None
127139
128140 def _ensure_table (self ):
129141 if self ._table_cached is None :
@@ -154,6 +166,7 @@ def _ensure_planned(self):
154166 if self ._limit is not None :
155167 rb = rb .with_limit (self ._limit )
156168 self ._read_type_cached = rb .read_type ()
169+ self ._nested_name_paths_cached = rb ._nested_name_paths ()
157170 self ._splits_cached = rb .new_scan ().plan ().splits ()
158171
159172 @property
@@ -171,6 +184,10 @@ def read_type(self):
171184 self ._ensure_planned ()
172185 return self ._read_type_cached
173186
187+ def nested_name_paths (self ) -> Optional [List [List [str ]]]:
188+ self ._ensure_planned ()
189+ return self ._nested_name_paths_cached
190+
174191 def predicate (self ):
175192 return self ._predicate
176193
@@ -190,12 +207,13 @@ class PreResolvedSplitProvider(SplitProvider):
190207 """
191208
192209 def __init__ (self , table , splits : List [Split ], read_type , predicate = None ,
193- limit : Optional [int ] = None ):
210+ limit : Optional [int ] = None , nested_name_paths = None ):
194211 self ._table = table
195212 self ._splits = splits
196213 self ._read_type = read_type
197214 self ._predicate = predicate
198215 self ._limit = limit
216+ self ._nested_name_paths = nested_name_paths
199217
200218 def table (self ):
201219 return self ._table
@@ -206,6 +224,9 @@ def splits(self) -> List[Split]:
206224 def read_type (self ):
207225 return self ._read_type
208226
227+ def nested_name_paths (self ) -> Optional [List [List [str ]]]:
228+ return self ._nested_name_paths
229+
209230 def predicate (self ):
210231 return self ._predicate
211232
0 commit comments