提交 b9eeb033 编写于 作者: Y Yves Senn

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.
上级 d6c12055
* PostgreSQL support default values for enum types. Fixes #7814.
*Yves Senn*
* PostgreSQL `default_sequence_name` respects schema. Fixes #7516.
*Yves Senn*
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册