Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

pg, support default values for enum types. Closes #7814.

This is an intermediate solution. It is related to the refactoring @sgrif
is making and will change in the future.
  • Loading branch information...
commit b9eeb0339df7bd746273d680a26258df78dbd262 1 parent d6c1205
Yves Senn senny authored
4 activerecord/CHANGELOG.md
View
@@ -1,3 +1,7 @@
+* PostgreSQL support default values for enum types. Fixes #7814.
+
+ *Yves Senn*
+
* PostgreSQL `default_sequence_name` respects schema. Fixes #7516.
*Yves Senn*
2  activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
View
@@ -179,7 +179,7 @@ def columns(table_name)
# Limit, precision, and scale are all handled by the superclass.
column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod|
oid = get_oid_type(oid.to_i, fmod.to_i, column_name, type)
- default_value = extract_value_from_default(default)
+ default_value = extract_value_from_default(oid, default)
default_function = extract_default_function(default_value, default)
new_column(column_name, default_value, oid, type, notnull == 'f', default_function)
end
9 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
View
@@ -498,7 +498,7 @@ def extract_limit(sql_type) # :nodoc:
end
# Extracts the value from a PostgreSQL column default definition.
- def extract_value_from_default(default) # :nodoc:
+ def extract_value_from_default(oid, default) # :nodoc:
# This is a performance optimization for Ruby 1.9.2 in development.
# If the value is nil, we return nil straight away without checking
# the regular expressions. If we check each regular expression,
@@ -507,6 +507,13 @@ def extract_value_from_default(default) # :nodoc:
# makes this method very very slow.
return default unless default
+ # TODO: The default extraction is related to the cast-type.
+ # we should probably make a type_map lookup and cast the default-
+ # expression accordingly
+ if oid.type == :enum && default =~ /\A'(.*)'::/
+ return $1
+ end
+
case default
when /\A'(.*)'::(num|date|tstz|ts|int4|int8)range\z/m
$1
11 activerecord/test/cases/adapters/postgresql/enum_test.rb
View
@@ -39,6 +39,17 @@ def test_column
assert_not column.array
end
+ def test_enum_defaults
+ @connection.add_column 'postgresql_enums', 'good_mood', :mood, default: 'happy'
+ PostgresqlEnum.reset_column_information
+ column = PostgresqlEnum.columns_hash["good_mood"]
+
+ assert_equal "happy", column.default
+ assert_equal "happy", PostgresqlEnum.new.good_mood
+ ensure
+ PostgresqlEnum.reset_column_information
+ end
+
def test_enum_mapping
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
enum = PostgresqlEnum.first
Please sign in to comment.
Something went wrong with that request. Please try again.