activerecord 5.1.0.beta1 → 5.1.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +93 -6
 - data/lib/active_record/associations.rb +4 -0
 - data/lib/active_record/associations/association_scope.rb +8 -8
 - data/lib/active_record/associations/belongs_to_association.rb +4 -0
 - data/lib/active_record/associations/builder/belongs_to.rb +8 -1
 - data/lib/active_record/associations/collection_proxy.rb +5 -4
 - data/lib/active_record/associations/join_dependency.rb +1 -1
 - data/lib/active_record/associations/join_dependency/join_association.rb +4 -23
 - data/lib/active_record/attribute_methods/dirty.rb +3 -3
 - data/lib/active_record/connection_adapters/abstract/quoting.rb +20 -3
 - data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +3 -7
 - data/lib/active_record/connection_adapters/abstract/schema_statements.rb +30 -16
 - data/lib/active_record/connection_adapters/abstract_adapter.rb +8 -5
 - data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +16 -80
 - data/lib/active_record/connection_adapters/mysql/schema_statements.rb +33 -0
 - data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +56 -96
 - data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql_adapter.rb +4 -12
 - data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +32 -0
 - data/lib/active_record/connection_adapters/sqlite3_adapter.rb +4 -51
 - data/lib/active_record/core.rb +0 -1
 - data/lib/active_record/gem_version.rb +1 -1
 - data/lib/active_record/locking/optimistic.rb +2 -6
 - data/lib/active_record/migration.rb +32 -17
 - data/lib/active_record/null_relation.rb +1 -1
 - data/lib/active_record/querying.rb +1 -1
 - data/lib/active_record/railties/databases.rake +3 -19
 - data/lib/active_record/reflection.rb +67 -16
 - data/lib/active_record/relation.rb +0 -4
 - data/lib/active_record/relation/calculations.rb +7 -10
 - data/lib/active_record/relation/delegation.rb +2 -2
 - data/lib/active_record/relation/finder_methods.rb +102 -100
 - data/lib/active_record/relation/query_methods.rb +6 -1
 - data/lib/active_record/result.rb +12 -1
 - data/lib/active_record/sanitization.rb +1 -2
 - data/lib/active_record/schema_dumper.rb +1 -1
 - data/lib/active_record/schema_migration.rb +5 -1
 - data/lib/active_record/tasks/postgresql_database_tasks.rb +20 -0
 - data/lib/active_record/transactions.rb +1 -1
 - data/lib/active_record/type/decimal_without_scale.rb +4 -0
 - data/lib/active_record/type/serialized.rb +2 -0
 - data/lib/rails/generators/active_record/migration.rb +1 -1
 - metadata +8 -6
 
| 
         @@ -154,8 +154,8 @@ module ActiveRecord 
     | 
|
| 
       154 
154 
     | 
    
         
             
                    Arel::Visitors::ToSql.new(self)
         
     | 
| 
       155 
155 
     | 
    
         
             
                  end
         
     | 
| 
       156 
156 
     | 
    
         | 
| 
       157 
     | 
    
         
            -
                  def valid_type?(type)
         
     | 
| 
       158 
     | 
    
         
            -
                     
     | 
| 
      
 157 
     | 
    
         
            +
                  def valid_type?(type) # :nodoc:
         
     | 
| 
      
 158 
     | 
    
         
            +
                    !native_database_types[type].nil?
         
     | 
| 
       159 
159 
     | 
    
         
             
                  end
         
     | 
| 
       160 
160 
     | 
    
         | 
| 
       161 
161 
     | 
    
         
             
                  def schema_creation
         
     | 
| 
         @@ -232,10 +232,10 @@ module ActiveRecord 
     | 
|
| 
       232 
232 
     | 
    
         
             
                    self.class::ADAPTER_NAME
         
     | 
| 
       233 
233 
     | 
    
         
             
                  end
         
     | 
| 
       234 
234 
     | 
    
         | 
| 
       235 
     | 
    
         
            -
                   
     | 
| 
       236 
     | 
    
         
            -
             
     | 
| 
       237 
     | 
    
         
            -
                    false
         
     | 
| 
      
 235 
     | 
    
         
            +
                  def supports_migrations? # :nodoc:
         
     | 
| 
      
 236 
     | 
    
         
            +
                    true
         
     | 
| 
       238 
237 
     | 
    
         
             
                  end
         
     | 
| 
      
 238 
     | 
    
         
            +
                  deprecate :supports_migrations?
         
     | 
| 
       239 
239 
     | 
    
         | 
| 
       240 
240 
     | 
    
         
             
                  def supports_primary_key? # :nodoc:
         
     | 
| 
       241 
241 
     | 
    
         
             
                    true
         
     | 
| 
         @@ -439,6 +439,9 @@ module ActiveRecord 
     | 
|
| 
       439 
439 
     | 
    
         
             
                  # This is done under the hood by calling #active?. If the connection
         
     | 
| 
       440 
440 
     | 
    
         
             
                  # is no longer active, then this method will reconnect to the database.
         
     | 
| 
       441 
441 
     | 
    
         
             
                  def verify!(*ignored)
         
     | 
| 
      
 442 
     | 
    
         
            +
                    if ignored.size > 0
         
     | 
| 
      
 443 
     | 
    
         
            +
                      ActiveSupport::Deprecation.warn("Passing arguments to #verify method of the connection has no effect and has been deprecated. Please remove all arguments from the #verify method call.")
         
     | 
| 
      
 444 
     | 
    
         
            +
                    end
         
     | 
| 
       442 
445 
     | 
    
         
             
                    reconnect! unless active?
         
     | 
| 
       443 
446 
     | 
    
         
             
                  end
         
     | 
| 
       444 
447 
     | 
    
         | 
| 
         @@ -6,6 +6,7 @@ require "active_record/connection_adapters/mysql/quoting" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require "active_record/connection_adapters/mysql/schema_creation"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "active_record/connection_adapters/mysql/schema_definitions"
         
     | 
