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

AR queries non-existent tables on schema:load since 3.2.12 #9304

Closed
rwz opened this issue Feb 16, 2013 · 8 comments
Closed

AR queries non-existent tables on schema:load since 3.2.12 #9304

rwz opened this issue Feb 16, 2013 · 8 comments

Comments

@rwz
Copy link
Contributor

rwz commented Feb 16, 2013

3.2.12 has introduced a regression in predicate builder. Some scopes are trying to query non-existing database table on codeload

Here are steps to reproduce

  • Create a new app

    $ rails new rails-scope-fail && cd rails-scope-fail
    
  • generate a model with an integer column and migrate

    $ rails g model user name lottery_number:integer && rake db:migrate
    
  • add some scopes to the model involving integer values

    class User < ActiveRecord::Base
        scope :lucky_winner, where(lottery_number: 13)
    end
  • mention User model in routes.rb. Devise does that usually. That would guarantee that user model will be loaded on schema:load

  • run RAILS_ENV=test bundle exec rake db:drop db:schema:load_if_ruby --trace

  • see this:

    ** Invoke db:drop (first_time)
    ** Invoke db:load_config (first_time)
    ** Execute db:load_config
    ** Invoke rails_env (first_time)
    ** Execute rails_env
    ** Execute db:drop
    ** Invoke db:schema:load_if_ruby (first_time)
    ** Invoke db:create (first_time)
    ** Invoke db:load_config 
    ** Invoke rails_env 
    ** Execute db:create
    ** Invoke environment (first_time)
    ** Execute environment
    rake aborted!
    Could not find table 'users'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/sqlite_adapter.rb:472:in `table_structure'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/sqlite_adapter.rb:346:in `columns'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:16:in `yield'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:16:in `block in initialize'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:56:in `yield'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:56:in `block in build_from_hash'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `map'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `build_from_hash'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/query_methods.rb:327:in `build_where'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/relation/query_methods.rb:136:in `where'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/querying.rb:9:in `where'
    /Users/rwz/work/rails-scope-fail/app/models/user.rb:2:in `<class:User>'
    /Users/rwz/work/rails-scope-fail/app/models/user.rb:1:in `<top (required)>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `block in require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:359:in `require_or_load'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:502:in `load_missing_constant'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:192:in `block in const_missing'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:190:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:190:in `const_missing'
    /Users/rwz/work/rails-scope-fail/config/routes.rb:2:in `block in <top (required)>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.12/lib/action_dispatch/routing/route_set.rb:282:in `instance_exec'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.12/lib/action_dispatch/routing/route_set.rb:282:in `eval_block'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.12/lib/action_dispatch/routing/route_set.rb:260:in `draw'
    /Users/rwz/work/rails-scope-fail/config/routes.rb:1:in `<top (required)>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `block in load'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:40:in `block in load_paths'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:40:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:40:in `load_paths'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:16:in `reload!'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:26:in `block in updater'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/file_update_checker.rb:78:in `call'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/file_update_checker.rb:78:in `execute'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:27:in `updater'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/routes_reloader.rb:7:in `execute_if_updated'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application/finisher.rb:66:in `block in <module:Finisher>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:30:in `instance_exec'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:30:in `run'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:55:in `block in run_initializers'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:54:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:54:in `run_initializers'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application.rb:136:in `initialize!'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/railtie/configurable.rb:30:in `method_missing'
    /Users/rwz/work/rails-scope-fail/config/environment.rb:5:in `<top (required)>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `block in require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application.rb:103:in `require_environment!'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/railties-3.2.12/lib/rails/application.rb:297:in `block (2 levels) in initialize_tasks'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:228:in `call'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:228:in `block in execute'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:223:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:223:in `execute'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:166:in `block in invoke_with_call_chain'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:187:in `block in invoke_prerequisites'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:185:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:185:in `invoke_prerequisites'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:165:in `block in invoke_with_call_chain'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/task.rb:152:in `invoke'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:143:in `invoke_task'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `block (2 levels) in top_level'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `each'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:101:in `block in top_level'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:110:in `run_with_threads'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:95:in `top_level'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:73:in `block in run'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:160:in `standard_exception_handling'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/lib/rake/application.rb:70:in `run'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/lib/ruby/gems/1.9.1/gems/rake-10.0.3/bin/rake:33:in `<top (required)>'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/bin/rake:23:in `load'
    /Users/rwz/.rbenv/versions/1.9.3-p327-perf/bin/rake:23:in `<main>'
    Tasks: TOP => db:schema:load_if_ruby => environment
    
@rwz
Copy link
Contributor Author

rwz commented Feb 16, 2013

Here's the culprit commit: 921a296

@senny
Copy link
Member

senny commented Feb 16, 2013

related to #9290

@zealot128
Copy link
Contributor

I have a similar problem, using models with different connections other than default "development"/"production", e.g.:

class Crm::User < ActiveRecord::Base
   establish_connection :crm

end

Crm::User.where("id = 1")  # runs fine!

Crm::User.where(id: 1)  # breaks!
# Error:
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'development.users' doesn't exist: SHOW FULL FIELDS FROM `FD_Organisation`
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `query'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `block in execute'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
        from gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
        from gems/newrelic_rpm-3.5.5.38/lib/new_relic/agent/instrumentation/active_record.rb:32:in `block in log_with_newrelic_instrumentation'
        from gems/newrelic_rpm-3.5.5.38/lib/new_relic/agent/method_tracer.rb:240:in `trace_execution_scoped'
        from gems/newrelic_rpm-3.5.5.38/lib/new_relic/agent/instrumentation/active_record.rb:29:in `log_with_newrelic_instrumentation'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:243:in `execute'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/mysql2_adapter.rb:211:in `execute'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:257:in `execute_and_free'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:424:in `columns'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:16:in `yield'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:16:in `default'
        from gems/activerecord-3.2.12/lib/active_record/connection_adapters/schema_cache.rb:16:in `block in initialize'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:56:in `yield'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:56:in `default'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:56:in `block in build_from_hash'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `each'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `map'
        from gems/activerecord-3.2.12/lib/active_record/relation/predicate_builder.rb:4:in `build_from_hash'
        from gems/activerecord-3.2.12/lib/active_record/relation/query_methods.rb:327:in `build_where'
        from gems/activerecord-3.2.12/lib/active_record/relation/query_methods.rb:136:in `where'
        from gems/activerecord-3.2.12/lib/active_record/querying.rb:9:in `where'
        from gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
        from gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
        from gems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>'

The predicate builder looks inside development.users, but the memberships table is only available in the crm.user database, as specified in the Base class.

@parndt
Copy link
Contributor

parndt commented Feb 25, 2013

[triage] CC @tenderlove @guilleiguaran and @dylanahsmith as they were involved in the commit ❤️

@guilleiguaran
Copy link
Member

@parndt @rwz the final decision was revert the commit in 3-2-stable and 3-1-stable and try to find another way to handle it in 4.0. This should be fixed in the next hours in 3-2-stable branch and we will release 3.2.13 soon with the fix.

@parndt
Copy link
Contributor

parndt commented Feb 25, 2013

@guilleiguaran 👍 thanks!

@dylanahsmith
Copy link
Contributor

I believe this should be fixed by pull #9265.

@steveklabnik
Copy link
Member

I've committed ee291b9 which fixes the issue. Thanks for the through reproduction instructions. <3

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

7 participants