Ticket #8659: updated_index_dump_in_postgresql_adapter_and_tests_against_edge.diff
| File updated_index_dump_in_postgresql_adapter_and_tests_against_edge.diff, 4.4 kB (added by sveiss, 1 year ago) |
|---|
-
activerecord/test/cases/schema_test_postgresql.rb
old new 4 4 self.use_transactional_fixtures = false 5 5 6 6 SCHEMA_NAME = 'test_schema' 7 SCHEMA2_NAME = 'test_schema2' 7 8 TABLE_NAME = 'things' 9 INDEX_A_NAME = 'a_index_things_on_name' 10 INDEX_B_NAME = 'b_index_things_on_different_columns_in_each_schema' 11 INDEX_A_COLUMN = 'name' 12 INDEX_B_COLUMN_S1 = 'email' 13 INDEX_B_COLUMN_S2 = 'moment' 8 14 COLUMNS = [ 9 15 'id integer', 10 16 'name character varying(50)', 17 'email character varying(50)', 11 18 'moment timestamp without time zone default now()' 12 19 ] 13 20 14 21 def setup 15 22 @connection = ActiveRecord::Base.connection 16 23 @connection.execute "CREATE SCHEMA #{SCHEMA_NAME} CREATE TABLE #{TABLE_NAME} (#{COLUMNS.join(',')})" 24 @connection.execute "CREATE SCHEMA #{SCHEMA2_NAME} CREATE TABLE #{TABLE_NAME} (#{COLUMNS.join(',')})" 25 @connection.execute "CREATE INDEX #{INDEX_A_NAME} ON #{SCHEMA_NAME}.#{TABLE_NAME} USING btree (#{INDEX_A_COLUMN});" 26 @connection.execute "CREATE INDEX #{INDEX_A_NAME} ON #{SCHEMA2_NAME}.#{TABLE_NAME} USING btree (#{INDEX_A_COLUMN});" 27 @connection.execute "CREATE INDEX #{INDEX_B_NAME} ON #{SCHEMA_NAME}.#{TABLE_NAME} USING btree (#{INDEX_B_COLUMN_S1});" 28 @connection.execute "CREATE INDEX #{INDEX_B_NAME} ON #{SCHEMA2_NAME}.#{TABLE_NAME} USING btree (#{INDEX_B_COLUMN_S2});" 17 29 end 18 30 19 31 def teardown 32 @connection.execute "DROP SCHEMA #{SCHEMA2_NAME} CASCADE" 20 33 @connection.execute "DROP SCHEMA #{SCHEMA_NAME} CASCADE" 21 34 end 22 35 … … 48 61 assert_nothing_raised { with_schema_search_path nil } 49 62 end 50 63 64 def test_dump_indexes_for_schema_one 65 do_dump_index_tests_for_schema(SCHEMA_NAME, INDEX_A_COLUMN, INDEX_B_COLUMN_S1) 66 end 67 68 def test_dump_indexes_for_schema_two 69 do_dump_index_tests_for_schema(SCHEMA2_NAME, INDEX_A_COLUMN, INDEX_B_COLUMN_S2) 70 end 71 51 72 private 52 73 def columns(table_name) 53 74 @connection.send(:column_definitions, table_name).map do |name, type, default| … … 61 82 ensure 62 83 @connection.schema_search_path = "'$user', public" 63 84 end 85 86 def do_dump_index_tests_for_schema(this_schema_name, first_index_column_name, second_index_column_name) 87 with_schema_search_path(this_schema_name) do 88 indexes = @connection.indexes(TABLE_NAME).sort_by {|i| i.name} 89 assert_equal 2,indexes.size 90 91 do_dump_index_assertions_for_one_index(indexes[0], INDEX_A_NAME, first_index_column_name) 92 do_dump_index_assertions_for_one_index(indexes[1], INDEX_B_NAME, second_index_column_name) 93 end 94 end 95 96 def do_dump_index_assertions_for_one_index(this_index, this_index_name, this_index_column) 97 assert_equal TABLE_NAME, this_index.table 98 assert_equal 1, this_index.columns.size 99 assert_equal this_index_column, this_index.columns[0] 100 assert_equal this_index_name, this_index.name 101 end 64 102 end -
activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
old new 447 447 448 448 # Returns the list of all indexes for a table. 449 449 def indexes(table_name, name = nil) 450 result = query(<<-SQL, name) 451 SELECT i.relname, d.indisunique, a.attname 452 FROM pg_class t, pg_class i, pg_index d, pg_attribute a 450 schemas = schema_search_path.split(/,/).map { |p| quote(p) }.join(',') 451 result = query(<<-SQL, name) 452 SELECT distinct i.relname, d.indisunique, a.attname 453 FROM pg_class t, pg_class i, pg_index d, pg_attribute a 453 454 WHERE i.relkind = 'i' 454 455 AND d.indexrelid = i.oid 455 456 AND d.indisprimary = 'f' 456 457 AND t.oid = d.indrelid 457 458 AND t.relname = '#{table_name}' 459 AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname IN (#{schemas}) ) 458 460 AND a.attrelid = t.oid 459 461 AND ( d.indkey[0]=a.attnum OR d.indkey[1]=a.attnum 460 462 OR d.indkey[2]=a.attnum OR d.indkey[3]=a.attnum