def preload_column_definitions (table_names) table_name_map = ( query(<<~SQL, "SCHEMA") SELECT (a.attrelid::regclass)::text , a.attnum, a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod, c.collname, col_description(a.attrelid, a.attnum) AS comment, #{supports_identity_columns? ? 'attidentity' : quote('')} AS identity, #{supports_virtual_columns? ? 'attgenerated' : quote('')} as attgenerated FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum LEFT JOIN pg_type t ON a.atttypid = t.oid LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation WHERE a.attnum > 0 AND NOT a.attisdropped SQL ).group_by(&:first) ... https://github.com/rerost/activerecord_bulk_postgresql_adapter/blob/master/lib/activerecord_bulk_po stgresql_adapter.rb#L56-L70