| 
       8 
8 
     | 
    
         
             
            require "active_record/connection_adapters/mysql/schema_dumper"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "active_record/connection_adapters/mysql/schema_statements"
         
     | 
| 
       9 
10 
     | 
    
         
             
            require "active_record/connection_adapters/mysql/type_metadata"
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
            require "active_support/core_ext/string/strip"
         
     | 
| 
         @@ -15,6 +16,7 @@ module ActiveRecord 
     | 
|
| 
       15 
16 
     | 
    
         
             
                class AbstractMysqlAdapter < AbstractAdapter
         
     | 
| 
       16 
17 
     | 
    
         
             
                  include MySQL::Quoting
         
     | 
| 
       17 
18 
     | 
    
         
             
                  include MySQL::ColumnDumper
         
     | 
| 
      
 19 
     | 
    
         
            +
                  include MySQL::SchemaStatements
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
                  def update_table_definition(table_name, base) # :nodoc:
         
     | 
| 
       20 
22 
     | 
    
         
             
                    MySQL::Table.new(table_name, base)
         
     | 
| 
         @@ -89,11 +91,6 @@ module ActiveRecord 
     | 
|
| 
       89 
91 
     | 
    
         
             
                    /mariadb/i.match?(full_version)
         
     | 
| 
       90 
92 
     | 
    
         
             
                  end
         
     | 
| 
       91 
93 
     | 
    
         | 
| 
       92 
     | 
    
         
            -
                  # Returns true, since this connection adapter supports migrations.
         
     | 
| 
       93 
     | 
    
         
            -
                  def supports_migrations?
         
     | 
| 
       94 
     | 
    
         
            -
                    true
         
     | 
| 
       95 
     | 
    
         
            -
                  end
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
94 
     | 
    
         
             
                  def supports_bulk_alter? #:nodoc:
         
     | 
| 
       98 
95 
     | 
    
         
             
                    true
         
     | 
| 
       99 
96 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -315,57 +312,6 @@ module ActiveRecord 
     | 
|
| 
       315 
312 
     | 
    
         
             
                    show_variable "collation_database"
         
     | 
| 
       316 
313 
     | 
    
         
             
                  end
         
     | 
| 
       317 
314 
     | 
    
         | 
| 
       318 
     | 
    
         
            -
                  def tables # :nodoc:
         
     | 
| 
       319 
     | 
    
         
            -
                    sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE'"
         
     | 
| 
       320 
     | 
    
         
            -
                    sql << " AND table_schema = #{quote(@config[:database])}"
         
     | 
| 
       321 
     | 
    
         
            -
             
     | 
| 
       322 
     | 
    
         
            -
                    select_values(sql, "SCHEMA")
         
     | 
| 
       323 
     | 
    
         
            -
                  end
         
     | 
| 
       324 
     | 
    
         
            -
             
     | 
| 
       325 
     | 
    
         
            -
                  def views # :nodoc:
         
     | 
| 
       326 
     | 
    
         
            -
                    select_values("SHOW FULL TABLES WHERE table_type = 'VIEW'", "SCHEMA")
         
     | 
| 
       327 
     | 
    
         
            -
                  end
         
     | 
| 
       328 
     | 
    
         
            -
             
     | 
| 
       329 
     | 
    
         
            -
                  def data_sources # :nodoc:
         
     | 
| 
       330 
     | 
    
         
            -
                    sql = "SELECT table_name FROM information_schema.tables "
         
     | 
| 
       331 
     | 
    
         
            -
                    sql << "WHERE table_schema = #{quote(@config[:database])}"
         
     | 
| 
       332 
     | 
    
         
            -
             
     | 
| 
       333 
     | 
    
         
            -
                    select_values(sql, "SCHEMA")
         
     | 
| 
       334 
     | 
    
         
            -
                  end
         
     | 
| 
       335 
     | 
    
         
            -
             
     | 
| 
       336 
     | 
    
         
            -
                  def table_exists?(table_name) # :nodoc:
         
     | 
| 
       337 
     | 
    
         
            -
                    return false unless table_name.present?
         
     | 
| 
       338 
     | 
    
         
            -
             
     | 
| 
       339 
     | 
    
         
            -
                    schema, name = extract_schema_qualified_name(table_name)
         
     | 
| 
       340 
     | 
    
         
            -
             
     | 
| 
       341 
     | 
    
         
            -
                    sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE'"
         
     | 
| 
       342 
     | 
    
         
            -
                    sql << " AND table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
         
     | 
| 
       343 
     | 
    
         
            -
             
     | 
| 
       344 
     | 
    
         
            -
                    select_values(sql, "SCHEMA").any?
         
     | 
| 
       345 
     | 
    
         
            -
                  end
         
     | 
| 
       346 
     | 
    
         
            -
             
     | 
| 
       347 
     | 
    
         
            -
                  def data_source_exists?(table_name) # :nodoc:
         
     | 
| 
       348 
     | 
    
         
            -
                    return false unless table_name.present?
         
     | 
| 
       349 
     | 
    
         
            -
             
     | 
| 
       350 
     | 
    
         
            -
                    schema, name = extract_schema_qualified_name(table_name)
         
     | 
| 
       351 
     | 
    
         
            -
             
     | 
| 
       352 
     | 
    
         
            -
                    sql = "SELECT table_name FROM information_schema.tables "
         
     | 
| 
       353 
     | 
    
         
            -
                    sql << "WHERE table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
         
     | 
| 
       354 
     | 
    
         
            -
             
     | 
| 
       355 
     | 
    
         
            -
                    select_values(sql, "SCHEMA").any?
         
     | 
| 
       356 
     | 
    
         
            -
                  end
         
     | 
| 
       357 
     | 
    
         
            -
             
     | 
| 
       358 
     | 
    
         
            -
                  def view_exists?(view_name) # :nodoc:
         
     | 
