@@ -720,7 +720,7 @@ def recv_results_rows(self, f, protocol_version, user_type_map, result_metadata,
720720 self .column_types = [c [3 ] for c in column_metadata ]
721721 col_descs = [ColDesc (md [0 ], md [1 ], md [2 ]) for md in column_metadata ]
722722
723- # Optimize by checking column_encryption_policy once and creating appropriate decode path .
723+ # Optimize by checking column_encryption_policy once and defining appropriate decode_row function .
724724 # This avoids checking the policy for every single value decoded (rows × columns times).
725725 if column_encryption_policy :
726726 # Pre-compute encryption info for each column to avoid repeated lookups.
@@ -730,51 +730,33 @@ def recv_results_rows(self, f, protocol_version, user_type_map, result_metadata,
730730 for col_desc in col_descs
731731 ]
732732
733- def decode_val_with_encryption (val , col_md , uses_ce , col_desc ):
734- if uses_ce :
735- col_type = column_encryption_policy .column_type (col_desc )
736- raw_bytes = column_encryption_policy .decrypt (col_desc , val )
737- else :
738- col_type = col_md [3 ]
739- raw_bytes = val
740- return col_type .from_binary (raw_bytes , protocol_version )
741-
742733 def decode_row (row ):
743734 return tuple (
744- decode_val_with_encryption (val , col_md , uses_ce , col_desc )
735+ column_encryption_policy .column_type (col_desc ).from_binary (
736+ column_encryption_policy .decrypt (col_desc , val ), protocol_version
737+ ) if uses_ce else col_md [3 ].from_binary (val , protocol_version )
745738 for val , col_md , (uses_ce , col_desc ) in zip (row , column_metadata , column_encryption_info )
746739 )
747-
748- try :
749- self .parsed_rows = [decode_row (row ) for row in rows ]
750- except Exception :
751- for row in rows :
752- for val , col_md , (uses_ce , col_desc ) in zip (row , column_metadata , column_encryption_info ):
753- try :
754- decode_val_with_encryption (val , col_md , uses_ce , col_desc )
755- except Exception as e :
756- raise DriverException ('Failed decoding result column "%s" of type %s: %s' % (col_md [2 ],
757- col_md [3 ].cql_parameterized_type (),
758- str (e )))
759740 else :
760741 # Simple path without encryption - just decode raw bytes directly
761- def decode_val_simple (val , col_type ):
762- return col_type .from_binary (val , protocol_version )
763-
764742 def decode_row (row ):
765- return tuple (decode_val_simple (val , col_md [3 ]) for val , col_md in zip (row , column_metadata ))
766-
767- try :
768- self .parsed_rows = [decode_row (row ) for row in rows ]
769- except Exception :
770- for row in rows :
771- for val , col_md in zip (row , column_metadata ):
772- try :
773- decode_val_simple (val , col_md [3 ])
774- except Exception as e :
775- raise DriverException ('Failed decoding result column "%s" of type %s: %s' % (col_md [2 ],
776- col_md [3 ].cql_parameterized_type (),
777- str (e )))
743+ return tuple (col_md [3 ].from_binary (val , protocol_version ) for val , col_md in zip (row , column_metadata ))
744+
745+ try :
746+ self .parsed_rows = [decode_row (row ) for row in rows ]
747+ except Exception :
748+ for row in rows :
749+ for val , col_md , col_desc in zip (row , column_metadata , col_descs ):
750+ try :
751+ # Fallback to original decode_val logic for error reporting
752+ uses_ce = column_encryption_policy and column_encryption_policy .contains_column (col_desc )
753+ col_type = column_encryption_policy .column_type (col_desc ) if uses_ce else col_md [3 ]
754+ raw_bytes = column_encryption_policy .decrypt (col_desc , val ) if uses_ce else val
755+ col_type .from_binary (raw_bytes , protocol_version )
756+ except Exception as e :
757+ raise DriverException ('Failed decoding result column "%s" of type %s: %s' % (col_md [2 ],
758+ col_md [3 ].cql_parameterized_type (),
759+ str (e )))
778760
779761 def recv_results_prepared (self , f , protocol_version , user_type_map ):
780762 self .query_id = read_binary_string (f )
0 commit comments