diff options
3 files changed, 24 insertions, 9 deletions
| diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index f1921dded8..fdbb4b5b68 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,10 @@ +*   Support passing the schema name as a prefix to table name in +    `ConnectionAdapters::SchemaStatements#indexes`. Previously the prefix would +    be considered a full part of the index name, and only the schema in the +    current search path would be considered. + +    *Grey Baker* +  *   Introduce ApplicationRecord, an Active Record layer super type.      An `ApplicationRecord` let's engines have models, isolated from the main diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb index a48d64f7bd..98a3ce6782 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb @@ -169,15 +169,18 @@ module ActiveRecord          # Returns an array of indexes for the given table.          def indexes(table_name, name = nil) -           result = query(<<-SQL, 'SCHEMA') -             SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid -             FROM pg_class t -             INNER JOIN pg_index d ON t.oid = d.indrelid -             INNER JOIN pg_class i ON d.indexrelid = i.oid -             WHERE i.relkind = 'i' -               AND d.indisprimary = 'f' -               AND t.relname = '#{table_name}' -               AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) ) +          table = Utils.extract_schema_qualified_name(table_name.to_s) + +          result = query(<<-SQL, 'SCHEMA') +            SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid +            FROM pg_class t +            INNER JOIN pg_index d ON t.oid = d.indrelid +            INNER JOIN pg_class i ON d.indexrelid = i.oid +            LEFT JOIN pg_namespace n ON n.oid = i.relnamespace +            WHERE i.relkind = 'i' +              AND d.indisprimary = 'f' +              AND t.relname = '#{table.identifier}' +              AND n.nspname = #{table.schema ? "'#{table.schema}'" : 'ANY (current_schemas(false))'}              ORDER BY i.relname            SQL diff --git a/activerecord/test/cases/adapters/postgresql/schema_test.rb b/activerecord/test/cases/adapters/postgresql/schema_test.rb index 7c9169f6e2..3d55435b6a 100644 --- a/activerecord/test/cases/adapters/postgresql/schema_test.rb +++ b/activerecord/test/cases/adapters/postgresql/schema_test.rb @@ -321,6 +321,11 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase      do_dump_index_tests_for_schema("public, #{SCHEMA_NAME}", INDEX_A_COLUMN, INDEX_B_COLUMN_S1, INDEX_D_COLUMN, INDEX_E_COLUMN)    end +  def test_dump_indexes_for_table_with_scheme_specified_in_name +    indexes = @connection.indexes("#{SCHEMA_NAME}.#{TABLE_NAME}") +    assert_equal 4, indexes.size +  end +    def test_with_uppercase_index_name      @connection.execute "CREATE INDEX \"things_Index\" ON #{SCHEMA_NAME}.things (name)"      assert_nothing_raised { @connection.remove_index "things", name: "#{SCHEMA_NAME}.things_Index"} | 