| 
       359 
     | 
    
         
            -
                    return false unless view_name.present?
         
     | 
| 
       360 
     | 
    
         
            -
             
     | 
| 
       361 
     | 
    
         
            -
                    schema, name = extract_schema_qualified_name(view_name)
         
     | 
| 
       362 
     | 
    
         
            -
             
     | 
| 
       363 
     | 
    
         
            -
                    sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW'"
         
     | 
| 
       364 
     | 
    
         
            -
                    sql << " AND table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
         
     | 
| 
       365 
     | 
    
         
            -
             
     | 
| 
       366 
     | 
    
         
            -
                    select_values(sql, "SCHEMA").any?
         
     | 
| 
       367 
     | 
    
         
            -
                  end
         
     | 
| 
       368 
     | 
    
         
            -
             
     | 
| 
       369 
315 
     | 
    
         
             
                  def truncate(table_name, name = nil)
         
     | 
| 
       370 
316 
     | 
    
         
             
                    execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
         
     | 
| 
       371 
317 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -411,13 +357,13 @@ module ActiveRecord 
     | 
|
| 
       411 
357 
     | 
    
         
             
                  end
         
     | 
| 
       412 
358 
     | 
    
         | 
| 
       413 
359 
     | 
    
         
             
                  def table_comment(table_name) # :nodoc:
         
     | 
| 
       414 
     | 
    
         
            -
                     
     | 
| 
      
 360 
     | 
    
         
            +
                    scope = quoted_scope(table_name)
         
     | 
| 
       415 
361 
     | 
    
         | 
| 
       416 
