@@ -23,9 +23,13 @@ def execute sql, name = nil, binds = []
2323
2424        def  internal_exec_query  sql ,  name  =  "SQL" ,  binds  =  [ ] ,  prepare : false ,  async : false ,  allow_retry : false 
2525          result  =  internal_execute  sql ,  name ,  binds ,  prepare : prepare ,  async : async ,  allow_retry : allow_retry 
26-           ActiveRecord ::Result . new ( 
27-             result . fields . keys . map ( &:to_s ) ,  result . rows . map ( &:values ) 
28-           ) 
26+           if  result 
27+             ActiveRecord ::Result . new ( 
28+               result . fields . keys . map ( &:to_s ) ,  result . rows . map ( &:values ) 
29+             ) 
30+           else 
31+             ActiveRecord ::Result . new  [ ] ,  [ ] 
32+           end 
2933        end 
3034
3135        def  internal_execute  sql ,  name  =  "SQL" ,  binds  =  [ ] , 
@@ -72,11 +76,12 @@ def execute_query_or_dml statement_type, sql, name, binds
7276            ActiveSupport ::Dependencies . interlock . permit_concurrent_loads  do 
7377              if  transaction_required 
7478                transaction  do 
75-                   @connection . execute_query  sql ,  params : params ,  types : types ,  request_options : request_options 
79+                   @connection . execute_query  sql ,  params : params ,  types : types ,  request_options : request_options , 
80+                                             statement_type : statement_type 
7681                end 
7782              else 
7883                @connection . execute_query  sql ,  params : params ,  types : types ,  single_use_selector : selector , 
79-                                           request_options : request_options 
84+                                           request_options : request_options ,   statement_type :  statement_type 
8085              end 
8186            end 
8287          end 
@@ -142,9 +147,13 @@ def query sql, name = nil
142147
143148          def  exec_query  sql ,  name  =  "SQL" ,  binds  =  [ ] ,  prepare : false  # rubocop:disable Lint/UnusedMethodArgument 
144149            result  =  execute  sql ,  name ,  binds 
145-             ActiveRecord ::Result . new ( 
146-               result . fields . keys . map ( &:to_s ) ,  result . rows . map ( &:values ) 
147-             ) 
150+             if  result . respond_to?  :fields 
151+               ActiveRecord ::Result . new ( 
152+                 result . fields . keys . map ( &:to_s ) ,  result . rows . map ( &:values ) 
153+               ) 
154+             else 
155+               ActiveRecord ::Result . new  [ ] ,  [ ] 
156+             end 
148157          end 
149158
150159          def  sql_for_insert  sql ,  pk ,  binds 
@@ -191,6 +200,7 @@ def update arel, name = nil, binds = []
191200
192201        def  exec_update  sql ,  name  =  "SQL" ,  binds  =  [ ] 
193202          result  =  execute  sql ,  name ,  binds 
203+           return  unless  result 
194204          # Make sure that we consume the entire result stream before trying to get the stats. 
195205          # This is required because the ExecuteStreamingSql RPC is also used for (Partitioned) DML, 
196206          # and this RPC can return multiple partial result sets for DML as well. Only the last partial 
@@ -243,6 +253,9 @@ def transaction requires_new: nil, isolation: nil, joinable: true
243253              retry 
244254            end 
245255            raise 
256+           rescue  Google ::Cloud ::AbortedError  =>  err 
257+             sleep ( delay_from_aborted ( err )  || backoff  *= 1.3 ) 
258+             retry 
246259          end 
247260        end 
248261
0 commit comments