avoid recursive query for postgres array types

in large databases, pg_types could be huge, and typelem is not
indexed. so instead just assumed they're named like "_#{base_type_name}"
and add the few that don't follow that, to get a singe direct query

Change-Id: I2c70ba5758c2888d113f0d1de159d9ea01f1d84a
Reviewed-on: https://gerrit.instructure.com/68554
Reviewed-by: James Williams  <jamesw@instructure.com>
Tested-by: Jenkins
Product-Review: Rob Orton <rob@instructure.com>
QA-Review: Rob Orton <rob@instructure.com>
This commit is contained in:
Cody Cutrer 2015-12-09 08:49:35 -07:00 committed by Rob Orton
parent 940bce5785
commit 28795ba78f
1 changed files with 6 additions and 8 deletions

View File

@ -230,14 +230,12 @@ module PostgreSQLAdapterExtensions
def initialize_type_map(*args) def initialize_type_map(*args)
return super if Rails.version >= '4.2' return super if Rails.version >= '4.2'
known_type_names = OID::NAMES.keys.map { |n| "'#{n}'" } known_type_names = OID::NAMES.keys.map { |n| "'#{n}'" } + OID::NAMES.keys.map { |n| "'_#{n}'" }
sql = <<-SQL % [known_type_names.join(", "), known_type_names.join(", ")] known_type_names.concat(%w{'name' 'oidvector' 'int2vector' 'line' 'point' 'box' 'lseg'})
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput sql = <<-SQL % [known_type_names.join(", ")]
FROM pg_type t SELECT oid, typname, typelem, typdelim, typinput
LEFT OUTER JOIN pg_type et ON t.typelem=et.oid FROM pg_type
WHERE WHERE typname IN (%s)
t.typname IN (%s)
OR et.typname IN (%s)
SQL SQL
result = execute(sql, 'SCHEMA') result = execute(sql, 'SCHEMA')
leaves, nodes = result.partition { |row| row['typelem'] == '0' } leaves, nodes = result.partition { |row| row['typelem'] == '0' }