diff options
author | Yves Senn <yves.senn@gmail.com> | 2014-02-23 13:18:06 +0100 |
---|---|---|
committer | Yves Senn <yves.senn@gmail.com> | 2014-02-23 13:18:06 +0100 |
commit | 96759cf6c6a17053abb6a2b7cd87cdbd5a8420ba (patch) | |
tree | 51c6954891c938550fae57686c7db89447481a85 /activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | |
parent | c554d170e6b3e7ebe783ab356e16abc9bfd56615 (diff) | |
parent | 91949e48cf41af9f3e4ffba3e5eecf9b0a08bfc3 (diff) | |
download | rails-96759cf6c6a17053abb6a2b7cd87cdbd5a8420ba.tar.gz rails-96759cf6c6a17053abb6a2b7cd87cdbd5a8420ba.tar.bz2 rails-96759cf6c6a17053abb6a2b7cd87cdbd5a8420ba.zip |
Merge pull request #13793 from senny/postgres/dynamic_range_oid
Dynamically define PostgreSQL Range OIDs
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 36c7462419..d1fb132b60 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -785,18 +785,29 @@ module ActiveRecord end def initialize_type_map(type_map) - result = execute('SELECT oid, typname, typelem, typdelim, typinput FROM pg_type', 'SCHEMA') - leaves, nodes = result.partition { |row| row['typelem'] == '0' } + if supports_ranges? + result = execute(<<-SQL, 'SCHEMA') + SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype + FROM pg_type as t + LEFT JOIN pg_range as r ON oid = rngtypid + SQL + else + result = execute(<<-SQL, 'SCHEMA') + SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput + FROM pg_type as t + SQL + end + ranges, nodes = result.partition { |row| row['typinput'] == 'range_in' } + leaves, nodes = nodes.partition { |row| row['typelem'] == '0' } + arrays, nodes = nodes.partition { |row| row['typinput'] == 'array_in' } - # populate the leaf nodes + # populate the base types leaves.find_all { |row| OID.registered_type? row['typname'] }.each do |row| type_map[row['oid'].to_i] = OID::NAMES[row['typname']] end records_by_oid = result.group_by { |row| row['oid'] } - arrays, nodes = nodes.partition { |row| row['typinput'] == 'array_in' } - # populate composite types nodes.each do |row| add_oid row, records_by_oid, type_map @@ -807,6 +818,13 @@ module ActiveRecord array = OID::Array.new type_map[row['typelem'].to_i] type_map[row['oid'].to_i] = array end + + # populate range types + ranges.find_all { |row| type_map.key? row['rngsubtype'].to_i }.each do |row| + subtype = type_map[row['rngsubtype'].to_i] + range = OID::Range.new type_map[row['rngsubtype'].to_i] + type_map[row['oid'].to_i] = range + end end FEATURE_NOT_SUPPORTED = "0A000" #:nodoc: |