Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5.1.1 ActiveRecord Postgres UUID breaks migrations when default value is specified on production #29222

Closed
develop-test1 opened this issue May 25, 2017 · 7 comments

Comments

@develop-test1
Copy link

Steps to reproduce

Create a new migration with UUID and and default value i.e:

class CreateApiV1AutomationQueues < ActiveRecord::Migration[5.0]
  def change
    create_table :api_v1_automation_queues, id: :uuid, default: 'uuid_generate_v4()', force: true do |t|
      t.string :title, null: false, index: true, unique: true
      t.integer :processing_type, null: false, default: 0, index: true
      t.boolean :pass_by, default: false
      t.uuid :engine_id, null: true, default: nil, index: true

      t.timestamps
    end
  end
end

Expected behavior

Migration should pass on production environment.

Actual behavior

Following error occurs:

== 20170418092133 CreateApiV1AutomationEngines: migrating =====================
-- adapter_name()
   -> 0.0000s
-- adapter_name()
   -> 0.0000s
-- create_table(:api_v1_automation_engines, {:id=>:uuid, :default=>"uuid_generate_v4()", :force=>true})
   -> 0.0128s
== 20170418092133 CreateApiV1AutomationEngines: migrated (0.0132s) ============

== 20170418110459 CreateApiV1AutomationQueues: migrating ======================
-- adapter_name()
   -> 0.0000s
-- adapter_name()
   -> 0.0000s
-- create_table(:api_v1_automation_queues, {:id=>:uuid, :default=>"uuid_generate_v4()", :force=>true})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

undefined method `include?' for nil:NilClass
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/postgresql/quoting.rb:65:in `quote_default_expression'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:17:in `quote_default_expression'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:103:in `add_column_options!'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/postgresql/schema_creation.rb:10:in `add_column_options!'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:34:in `visit_ColumnDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:14:in `accept'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `block in visit_TableDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `map'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `visit_TableDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:14:in `accept'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:288:in `create_table'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/postgresql-check-0.1.2/lib/postgresql/check/schema_statements.rb:62:in `create_table_with_checks'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:849:in `block in method_missing'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:818:in `block in say_with_time'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:818:in `say_with_time'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:838:in `method_missing'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration/compatibility.rb:45:in `create_table'
/var/www/cloudtrack-api/releases/20170525091436/db/migrate/20170418110459_create_api_v1_automation_queues.rb:3:in `change'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:792:in `exec_migration'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:776:in `block (2 levels) in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:775:in `block in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:408:in `with_connection'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:774:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:953:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1230:in `block in execute_migration_in_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1298:in `block in ddl_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:225:in `block in transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/transaction.rb:194:in `block in within_new_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/transaction.rb:191:in `within_new_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:225:in `transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/transactions.rb:210:in `transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1298:in `ddl_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1229:in `execute_migration_in_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1201:in `block in migrate_without_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1200:in `each'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1200:in `migrate_without_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1148:in `block in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1317:in `with_advisory_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1148:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1007:in `up'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:985:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/tasks/database_tasks.rb:171:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/railties/databases.rake:58:in `block (2 levels) in <top (required)>'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `load'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `kernel_load'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:27:in `run'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:335:in `exec'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:20:in `dispatch'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:11:in `start'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/exe/bundle:32:in `block in <top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/exe/bundle:24:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/bin/bundle:23:in `load'
/usr/local/rvm/gems/ruby-2.3.0/bin/bundle:23:in `<main>'
/usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'
NoMethodError: undefined method `include?' for nil:NilClass
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/postgresql/quoting.rb:65:in `quote_default_expression'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:17:in `quote_default_expression'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:103:in `add_column_options!'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/postgresql/schema_creation.rb:10:in `add_column_options!'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:34:in `visit_ColumnDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:14:in `accept'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `block in visit_TableDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `map'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:45:in `visit_TableDefinition'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_creation.rb:14:in `accept'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:288:in `create_table'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/postgresql-check-0.1.2/lib/postgresql/check/schema_statements.rb:62:in `create_table_with_checks'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:849:in `block in method_missing'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:818:in `block in say_with_time'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:818:in `say_with_time'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:838:in `method_missing'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration/compatibility.rb:45:in `create_table'
/var/www/cloudtrack-api/releases/20170525091436/db/migrate/20170418110459_create_api_v1_automation_queues.rb:3:in `change'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:792:in `exec_migration'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:776:in `block (2 levels) in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:775:in `block in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:408:in `with_connection'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:774:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:953:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1230:in `block in execute_migration_in_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1298:in `block in ddl_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:225:in `block in transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/transaction.rb:194:in `block in within_new_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/transaction.rb:191:in `within_new_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:225:in `transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/transactions.rb:210:in `transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1298:in `ddl_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1229:in `execute_migration_in_transaction'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1201:in `block in migrate_without_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1200:in `each'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1200:in `migrate_without_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1148:in `block in migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1317:in `with_advisory_lock'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1148:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:1007:in `up'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/migration.rb:985:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/tasks/database_tasks.rb:171:in `migrate'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/activerecord-5.1.1/lib/active_record/railties/databases.rake:58:in `block (2 levels) in <top (required)>'
/var/www/cloudtrack-api/shared/bundle/ruby/2.3.0/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `load'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:74:in `kernel_load'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli/exec.rb:27:in `run'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:335:in `exec'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:20:in `dispatch'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/cli.rb:11:in `start'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/exe/bundle:32:in `block in <top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
/usr/local/rvm/gems/ruby-2.3.0/gems/bundler-1.14.6/exe/bundle:24:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/bin/bundle:23:in `load'
/usr/local/rvm/gems/ruby-2.3.0/bin/bundle:23:in `<main>'
/usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
rake stderr: Nothing written

System configuration

Rails version:

  • Rails 5.1.1

Ruby version:

  • ruby 2.3.0

Environment:

  • production (works in dev)
@develop-test1 develop-test1 changed the title 5.1.1 ActiveRecord Postgres UUID breaks migrations when default value is specified 5.1.1 ActiveRecord Postgres UUID breaks migrations when default value is specified on production May 25, 2017
@matthewd
Copy link
Member

@fxn looks like this got broken by 99cf755

@fxn
Copy link
Member

fxn commented May 26, 2017

@matthewd oh, I see the bug. I'll fix it.

@fxn
Copy link
Member

fxn commented May 29, 2017

I have been able to reproduce.

Let me remark that the line that causes the failure is

t.uuid :engine_id, null: true, default: nil, index: true

in which the :index option does not matter.

While this is fixed, let me say that you can probably just remove the :null and :default options. That column definition is saying the column can be NULL, and the default should be NULL, which is the case if you say nothing.

@fxn fxn self-assigned this May 29, 2017
@develop-test1
Copy link
Author

@fxn When can we expect this to be fixed?

@fxn
Copy link
Member

fxn commented May 29, 2017

I do not give estimations. Not even in my consultancy work for the last 8 years.

I'll fix it, and eventually a new release will be cut.

I can say I'll prioritize this ticket over other open source stuff.

@fxn
Copy link
Member

fxn commented May 29, 2017

@develop-test1 did you try the workaround by the way?

@develop-test1
Copy link
Author

@fxn Ok, thank you. Looking forward to it.

kamipo added a commit to kamipo/rails that referenced this issue May 30, 2017
`quote_default_expression` can be passed nil value when `null: true` and
`default: nil`. This addressed in that case.

Fixes rails#29222.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants