Skip to content

Commit 6c7a848

Browse files
authored
Merge pull request rails#54141 from arthurhess/fix/enum-types-with-comma
Fix: ensure PostgreSQL enum types can contain commas
2 parents 93ea738 + 841b47b commit 6c7a848

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

activerecord/lib/active_record/connection_adapters/postgresql/schema_dumper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def types(stream)
2222
stream.puts " # Custom types defined in this database."
2323
stream.puts " # Note that some types may not work with other database engines. Be careful if changing database."
2424
types.sort.each do |name, values|
25-
stream.puts " create_enum #{name.inspect}, #{values.split(",").inspect}"
25+
stream.puts " create_enum #{name.inspect}, #{values.inspect}"
2626
end
2727
stream.puts
2828
end

activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ def enum_types
521521
type.typname AS name,
522522
type.OID AS oid,
523523
n.nspname AS schema,
524-
string_agg(enum.enumlabel, ',' ORDER BY enum.enumsortorder) AS value
524+
array_agg(enum.enumlabel ORDER BY enum.enumsortorder) AS value
525525
FROM pg_enum AS enum
526526
JOIN pg_type AS type ON (type.oid = enum.enumtypid)
527527
JOIN pg_namespace n ON type.typnamespace = n.oid

activerecord/test/cases/adapters/postgresql/invertible_migration_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_migrate_revert_create_enum
7979
CreateEnumMigration.new.migrate(:up)
8080

8181
assert @connection.column_exists?(:enums, :best_color, sql_type: "color", default: "blue", null: false)
82-
assert_equal [["color", "blue,green"]], @connection.enum_types
82+
assert_equal [["color", ["blue", "green"]]], @connection.enum_types
8383

8484
CreateEnumMigration.new.migrate(:down)
8585

@@ -94,7 +94,7 @@ def test_migrate_revert_drop_enum
9494
assert_equal [], @connection.enum_types
9595

9696
DropEnumMigration.new.migrate(:down)
97-
assert_equal [["color", "blue,green"]], @connection.enum_types
97+
assert_equal [["color", ["blue", "green"]]], @connection.enum_types
9898
end
9999

100100
def test_migrate_revert_add_and_validate_check_constraint

activerecord/test/cases/schema_dumper_test.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,28 @@ def test_schema_dump_include_limit_for_float4_field
433433
output = dump_table_schema "numeric_data"
434434
assert_match %r{t\.float\s+"temperature_with_limit",\s+limit: 24$}, output
435435
end
436+
437+
def test_schema_dump_keeps_enum_intact_if_it_contains_comma
438+
original, $stdout = $stdout, StringIO.new
439+
440+
migration = Class.new(ActiveRecord::Migration::Current) do
441+
def up
442+
create_enum "enum_with_comma", ["value1", "value,2", "value3"]
443+
end
444+
445+
def down
446+
drop_enum "enum_with_comma"
447+
end
448+
end
449+
450+
migration.migrate(:up)
451+
output = dump_all_table_schema
452+
453+
assert_includes output, 'create_enum "enum_with_comma", ["value1", "value,2", "value3"]', output
454+
ensure
455+
migration.migrate(:down)
456+
$stdout = original
457+
end
436458
end
437459

438460
def test_schema_dump_keeps_large_precision_integer_columns_as_decimal

0 commit comments

Comments
 (0)