diff options
| -rw-r--r-- | activerecord/CHANGELOG.md | 7 | ||||
| -rw-r--r-- | activerecord/lib/active_record/schema_dumper.rb | 3 | ||||
| -rw-r--r-- | activerecord/test/cases/adapters/postgresql/uuid_test.rb | 23 | 
3 files changed, 32 insertions, 1 deletions
| diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index d229254da4..1ba01d3618 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,10 @@ +*   Fix the schema dump generated for tables without constraints and with +    primary key with default value of custom PostgreSQL function result. + +    Fixes #16111 + +    *Andrey Novikov* +  *   Fix the SQL generated when a `delete_all` is run on an association to not      produce an `IN` statements. diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index 64bc68eefd..a94364bde1 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -120,7 +120,8 @@ HEADER            # first dump primary key column            if @connection.respond_to?(:pk_and_sequence_for)              pk, _ = @connection.pk_and_sequence_for(table) -          elsif @connection.respond_to?(:primary_key) +          end +          if !pk && @connection.respond_to?(:primary_key)              pk = @connection.primary_key(table)            end diff --git a/activerecord/test/cases/adapters/postgresql/uuid_test.rb b/activerecord/test/cases/adapters/postgresql/uuid_test.rb index f5b199b46a..df8faff546 100644 --- a/activerecord/test/cases/adapters/postgresql/uuid_test.rb +++ b/activerecord/test/cases/adapters/postgresql/uuid_test.rb @@ -87,10 +87,26 @@ class PostgresqlUUIDGenerationTest < ActiveRecord::TestCase        t.string 'name'        t.uuid 'other_uuid', default: 'uuid_generate_v4()'      end + +    # Create custom PostgreSQL function to generate UUIDs +    # to test dumping tables which columns have defaults with custom functions +    connection.execute <<-SQL +    CREATE OR REPLACE FUNCTION my_uuid_generator() RETURNS uuid +    AS $$ SELECT * FROM uuid_generate_v4() $$ +    LANGUAGE SQL VOLATILE; +    SQL + +    # Create such a table with custom function as default value generator +    connection.create_table('pg_uuids_2', id: :uuid, default: 'my_uuid_generator()') do |t| +      t.string 'name' +      t.uuid 'other_uuid_2', default: 'my_uuid_generator()' +    end    end    teardown do      drop_table "pg_uuids" +    drop_table 'pg_uuids_2' +    connection.execute 'DROP FUNCTION IF EXISTS my_uuid_generator();'    end    if ActiveRecord::Base.connection.supports_extensions? @@ -122,6 +138,13 @@ class PostgresqlUUIDGenerationTest < ActiveRecord::TestCase        assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: "uuid_generate_v1\(\)"/, schema.string)        assert_match(/t\.uuid   "other_uuid", default: "uuid_generate_v4\(\)"/, schema.string)      end + +    def test_schema_dumper_for_uuid_primary_key_with_custom_default +      schema = StringIO.new +      ActiveRecord::SchemaDumper.dump(connection, schema) +      assert_match(/\bcreate_table "pg_uuids_2", id: :uuid, default: "my_uuid_generator\(\)"/, schema.string) +      assert_match(/t\.uuid   "other_uuid_2", default: "my_uuid_generator\(\)"/, schema.string) +    end    end  end | 
