@@ -5699,6 +5699,8 @@ def extend(self, data: list | CTable | Any, *, validate: bool | None = None) ->
56995699 if self .base is not None :
57005700 raise TypeError ("Cannot extend view." )
57015701 if len (data ) <= 0 :
5702+ if isinstance (data , dict ):
5703+ raise ValueError ("No columns provided for extend()." )
57025704 return
57035705
57045706 # Resolve effective validate flag: per-call override takes precedence
@@ -5720,9 +5722,25 @@ def extend(self, data: list | CTable | Any, *, validate: bool | None = None) ->
57205722 provided_names .add (name )
57215723 else :
57225724 if isinstance (data , dict ):
5723- provided_names = set (data ) & set (current_col_names )
5724- new_nrows = len (next (iter (data .values ())))
5725- raw_columns = {name : data [name ] for name in provided_names }
5725+ known_names = [name for name in current_col_names if name in data ]
5726+ if not known_names :
5727+ raise ValueError ("No known stored columns provided for extend()." )
5728+ column_lengths = {}
5729+ for name in known_names :
5730+ try :
5731+ column_lengths [name ] = len (data [name ])
5732+ except TypeError as exc :
5733+ raise TypeError (f"Column { name !r} does not have a length." ) from exc
5734+ new_nrows = column_lengths [known_names [0 ]]
5735+ mismatched = {name : n for name , n in column_lengths .items () if n != new_nrows }
5736+ if mismatched :
5737+ details = ", " .join (f"{ name } ={ n } " for name , n in mismatched .items ())
5738+ raise ValueError (
5739+ f"All provided columns must have the same length; "
5740+ f"expected { new_nrows } , got { details } ."
5741+ )
5742+ provided_names = set (known_names )
5743+ raw_columns = {name : data [name ] for name in known_names }
57265744 elif isinstance (data , np .ndarray ) and data .dtype .names is not None :
57275745 new_nrows = len (data )
57285746 raw_columns = {name : data [name ] for name in data .dtype .names if name in current_col_names }
0 commit comments