@@ -14,18 +14,19 @@ def write_query?(sql) # :nodoc:
14
14
end
15
15
16
16
def perform_query ( raw_connection , sql , binds , type_casted_binds , prepare :, notification_payload :, batch :)
17
- result = if id_insert_table_name = query_requires_identity_insert? ( sql )
18
- # If the table name is a view, we need to get the base table name for enabling identity insert.
19
- id_insert_table_name = view_table_name ( id_insert_table_name ) if view_exists? ( id_insert_table_name )
17
+ result , affected_rows = if id_insert_table_name = query_requires_identity_insert? ( sql )
18
+ # If the table name is a view, we need to get the base table name for enabling identity insert.
19
+ id_insert_table_name = view_table_name ( id_insert_table_name ) if view_exists? ( id_insert_table_name )
20
20
21
- with_identity_insert_enabled ( id_insert_table_name , raw_connection ) do
22
- internal_exec_sql_query ( sql , raw_connection )
23
- end
24
- else
25
- internal_exec_sql_query ( sql , raw_connection )
26
- end
21
+ with_identity_insert_enabled ( id_insert_table_name , raw_connection ) do
22
+ internal_exec_sql_query ( sql , raw_connection )
23
+ end
24
+ else
25
+ internal_exec_sql_query ( sql , raw_connection )
26
+ end
27
27
28
28
verified!
29
+ notification_payload [ :affected_rows ] = affected_rows
29
30
notification_payload [ :row_count ] = result . count
30
31
result
31
32
end
@@ -38,8 +39,18 @@ def cast_result(raw_result)
38
39
end
39
40
end
40
41
42
+ # Returns the affected rows from results.
41
43
def affected_rows ( raw_result )
42
- raw_result . first [ 'AffectedRows' ]
44
+ raw_result &.first &.fetch ( 'AffectedRows' , nil )
45
+ end
46
+
47
+ # Returns the affected rows from results or handle.
48
+ def affected_rows_from_results_or_handle ( raw_result , handle )
49
+ if affected_rows_from_result = affected_rows ( raw_result )
50
+ affected_rows_from_result
51
+ else
52
+ handle . affected_rows
53
+ end
43
54
end
44
55
45
56
def raw_execute ( sql , name = nil , binds = [ ] , prepare : false , async : false , allow_retry : false , materialize_transactions : true , batch : false )
@@ -53,7 +64,9 @@ def raw_execute(sql, name = nil, binds = [], prepare: false, async: false, allow
53
64
54
65
def internal_exec_sql_query ( sql , conn )
55
66
handle = internal_raw_execute ( sql , conn )
56
- handle_to_names_and_values ( handle , ar_result : true )
67
+ results = handle_to_names_and_values ( handle , ar_result : true )
68
+
69
+ return results , affected_rows_from_results_or_handle ( results , handle )
57
70
ensure
58
71
finish_statement_handle ( handle )
59
72
end
@@ -432,12 +445,15 @@ def handle_to_names_and_values(handle, options = {})
432
445
end
433
446
results = handle . each ( query_options )
434
447
435
- columns = handle . fields
436
- # If query returns multiple result sets, only return the columns of the last one.
437
- columns = columns . last if columns . any? && columns . all? { |e | e . is_a? ( Array ) }
438
- columns = columns . map ( &:downcase ) if lowercase_schema_reflection
448
+ if options [ :ar_result ]
449
+ columns = handle . fields
450
+ columns = columns . last if columns . any? && columns . all? { |e | e . is_a? ( Array ) } # If query returns multiple result sets, only return the columns of the last one.
451
+ columns = columns . map ( &:downcase ) if lowercase_schema_reflection
439
452
440
- options [ :ar_result ] ? ActiveRecord ::Result . new ( columns , results ) : results
453
+ ActiveRecord ::Result . new ( columns , results )
454
+ else
455
+ results
456
+ end
441
457
end
442
458
443
459
def finish_statement_handle ( handle )
0 commit comments