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