@@ -87,6 +87,8 @@ def __init__(
8787 )
8888
8989 self ._metadata : tuple [dict [str , Any ], ...] | None = None
90+ self ._column_types : tuple [str , ...] | None = None
91+ self ._column_names : tuple [str , ...] | None = None
9092 self ._column_type_hints : tuple [str | None , ...] | None = None
9193 self ._rows : collections .deque [tuple [Any | None , ...] | dict [Any , Any | None ]] = (
9294 collections .deque ()
@@ -429,14 +431,16 @@ def _process_metadata(self, response: dict[str, Any]) -> None:
429431 if column_info is None :
430432 raise DataError ("KeyError `ColumnInfo`" )
431433 self ._metadata = tuple (column_info )
434+ self ._column_types = tuple (m .get ("Type" , "" ) for m in self ._metadata )
435+ self ._column_names = tuple (m .get ("Name" , "" ) for m in self ._metadata )
432436 if self ._result_set_type_hints and any (
433- m . get ( "Type" , "" ). lower () in self ._COMPLEX_TYPES for m in self ._metadata
437+ t . lower () in self ._COMPLEX_TYPES for t in self ._column_types
434438 ):
435439 hints = tuple (
436440 self ._result_set_type_hints .get (m .get ("Name" , "" ).lower ())
437- if m . get ( "Type" , "" ) .lower () in self ._COMPLEX_TYPES
441+ if t .lower () in self ._COMPLEX_TYPES
438442 else None
439- for m in self ._metadata
443+ for m , t in zip ( self ._metadata , self . _column_types , strict = True )
440444 )
441445 if any (hints ):
442446 self ._column_type_hints = hints
@@ -465,19 +469,28 @@ def _get_rows(
465469 converter : Converter | None = None ,
466470 ) -> list [tuple [Any | None , ...] | dict [Any , Any | None ]]:
467471 conv = converter or self ._converter
472+ col_types = self ._column_types
468473 col_hints = self ._column_type_hints
469- if col_hints :
474+ if col_hints and col_types :
470475 return [
471476 tuple (
472- conv .convert (meta . get ( "Type" ) , row .get ("VarCharValue" ), type_hint = hint )
477+ conv .convert (col_type , row .get ("VarCharValue" ), type_hint = hint )
473478 if hint
474- else conv .convert (meta . get ( "Type" ) , row .get ("VarCharValue" ))
475- for meta , row , hint in zip (
476- metadata , rows [i ].get ("Data" , []), col_hints , strict = False
479+ else conv .convert (col_type , row .get ("VarCharValue" ))
480+ for col_type , row , hint in zip (
481+ col_types , rows [i ].get ("Data" , []), col_hints , strict = False
477482 )
478483 )
479484 for i in range (offset , len (rows ))
480485 ]
486+ if col_types :
487+ return [
488+ tuple (
489+ conv .convert (col_type , row .get ("VarCharValue" ))
490+ for col_type , row in zip (col_types , rows [i ].get ("Data" , []), strict = False )
491+ )
492+ for i in range (offset , len (rows ))
493+ ]
481494 return [
482495 tuple (
483496 conv .convert (meta .get ("Type" ), row .get ("VarCharValue" ))
@@ -639,6 +652,8 @@ def close(self) -> None:
639652 self ._connection = None
640653 self ._query_execution = None
641654 self ._metadata = None
655+ self ._column_types = None
656+ self ._column_names = None
642657 self ._rows .clear ()
643658 self ._next_token = None
644659 self ._rownumber = None
@@ -663,18 +678,37 @@ def _get_rows(
663678 converter : Converter | None = None ,
664679 ) -> list [tuple [Any | None , ...] | dict [Any , Any | None ]]:
665680 conv = converter or self ._converter
681+ col_types = self ._column_types
682+ col_names = self ._column_names
666683 col_hints = self ._column_type_hints
667- if col_hints :
684+ if col_hints and col_types and col_names :
668685 return [
669686 self .dict_type (
670687 (
671- meta . get ( "Name" ) ,
672- conv .convert (meta . get ( "Type" ) , row .get ("VarCharValue" ), type_hint = hint )
688+ name ,
689+ conv .convert (col_type , row .get ("VarCharValue" ), type_hint = hint )
673690 if hint
674- else conv .convert (meta .get ("Type" ), row .get ("VarCharValue" )),
691+ else conv .convert (col_type , row .get ("VarCharValue" )),
692+ )
693+ for name , col_type , row , hint in zip (
694+ col_names ,
695+ col_types ,
696+ rows [i ].get ("Data" , []),
697+ col_hints ,
698+ strict = False ,
699+ )
700+ )
701+ for i in range (offset , len (rows ))
702+ ]
703+ if col_types and col_names :
704+ return [
705+ self .dict_type (
706+ (
707+ name ,
708+ conv .convert (col_type , row .get ("VarCharValue" )),
675709 )
676- for meta , row , hint in zip (
677- metadata , rows [i ].get ("Data" , []), col_hints , strict = False
710+ for name , col_type , row in zip (
711+ col_names , col_types , rows [i ].get ("Data" , []), strict = False
678712 )
679713 )
680714 for i in range (offset , len (rows ))
0 commit comments