From c749bb79e4a6a4a3f46939030687e79c758786f0 Mon Sep 17 00:00:00 2001 From: David Susco Date: Tue, 5 Jan 2021 09:19:10 -0500 Subject: [PATCH 1/2] write_lobs can handle table with composite primary key --- .../oracle_enhanced/database_statements.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb index 33feb53a0..f6b9b8a85 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb @@ -250,7 +250,10 @@ def empty_insert_statement_value # Writes LOB values from attributes for specified columns def write_lobs(table_name, klass, attributes, columns) #:nodoc: - id = quote(attributes[klass.primary_key]) + id_clause = klass.primary_key.map { |key| + "#{quote_table_name(table_name)}.#{quote_column_name(key)} = #{quote(attributes[key])}" + }.join(' AND ') + columns.each do |col| value = attributes[col.name] # changed sequence of next two lines - should check if value is nil before converting to yaml @@ -263,7 +266,7 @@ def write_lobs(table_name, klass, attributes, columns) #:nodoc: uncached do unless lob_record = select_one(sql = <<~SQL.squish, "Writable Large Object") SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)} - WHERE #{quote_column_name(klass.primary_key)} = #{id} FOR UPDATE + WHERE #{id_clause} FOR UPDATE SQL raise ActiveRecord::RecordNotFound, "statement #{sql} returned no rows" end From 6f38cc1cd201ba4a985899b6a39bdfe609063d07 Mon Sep 17 00:00:00 2001 From: David Susco Date: Tue, 5 Jan 2021 09:31:29 -0500 Subject: [PATCH 2/2] added check for composite primary key --- .../oracle_enhanced/database_statements.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb index f6b9b8a85..ea14937d4 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb @@ -250,9 +250,13 @@ def empty_insert_statement_value # Writes LOB values from attributes for specified columns def write_lobs(table_name, klass, attributes, columns) #:nodoc: - id_clause = klass.primary_key.map { |key| - "#{quote_table_name(table_name)}.#{quote_column_name(key)} = #{quote(attributes[key])}" - }.join(' AND ') + if klass.primary_key.kind_of?(Array) + id_conditions = klass.primary_key.map { |key| + "#{quote_table_name(table_name)}.#{quote_column_name(key)} = #{quote(attributes[key])}" + }.join(' AND ') + else + id_conditions = "#{quote_table_name(table_name)}.#{quote_column_name(klass.primary_key)} = #{quote(attributes[klass.primary_key])}" + end columns.each do |col| value = attributes[col.name] @@ -266,7 +270,7 @@ def write_lobs(table_name, klass, attributes, columns) #:nodoc: uncached do unless lob_record = select_one(sql = <<~SQL.squish, "Writable Large Object") SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)} - WHERE #{id_clause} FOR UPDATE + WHERE #{id_conditions} FOR UPDATE SQL raise ActiveRecord::RecordNotFound, "statement #{sql} returned no rows" end