362 
     | 
    
         
             
                    select_value(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       417 
363 
     | 
    
         
             
                      SELECT table_comment
         
     | 
| 
       418 
364 
     | 
    
         
             
                      FROM information_schema.tables
         
     | 
| 
       419 
     | 
    
         
            -
                      WHERE table_schema = #{ 
     | 
| 
       420 
     | 
    
         
            -
                        AND table_name = #{ 
     | 
| 
      
 365 
     | 
    
         
            +
                      WHERE table_schema = #{scope[:schema]}
         
     | 
| 
      
 366 
     | 
    
         
            +
                        AND table_name = #{scope[:name]}
         
     | 
| 
       421 
367 
     | 
    
         
             
                    SQL
         
     | 
| 
       422 
368 
     | 
    
         
             
                  end
         
     | 
| 
       423 
369 
     | 
    
         | 
| 
         @@ -517,7 +463,7 @@ module ActiveRecord 
     | 
|
| 
       517 
463 
     | 
    
         
             
                  def foreign_keys(table_name)
         
     | 
| 
       518 
464 
     | 
    
         
             
                    raise ArgumentError unless table_name.present?
         
     | 
| 
       519 
465 
     | 
    
         | 
| 
       520 
     | 
    
         
            -
                     
     | 
| 
      
 466 
     | 
    
         
            +
                    scope = quoted_scope(table_name)
         
     | 
| 
       521 
467 
     | 
    
         | 
| 
       522 
468 
     | 
    
         
             
                    fk_info = select_all(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       523 
469 
     | 
    
         
             
                      SELECT fk.referenced_table_name AS 'to_table',
         
     | 
| 
         @@ -530,9 +476,9 @@ module ActiveRecord 
     | 
|
| 
       530 
476 
     | 
    
         
             
                      JOIN information_schema.referential_constraints rc
         
     | 
| 
       531 
477 
     | 
    
         
             
                      USING (constraint_schema, constraint_name)
         
     | 
| 
       532 
478 
     | 
    
         
             
                      WHERE fk.referenced_column_name IS NOT NULL
         
     | 
| 
       533 
     | 
    
         
            -
                        AND fk.table_schema = #{ 
     | 
| 
       534 
     | 
    
         
            -
                        AND fk.table_name = #{ 
     | 
| 
       535 
     | 
    
         
            -
                        AND rc.table_name = #{ 
     | 
| 
      
 479 
     | 
    
         
            +
                        AND fk.table_schema = #{scope[:schema]}
         
     | 
| 
      
 480 
     | 
    
         
            +
                        AND fk.table_name = #{scope[:name]}
         
     | 
| 
      
 481 
     | 
    
         
            +
                        AND rc.table_name = #{scope[:name]}
         
     | 
| 
       536 
482 
     | 
    
         
             
                    SQL
         
     | 
| 
       537 
483 
     | 
    
         | 
| 
       538 
484 
     | 
    
         
             
                    fk_info.map do |row|
         
     | 
| 
         @@ -604,14 +550,14 @@ module ActiveRecord 
     | 
|
| 
       604 
550 
     | 
    
         
             
                  def primary_keys(table_name) # :nodoc:
         
     | 
| 
       605 
551 
     | 
    
         
             
                    raise ArgumentError unless table_name.present?
         
     | 
| 
       606 
552 
     | 
    
         | 
| 
       607 
     | 
    
         
            -
                     
     | 
| 
      
 553 
     | 
    
         
            +
                    scope = quoted_scope(table_name)
         
     | 
| 
       608 
554 
     | 
    
         | 
| 
       609 
555 
     | 
    
         
             
                    select_values(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       610 
556 
     | 
    
         
             
                      SELECT column_name
         
     | 
| 
       611 
557 
     | 
    
         
             
                      FROM information_schema.key_column_usage
         
     | 
| 
       612 
558 
     | 
    
         
             
                      WHERE constraint_name = 'PRIMARY'
         
     | 
| 
       613 
     | 
    
         
            -
                        AND table_schema = #{ 
     | 
| 
       614 
     | 
    
         
            -
                        AND table_name = #{ 
     | 
| 
      
 559 
     | 
    
         
            +
                        AND table_schema = #{scope[:schema]}
         
     | 
| 
      
 560 
     | 
    
         
            +
                        AND table_name = #{scope[:name]}
         
     | 
| 
       615 
561 
     | 
    
         
             
                      ORDER BY ordinal_position
         
     | 
| 
       616 
562 
     | 
    
         
             
                    SQL
         
     | 
| 
       617 
563 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -648,10 +594,6 @@ module ActiveRecord 
     | 
|
| 
       648 
594 
     | 
    
         
             
                    self.class.type_cast_config_to_boolean(@config.fetch(:strict, true))
         
     | 
| 
       649 
595 
     | 
    
         
             
                  end
         
     | 
| 
       650 
596 
     | 
    
         | 
| 
       651 
     | 
    
         
            -
                  def valid_type?(type)
         
     | 
| 
       652 
     | 
    
         
            -
                    !native_database_types[type].nil?
         
     | 
| 
       653 
     | 
    
         
            -
                  end
         
     | 
| 
       654 
     | 
    
         
            -
             
     | 
| 
       655 
597 
     | 
    
         
             
                  def default_index_type?(index) # :nodoc:
         
     | 
| 
       656 
598 
     | 
    
         
             
                    index.using == :btree || super
         
     | 
| 
       657 
599 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -786,11 +728,11 @@ module ActiveRecord 
     | 
|
| 
       786 
728 
     | 
    
         
             
                    def change_column_sql(table_name, column_name, type, options = {})
         
     | 
| 
       787 
729 
     | 
    
         
             
                      column = column_for(table_name, column_name)
         
     | 
| 
       788 
730 
     | 
    
         | 
| 
       789 
     | 
    
         
            -
                      unless  
     | 
| 
      
 731 
     | 
    
         
            +
                      unless options.key?(:default)
         
     | 
| 
       790 
732 
     | 
    
         
             
                        options[:default] = column.default
         
     | 
| 
       791 
733 
     | 
    
         
             
                      end
         
     | 
| 
       792 
734 
     | 
    
         | 
| 
       793 
     | 
    
         
            -
                      unless options. 
     | 
| 
      
 735 
     | 
    
         
            +
                      unless options.key?(:null)
         
     | 
| 
       794 
736 
     | 
    
         
             
                        options[:null] = column.null
         
     | 
| 
       795 
737 
     | 
    
         
             
                      end
         
     | 
| 
       796 
738 
     | 
    
         | 
| 
         @@ -870,9 +812,9 @@ module ActiveRecord 
     | 
|
| 
       870 
812 
     | 
    
         
             
                      variables["sql_auto_is_null"] = 0
         
     | 
| 
       871 
813 
     | 
    
         | 
| 
       872 
814 
     | 
    
         
             
                      # Increase timeout so the server doesn't disconnect us.
         
     | 
| 
       873 
     | 
    
         
            -
                      wait_timeout = @config[:wait_timeout]
         
     | 
| 
      
 815 
     | 
    
         
            +
                      wait_timeout = self.class.type_cast_config_to_integer(@config[:wait_timeout])
         
     | 
| 
       874 
816 
     | 
    
         
             
                      wait_timeout = 2147483 unless wait_timeout.is_a?(Integer)
         
     | 
| 
       875 
     | 
    
         
            -
                      variables["wait_timeout"] =  
     | 
| 
      
 817 
     | 
    
         
            +
                      variables["wait_timeout"] = wait_timeout
         
     | 
| 
       876 
818 
     | 
    
         | 
| 
       877 
819 
     | 
    
         
             
                      defaults = [":default", :default].to_set
         
     | 
| 
       878 
820 
     | 
    
         | 
| 
         @@ -949,12 +891,6 @@ module ActiveRecord 
     | 
|
| 
       949 
891 
     | 
    
         
             
                      )
         
     | 
| 
       950 
892 
     | 
    
         
             
                    end
         
     | 
| 
       951 
893 
     | 
    
         | 
| 
       952 
     | 
    
         
            -
                    def extract_schema_qualified_name(string) # :nodoc:
         
     | 
| 
       953 
     | 
    
         
            -
                      schema, name = string.to_s.scan(/[^`.\s]+|`[^`]*`/)
         
     | 
| 
       954 
     | 
    
         
            -
                      schema, name = @config[:database], schema unless name
         
     | 
| 
       955 
     | 
    
         
            -
                      [schema, name]
         
     | 
| 
       956 
     | 
    
         
            -
                    end
         
     | 
| 
       957 
     | 
    
         
            -
             
     | 
| 
       958 
894 
     | 
    
         
             
                    def integer_to_sql(limit) # :nodoc:
         
     | 
| 
       959 
895 
     | 
    
         
             
                      case limit
         
     | 
| 
       960 
896 
     | 
    
         
             
                      when 1; "tinyint"
         
     | 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ActiveRecord
         
     | 
| 
      
 2 
     | 
    
         
            +
              module ConnectionAdapters
         
     | 
| 
      
 3 
     | 
    
         
            +
                module MySQL
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module SchemaStatements # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
                    private
         
     | 
| 
      
 6 
     | 
    
         
            +
                      def data_source_sql(name = nil, type: nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                        scope = quoted_scope(name, type: type)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                        sql = "SELECT table_name FROM information_schema.tables"
         
     | 
| 
      
 10 
     | 
    
         
            +
                        sql << " WHERE table_schema = #{scope[:schema]}"
         
     | 
| 
      
 11 
     | 
    
         
            +
                        sql << " AND table_name = #{scope[:name]}" if scope[:name]
         
     | 
| 
      
 12 
     | 
    
         
            +
                        sql << " AND table_type = #{scope[:type]}" if scope[:type]
         
     | 
| 
      
 13 
     | 
    
         
            +
                        sql
         
     | 
| 
      
 14 
     | 
    
         
            +
                      end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                      def quoted_scope(name = nil, type: nil)
         
     | 
| 
      
 17 
     | 
    
         
            +
                        schema, name = extract_schema_qualified_name(name)
         
     | 
| 
      
 18 
     | 
    
         
            +
                        scope = {}
         
     | 
| 
      
 19 
     | 
    
         
            +
                        scope[:schema] = schema ? quote(schema) : "database()"
         
     | 
| 
      
 20 
     | 
    
         
            +
                        scope[:name] = quote(name) if name
         
     | 
| 
      
 21 
     | 
    
         
            +
                        scope[:type] = quote(type) if type
         
     | 
| 
      
 22 
     | 
    
         
            +
                        scope
         
     | 
| 
      
 23 
     | 
    
         
            +
                      end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                      def extract_schema_qualified_name(string)
         
     | 
| 
      
 26 
     | 
    
         
            +
                        schema, name = string.to_s.scan(/[^`.\s]+|`[^`]*`/)
         
     | 
| 
      
 27 
     | 
    
         
            +
                        schema, name = nil, schema unless name
         
     | 
| 
      
 28 
     | 
    
         
            +
                        [schema, name]
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -54,81 +54,13 @@ module ActiveRecord 
     | 
|
| 
       54 
54 
     | 
    
         
             
                      execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
         
     | 
| 
       55 
55 
     | 
    
         
             
                    end
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                    # Returns the list of all tables in the schema search path.
         
     | 
| 
       58 
     | 
    
         
            -
                    def tables
         
     | 
| 
       59 
     | 
    
         
            -
                      select_values("SELECT tablename FROM pg_tables WHERE schemaname = ANY(current_schemas(false))", "SCHEMA")
         
     | 
| 
       60 
     | 
    
         
            -
                    end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                    def data_sources # :nodoc
         
     | 
| 
       63 
     | 
    
         
            -
                      select_values(<<-SQL, "SCHEMA")
         
     | 
| 
       64 
     | 
    
         
            -
                        SELECT c.relname
         
     | 
| 
       65 
     | 
    
         
            -
                        FROM pg_class c
         
     | 
| 
       66 
     | 
    
         
            -
                        LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
         
     | 
| 
       67 
     | 
    
         
            -
                        WHERE c.relkind IN ('r','v','m') -- (r)elation/table, (v)iew, (m)aterialized view
         
     | 
| 
       68 
     | 
    
         
            -
                        AND n.nspname = ANY (current_schemas(false))
         
     | 
| 
       69 
     | 
    
         
            -
                      SQL
         
     | 
| 
       70 
     | 
    
         
            -
                    end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                    def views # :nodoc:
         
     | 
| 
       73 
     | 
    
         
            -
                      select_values(<<-SQL, "SCHEMA")
         
     | 
| 
       74 
     | 
    
         
            -
                        SELECT c.relname
         
     | 
| 
       75 
     | 
    
         
            -
                        FROM pg_class c
         
     | 
| 
       76 
     | 
    
         
            -
                        LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
         
     | 
| 
       77 
     | 
    
         
            -
                        WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
         
     | 
| 
       78 
     | 
    
         
            -
                        AND n.nspname = ANY (current_schemas(false))
         
     | 
| 
       79 
     | 
    
         
            -
                      SQL
         
     | 
| 
       80 
     | 
    
         
            -
                    end
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                    # Returns true if table exists.
         
     | 
| 
       83 
     | 
    
         
            -
                    # If the schema is not specified as part of +name+ then it will only find tables within
         
     | 
| 
       84 
     | 
    
         
            -
                    # the current schema search path (regardless of permissions to access tables in other schemas)
         
     | 
| 
       85 
     | 
    
         
            -
                    def table_exists?(name)
         
     | 
| 
       86 
     | 
    
         
            -
                      name = Utils.extract_schema_qualified_name(name.to_s)
         
     | 
| 
       87 
     | 
    
         
            -
                      return false unless name.identifier
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                      select_values(<<-SQL, "SCHEMA").any?
         
     | 
| 
       90 
     | 
    
         
            -
                        SELECT tablename
         
     | 
| 
       91 
     | 
    
         
            -
                        FROM pg_tables
         
     | 
| 
       92 
     | 
    
         
            -
                        WHERE tablename = #{quote(name.identifier)}
         
     | 
| 
       93 
     | 
    
         
            -
                        AND schemaname = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
         
     | 
| 
       94 
     | 
    
         
            -
                      SQL
         
     | 
| 
       95 
     | 
    
         
            -
                    end
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
                    def data_source_exists?(name) # :nodoc:
         
     | 
| 
       98 
     | 
    
         
            -
                      name = Utils.extract_schema_qualified_name(name.to_s)
         
     | 
| 
       99 
     | 
    
         
            -
                      return false unless name.identifier
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
                      select_values(<<-SQL, "SCHEMA").any?
         
     | 
| 
       102 
     | 
    
         
            -
                        SELECT c.relname
         
     | 
| 
       103 
     | 
    
         
            -
                        FROM pg_class c
         
     | 
| 
       104 
     | 
    
         
            -
                        LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
         
     | 
| 
       105 
     | 
    
         
            -
                        WHERE c.relkind IN ('r','v','m') -- (r)elation/table, (v)iew, (m)aterialized view
         
     | 
| 
       106 
     | 
    
         
            -
                        AND c.relname = #{quote(name.identifier)}
         
     | 
| 
       107 
     | 
    
         
            -
                        AND n.nspname = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
         
     | 
| 
       108 
     | 
    
         
            -
                      SQL
         
     | 
| 
       109 
     | 
    
         
            -
                    end
         
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
                    def view_exists?(view_name) # :nodoc:
         
     | 
| 
       112 
     | 
    
         
            -
                      name = Utils.extract_schema_qualified_name(view_name.to_s)
         
     | 
| 
       113 
     | 
    
         
            -
                      return false unless name.identifier
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                      select_values(<<-SQL, "SCHEMA").any?
         
     | 
| 
       116 
     | 
    
         
            -
                        SELECT c.relname
         
     | 
| 
       117 
     | 
    
         
            -
                        FROM pg_class c
         
     | 
| 
       118 
     | 
    
         
            -
                        LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
         
     | 
| 
       119 
     | 
    
         
            -
                        WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
         
     | 
| 
       120 
     | 
    
         
            -
                        AND c.relname = #{quote(name.identifier)}
         
     | 
| 
       121 
     | 
    
         
            -
                        AND n.nspname = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
         
     | 
| 
       122 
     | 
    
         
            -
                      SQL
         
     | 
| 
       123 
     | 
    
         
            -
                    end
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
57 
     | 
    
         
             
                    def drop_table(table_name, options = {}) # :nodoc:
         
     | 
| 
       126 
58 
     | 
    
         
             
                      execute "DROP TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
         
     | 
| 
       127 
59 
     | 
    
         
             
                    end
         
     | 
| 
       128 
60 
     | 
    
         | 
| 
       129 
61 
     | 
    
         
             
                    # Returns true if schema exists.
         
     | 
| 
       130 
62 
     | 
    
         
             
                    def schema_exists?(name)
         
     | 
| 
       131 
     | 
    
         
            -
                      select_value("SELECT COUNT(*) FROM pg_namespace WHERE nspname =  
     | 
| 
      
 63 
     | 
    
         
            +
                      select_value("SELECT COUNT(*) FROM pg_namespace WHERE nspname = #{quote(name)}", "SCHEMA").to_i > 0
         
     | 
| 
       132 
64 
     | 
    
         
             
                    end
         
     | 
| 
       133 
65 
     | 
    
         | 
| 
       134 
66 
     | 
    
         
             
                    # Verifies existence of an index with a given name.
         
     | 
| 
         @@ -138,8 +70,8 @@ module ActiveRecord 
     | 
|
| 
       138 
70 
     | 
    
         
             
                          Passing default to #index_name_exists? is deprecated without replacement.
         
     | 
| 
       139 
71 
     | 
    
         
             
                        MSG
         
     | 
| 
       140 
72 
     | 
    
         
             
                      end
         
     | 
| 
       141 
     | 
    
         
            -
                      table =  
     | 
| 
       142 
     | 
    
         
            -
                      index =  
     | 
| 
      
 73 
     | 
    
         
            +
                      table = quoted_scope(table_name)
         
     | 
| 
      
 74 
     | 
    
         
            +
                      index = quoted_scope(index_name)
         
     | 
| 
       143 
75 
     | 
    
         | 
| 
       144 
76 
     | 
    
         
             
                      select_value(<<-SQL, "SCHEMA").to_i > 0
         
     | 
| 
       145 
77 
     | 
    
         
             
                        SELECT COUNT(*)
         
     | 
| 
         @@ -148,9 +80,9 @@ module ActiveRecord 
     | 
|
| 
       148 
80 
     | 
    
         
             
                        INNER JOIN pg_class i ON d.indexrelid = i.oid
         
     | 
| 
       149 
81 
     | 
    
         
             
                        LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
         
     | 
| 
       150 
82 
     | 
    
         
             
                        WHERE i.relkind = 'i'
         
     | 
| 
       151 
     | 
    
         
            -
                          AND i.relname =  
     | 
| 
       152 
     | 
    
         
            -
                          AND t.relname =  
     | 
| 
       153 
     | 
    
         
            -
                          AND n.nspname = #{index 
     | 
| 
      
 83 
     | 
    
         
            +
                          AND i.relname = #{index[:name]}
         
     | 
| 
      
 84 
     | 
    
         
            +
                          AND t.relname = #{table[:name]}
         
     | 
| 
      
 85 
     | 
    
         
            +
                          AND n.nspname = #{index[:schema]}
         
     | 
| 
       154 
86 
     | 
    
         
             
                      SQL
         
     | 
| 
       155 
87 
     | 
    
         
             
                    end
         
     | 
| 
       156 
88 
     | 
    
         | 
| 
         @@ -162,7 +94,7 @@ module ActiveRecord 
     | 
|
| 
       162 
94 
     | 
    
         
             
                        MSG
         
     | 
| 
       163 
95 
     | 
    
         
             
                      end
         
     | 
| 
       164 
96 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
                       
     | 
| 
      
 97 
     | 
    
         
            +
                      scope = quoted_scope(table_name)
         
     | 
| 
       166 
98 
     | 
    
         | 
| 
       167 
99 
     | 
    
         
             
                      result = query(<<-SQL, "SCHEMA")
         
     | 
| 
       168 
100 
     | 
    
         
             
                        SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
         
     | 
| 
         @@ -176,8 +108,8 @@ module ActiveRecord 
     | 
|
| 
       176 
108 
     | 
    
         
             
                        LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
         
     | 
| 
       177 
109 
     | 
    
         
             
                        WHERE i.relkind = 'i'
         
     | 
| 
       178 
110 
     | 
    
         
             
                          AND d.indisprimary = 'f'
         
     | 
| 
       179 
     | 
    
         
            -
                          AND t.relname =  
     | 
| 
       180 
     | 
    
         
            -
                          AND n.nspname = #{ 
     | 
| 
      
 111 
     | 
    
         
            +
                          AND t.relname = #{scope[:name]}
         
     | 
| 
      
 112 
     | 
    
         
            +
                          AND n.nspname = #{scope[:schema]}
         
     | 
| 
       181 
113 
     | 
    
         
             
                        ORDER BY i.relname
         
     | 
| 
       182 
114 
     | 
    
         
             
                      SQL
         
     | 
| 
       183 
115 
     | 
    
         | 
| 
         @@ -239,22 +171,22 @@ module ActiveRecord 
     | 
|
| 
       239 
171 
     | 
    
         | 
| 
       240 
172 
     | 
    
         
             
                    # Returns a comment stored in database for given table
         
     | 
| 
       241 
173 
     | 
    
         
             
                    def table_comment(table_name) # :nodoc:
         
     | 
| 
       242 
     | 
    
         
            -
                       
     | 
| 
       243 
     | 
    
         
            -
                      if name 
     | 
| 
      
 174 
     | 
    
         
            +
                      scope = quoted_scope(table_name, type: "BASE TABLE")
         
     | 
| 
      
 175 
     | 
    
         
            +
                      if scope[:name]
         
     | 
| 
       244 
176 
     | 
    
         
             
                        select_value(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       245 
177 
     | 
    
         
             
                          SELECT pg_catalog.obj_description(c.oid, 'pg_class')
         
     | 
| 
       246 
178 
     | 
    
         
             
                          FROM pg_catalog.pg_class c
         
     | 
| 
       247 
179 
     | 
    
         
             
                            LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
         
     | 
| 
       248 
     | 
    
         
            -
                          WHERE c.relname = #{ 
     | 
| 
       249 
     | 
    
         
            -
                            AND c.relkind IN ( 
     | 
| 
       250 
     | 
    
         
            -
                            AND n.nspname = #{ 
     | 
| 
      
 180 
     | 
    
         
            +
                          WHERE c.relname = #{scope[:name]}
         
     | 
| 
      
 181 
     | 
    
         
            +
                            AND c.relkind IN (#{scope[:type]})
         
     | 
| 
      
 182 
     | 
    
         
            +
                            AND n.nspname = #{scope[:schema]}
         
     | 
| 
       251 
183 
     | 
    
         
             
                        SQL
         
     | 
| 
       252 
184 
     | 
    
         
             
                      end
         
     | 
| 
       253 
185 
     | 
    
         
             
                    end
         
     | 
| 
       254 
186 
     | 
    
         | 
| 
       255 
187 
     | 
    
         
             
                    # Returns the current database name.
         
     | 
| 
       256 
188 
     | 
    
         
             
                    def current_database
         
     | 
| 
       257 
     | 
    
         
            -
                      select_value(" 
     | 
| 
      
 189 
     | 
    
         
            +
                      select_value("SELECT current_database()", "SCHEMA")
         
     | 
| 
       258 
190 
     | 
    
         
             
                    end
         
     | 
| 
       259 
191 
     | 
    
         | 
| 
       260 
192 
     | 
    
         
             
                    # Returns the current schema name.
         
     | 
| 
         @@ -430,17 +362,15 @@ module ActiveRecord 
     | 
|
| 
       430 
362 
     | 
    
         
             
                    end
         
     | 
| 
       431 
363 
     | 
    
         | 
| 
       432 
364 
     | 
    
         
             
                    def primary_keys(table_name) # :nodoc:
         
     | 
| 
       433 
     | 
    
         
            -
                       
     | 
| 
      
 365 
     | 
    
         
            +
                      scope = quoted_scope(table_name)
         
     | 
| 
       434 
366 
     | 
    
         
             
                      select_values(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       435 
367 
     | 
    
         
             
                        SELECT column_name
         
     | 
| 
       436 
368 
     | 
    
         
             
                          FROM information_schema.key_column_usage kcu
         
     | 
| 
       437 
369 
     | 
    
         
             
                          JOIN information_schema.table_constraints tc
         
     | 
| 
       438 
     | 
    
         
            -
             
     | 
| 
       439 
     | 
    
         
            -
                           AND kcu.table_schema = tc.table_schema
         
     | 
| 
       440 
     | 
    
         
            -
                           AND kcu.constraint_name = tc.constraint_name
         
     | 
| 
      
 370 
     | 
    
         
            +
                         USING (table_schema, table_name, constraint_name)
         
     | 
| 
       441 
371 
     | 
    
         
             
                         WHERE constraint_type = 'PRIMARY KEY'
         
     | 
| 
       442 
     | 
    
         
            -
                           AND kcu.table_name = #{ 
     | 
| 
       443 
     | 
    
         
            -
                           AND kcu.table_schema = #{ 
     | 
| 
      
 372 
     | 
    
         
            +
                           AND kcu.table_name = #{scope[:name]}
         
     | 
| 
      
 373 
     | 
    
         
            +
                           AND kcu.table_schema = #{scope[:schema]}
         
     | 
| 
       444 
374 
     | 
    
         
             
                         ORDER BY kcu.ordinal_position
         
     | 
| 
       445 
375 
     | 
    
         
             
                      SQL
         
     | 
| 
       446 
376 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -489,7 +419,7 @@ module ActiveRecord 
     | 
|
| 
       489 
419 
     | 
    
         
             
                      end
         
     | 
| 
       490 
420 
     | 
    
         
             
                      execute sql
         
     | 
| 
       491 
421 
     | 
    
         | 
| 
       492 
     | 
    
         
            -
                      change_column_default(table_name, column_name, options[:default]) if  
     | 
| 
      
 422 
     | 
    
         
            +
                      change_column_default(table_name, column_name, options[:default]) if options.key?(:default)
         
     | 
| 
       493 
423 
     | 
    
         
             
                      change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
         
     | 
| 
       494 
424 
     | 
    
         
             
                      change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
         
     | 
| 
       495 
425 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -579,6 +509,7 @@ module ActiveRecord 
     | 
|
| 
       579 
509 
     | 
    
         
             
                    end
         
     | 
| 
       580 
510 
     | 
    
         | 
| 
       581 
511 
     | 
    
         
             
                    def foreign_keys(table_name)
         
     | 
| 
      
 512 
     | 
    
         
            +
                      scope = quoted_scope(table_name)
         
     | 
| 
       582 
513 
     | 
    
         
             
                      fk_info = select_all(<<-SQL.strip_heredoc, "SCHEMA")
         
     | 
| 
       583 
514 
     | 
    
         
             
                        SELECT t2.oid::regclass::text AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete
         
     | 
| 
       584 
515 
     | 
    
         
             
                        FROM pg_constraint c
         
     | 
| 
         @@ -588,8 +519,8 @@ module ActiveRecord 
     | 
|
| 
       588 
519 
     | 
    
         
             
                        JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
         
     | 
| 
       589 
520 
     | 
    
         
             
                        JOIN pg_namespace t3 ON c.connamespace = t3.oid
         
     | 
| 
       590 
521 
     | 
    
         
             
                        WHERE c.contype = 'f'
         
     | 
| 
       591 
     | 
    
         
            -
                          AND t1.relname = #{ 
     | 
| 
       592 
     | 
    
         
            -
                          AND t3.nspname =  
     | 
| 
      
 522 
     | 
    
         
            +
                          AND t1.relname = #{scope[:name]}
         
     | 
| 
      
 523 
     | 
    
         
            +
                          AND t3.nspname = #{scope[:schema]}
         
     | 
| 
       593 
524 
     | 
    
         
             
                        ORDER BY c.conname
         
     | 
| 
       594 
525 
     | 
    
         
             
                      SQL
         
     | 
| 
       595 
526 
     | 
    
         | 
| 
         @@ -615,10 +546,6 @@ module ActiveRecord 
     | 
|
| 
       615 
546 
     | 
    
         
             
                      end
         
     | 
| 
       616 
547 
     | 
    
         
             
                    end
         
     | 
| 
       617 
548 
     | 
    
         | 
| 
       618 
     | 
    
         
            -
                    def index_name_length
         
     | 
| 
       619 
     | 
    
         
            -
                      63
         
     | 
| 
       620 
     | 
    
         
            -
                    end
         
     | 
| 
       621 
     | 
    
         
            -
             
     | 
| 
       622 
549 
     | 
    
         
             
                    # Maps logical Rails types to PostgreSQL-specific data types.
         
     | 
| 
       623 
550 
     | 
    
         
             
                    def type_to_sql(type, limit: nil, precision: nil, scale: nil, array: nil, **) # :nodoc:
         
     | 
| 
       624 
551 
     | 
    
         
             
                      sql = \
         
     | 
| 
         @@ -677,6 +604,39 @@ module ActiveRecord 
     | 
|
| 
       677 
604 
     | 
    
         
             
                      )
         
     | 
| 
       678 
605 
     | 
    
         
             
                      PostgreSQLTypeMetadata.new(simple_type, oid: oid, fmod: fmod)
         
     | 
| 
       679 
606 
     | 
    
         
             
                    end
         
     | 
| 
      
 607 
     | 
    
         
            +
             
     | 
| 
      
 608 
     | 
    
         
            +
                    private
         
     | 
| 
      
 609 
     | 
    
         
            +
                      def data_source_sql(name = nil, type: nil)
         
     | 
| 
      
 610 
     | 
    
         
            +
                        scope = quoted_scope(name, type: type)
         
     | 
| 
      
 611 
     | 
    
         
            +
                        scope[:type] ||= "'r','v','m'" # (r)elation/table, (v)iew, (m)aterialized view
         
     | 
| 
      
 612 
     | 
    
         
            +
             
     | 
| 
      
 613 
     | 
    
         
            +
                        sql = "SELECT c.relname FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace"
         
     | 
| 
      
 614 
     | 
    
         
            +
                        sql << " WHERE n.nspname = #{scope[:schema]}"
         
     | 
| 
      
 615 
     | 
    
         
            +
                        sql << " AND c.relname = #{scope[:name]}" if scope[:name]
         
     | 
| 
      
 616 
     | 
    
         
            +
                        sql << " AND c.relkind IN (#{scope[:type]})"
         
     | 
| 
      
 617 
     | 
    
         
            +
                        sql
         
     | 
| 
      
 618 
     | 
    
         
            +
                      end
         
     | 
| 
      
 619 
     | 
    
         
            +
             
     | 
| 
      
 620 
     | 
    
         
            +
                      def quoted_scope(name = nil, type: nil)
         
     | 
| 
      
 621 
     | 
    
         
            +
                        schema, name = extract_schema_qualified_name(name)
         
     | 
| 
      
 622 
     | 
    
         
            +
                        type = \
         
     | 
| 
      
 623 
     | 
    
         
            +
                          case type
         
     | 
| 
      
 624 
     | 
    
         
            +
                          when "BASE TABLE"
         
     | 
| 
      
 625 
     | 
    
         
            +
                            "'r'"
         
     | 
| 
      
 626 
     | 
    
         
            +
                          when "VIEW"
         
     | 
| 
      
 627 
     | 
    
         
            +
                            "'v','m'"
         
     | 
| 
      
 628 
     | 
    
         
            +
                          end
         
     | 
| 
      
 629 
     | 
    
         
            +
                        scope = {}
         
     | 
| 
      
 630 
     | 
    
         
            +
                        scope[:schema] = schema ? quote(schema) : "ANY (current_schemas(false))"
         
     | 
| 
      
 631 
     | 
    
         
            +
                        scope[:name] = quote(name) if name
         
     | 
| 
      
 632 
     | 
    
         
            +
                        scope[:type] = type if type
         
     | 
| 
      
 633 
     | 
    
         
            +
                        scope
         
     | 
| 
      
 634 
     | 
    
         
            +
                      end
         
     | 
| 
      
 635 
     | 
    
         
            +
             
     | 
| 
      
 636 
     | 
    
         
            +
                      def extract_schema_qualified_name(string)
         
     | 
| 
      
 637 
     | 
    
         
            +
                        name = Utils.extract_schema_qualified_name(string.to_s)
         
     | 
| 
      
 638 
     | 
    
         
            +
                        [name.schema, name.identifier]
         
     | 
| 
      
 639 
     | 
    
         
            +
                      end
         
     | 
| 
       680 
640 
     | 
    
         
             
                  end
         
     | 
| 
       681 
641 
     | 
    
         
             
                end
         
     | 
| 
       682 
642 
     | 
    
         
             
              end
         
     |