aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/oci_adapter.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/oci_adapter.rb20
1 files changed, 13 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/oci_adapter.rb b/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
index 1519e1cefd..5f27fb1ca5 100644
--- a/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
@@ -312,19 +312,25 @@ begin
end
def columns(table_name, name = nil) #:nodoc:
+ table_name = table_name.to_s.upcase
+ owner = table_name.include?('.') ? "'#{table_name.split('.').first}'" : "user"
+ table = "'#{table_name.split('.').last}'"
+
select_all(%Q{
select column_name, data_type, data_default, nullable,
case when data_type = 'NUMBER' then data_precision
- when data_type = 'VARCHAR2' then data_length
+ when data_type = 'VARCHAR2' then data_length
else null end as length,
case when data_type = 'NUMBER' then data_scale
else null end as scale
- from user_catalog cat, user_synonyms syn, all_tab_columns col
- where cat.table_name = '#{table_name.to_s.upcase}'
- and syn.synonym_name (+)= cat.table_name
- and col.owner = nvl(syn.table_owner, user)
- and col.table_name = nvl(syn.table_name, cat.table_name)}
- ).map do |row|
+ from all_catalog cat, all_synonyms syn, all_tab_columns col
+ where cat.owner = #{owner}
+ and cat.table_name = #{table}
+ and syn.owner (+)= cat.owner
+ and syn.synonym_name (+)= cat.table_name
+ and col.owner = nvl(syn.table_owner, cat.owner)
+ and col.table_name = nvl(syn.table_name, cat.table_name)
+ }).map do |row|
row['data_default'].gsub!(/^'(.*)'$/, '\1') if row['data_default']
OCIColumn.new(
oci_downcase(row['column_name']),