diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index a348318..d4b280d 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -809,11 +809,21 @@ module ActiveRecord default = options[:default] notnull = options[:null] == false - # Add the column. - execute("ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}") + # Attempt to add the column with default and null specified in one go + sql = old_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" + sql += " DEFAULT #{quote(default)}" if options_include_default?(options) + sql += " NOT NULL" if notnull + begin + execute sql + rescue ActiveRecord::StatementInvalid => e + raise e if postgresql_version >= 80000 - change_column_default(table_name, column_name, default) if options_include_default?(options) - change_column_null(table_name, column_name, false, default) if notnull + # Doesn't support default and null specification in alter table, do the old way + execute old_sql + + change_column_default(table_name, column_name, default) if options_include_default?(options) + change_column_null(table_name, column_name, false, default) if notnull + end end # Changes the column of a table.