You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Describe the bug
We recently upgraded Rails from 7.1.5.1 to 7.2.2.1 and when searching for phone numbers in Rails Admin we're getting a new error PG::NumericValueOutOfRange: ERROR: value "6121234567" is out of range for type integer. Our phone field has a type of "text" but Rails Admin is looking at all fields including our ID fields which are integer, thus causing the issue.
Reproduction steps
With the gems and versions listed below, click on a model in Rails Admin and use the main search field and enter in a phone number without dashes that is greater than 2147483647 (such as 6121234567) and hit the "refresh" button.
Expected behavior
Able to search across the fields of the model (both text and integers) without error.
Additional context
We isolated that this works as expected in 7.1.5.1 but in 7.2.0 does not.
Rails Admin 3.3.0 (also was present in 3.1.2)
Rails 7.2.0+
PG 1.5.6+ and and a table of with a PK of type integer (not bigint).
Stack Trace
active_record/connection_adapters/postgresql_adapter.rb in exec_params at line 894
active_record/connection_adapters/postgresql_adapter.rb in block (2 levels) in exec_no_cache at line 894
active_record/connection_adapters/abstract_adapter.rb in block in with_raw_connection at line 1004
active_support/concurrency/null_lock.rb in synchronize at line 9
active_record/connection_adapters/abstract_adapter.rb in with_raw_connection at line 976
active_record/connection_adapters/postgresql_adapter.rb in block in exec_no_cache at line 893
active_support/notifications/instrumenter.rb in instrument at line 58
active_record/connection_adapters/abstract_adapter.rb in log at line 1119
active_record/connection_adapters/postgresql_adapter.rb in exec_no_cache at line 892
active_record/connection_adapters/postgresql_adapter.rb in execute_and_clear at line 872
active_record/connection_adapters/postgresql/database_statements.rb in internal_exec_query at line 66
active_record/connection_adapters/abstract/database_statements.rb in select at line 647
active_record/connection_adapters/abstract/database_statements.rb in select_all at line 73
active_record/connection_adapters/abstract/query_cache.rb in block in select_all at line 248
active_record/connection_adapters/abstract/query_cache.rb in block (2 levels) in cache_sql at line 286
active_record/connection_adapters/abstract/query_cache.rb in compute_if_absent at line 80
active_record/connection_adapters/abstract/query_cache.rb in block in cache_sql at line 284
active_support/concurrency/null_lock.rb in synchronize at line 9
active_record/connection_adapters/abstract/query_cache.rb in cache_sql at line 283
active_record/connection_adapters/abstract/query_cache.rb in select_all at line 248
active_record/querying.rb in _query_by_sql at line 70
active_record/relation.rb in block (2 levels) in exec_main_query at line 1431
active_record/connection_adapters/abstract/connection_pool.rb in with_connection at line 415
active_record/connection_handling.rb in with_connection at line 296
active_record/relation.rb in block in exec_main_query at line 1430
active_record/relation.rb in skip_query_cache_if_necessary at line 1452
active_record/relation.rb in exec_main_query at line 1414
active_record/relation.rb in block in exec_queries at line 1392
active_record/relation.rb in skip_query_cache_if_necessary at line 1452
active_record/relation.rb in exec_queries at line 1386
active_record/relation.rb in load at line 1167
active_record/relation.rb in records at line 336
active_record/relation/delegation.rb in each at line 98
/usr/local/bundle/gems/rails_admin-3.3.0/app/views/rails_admin/main/index.html.erb at line 127
action_view/helpers/capture_helper.rb in block in capture at line 50
action_view/buffers.rb in capture at line 75
action_view/helpers/capture_helper.rb in capture at line 50
action_view/helpers/form_tag_helper.rb in form_tag at line 81
/usr/local/bundle/gems/rails_admin-3.3.0/app/views/rails_admin/main/index.html.erb at line 95
action_view/base.rb in public_send at line 281
action_view/base.rb in _run at line 281
action_view/template.rb in block in render at line 285
active_support/notifications.rb in block in instrument at line 210
active_support/notifications/instrumenter.rb in instrument at line 58
active_support/notifications.rb in instrument at line 210
action_view/template.rb in instrument_render_template at line 584
action_view/template.rb in render at line 273
action_view/renderer/template_renderer.rb in block (2 levels) in render_template at line 66
active_support/notifications.rb in instrument at line 212
action_view/renderer/template_renderer.rb in block in render_template at line 60
action_view/renderer/template_renderer.rb in block in render_with_layout at line 76
active_support/notifications.rb in block in instrument at line 210
active_support/notifications/instrumenter.rb in instrument at line 58
active_support/notifications.rb in instrument at line 210
action_view/renderer/template_renderer.rb in render_with_layout at line 75
action_view/renderer/template_renderer.rb in render_template at line 59
action_view/renderer/template_renderer.rb in render at line 11
action_view/renderer/renderer.rb in render_template_to_object at line 58
action_view/renderer/renderer.rb in render_to_object at line 31
action_view/rendering.rb in block in _render_template at line 135
action_view/base.rb in in_rendering_context at line 308
action_view/rendering.rb in _render_template at line 134
action_controller/metal/streaming.rb in _render_template at line 258
action_view/rendering.rb in render_to_body at line 121
action_controller/metal/rendering.rb in render_to_body at line 186
action_controller/metal/renderers.rb in render_to_body at line 142
abstract_controller/rendering.rb in render at line 29
action_controller/metal/rendering.rb in render at line 167
action_controller/metal/instrumentation.rb in block (2 levels) in render at line 32
benchmark.rb in realtime at line 323
active_support/core_ext/benchmark.rb in ms at line 14
action_controller/metal/instrumentation.rb in block in render at line 32
action_controller/metal/instrumentation.rb in cleanup_view_runtime at line 101
active_record/railties/controller_runtime.rb in cleanup_view_runtime at line 46
action_controller/metal/instrumentation.rb in render at line 31
rails_admin/config/actions/index.rb in block (4 levels) in <class:Index> at line 47
action_controller/metal/mime_responds.rb in respond_to at line 224
rails_admin/config/actions/index.rb in block (2 levels) in <class:Index> at line 45
/usr/local/bundle/gems/rails_admin-3.3.0/app/controllers/rails_admin/main_controller.rb in instance_eval at line 38
/usr/local/bundle/gems/rails_admin-3.3.0/app/controllers/rails_admin/main_controller.rb in action_missing at line 38
abstract_controller/base.rb in _handle_action_missing at line 239
action_controller/metal/basic_implicit_render.rb in send_action at line 8
abstract_controller/base.rb in process_action at line 226
action_controller/metal/rendering.rb in process_action at line 193
abstract_controller/callbacks.rb in block in process_action at line 261
active_support/callbacks.rb in block in run_callbacks at line 121
turbo-rails.rb in with_request_id at line 24
/usr/local/bundle/gems/turbo-rails-2.0.11/app/controllers/concerns/turbo/request_id_tracking.rb in turbo_tracking_request_id at line 10
active_support/callbacks.rb in block in run_callbacks at line 130
sentry/rails/controller_transaction.rb in block in sentry_around_action at line 34
sentry/hub.rb in with_child_span at line 108
sentry-ruby.rb in with_child_span at line 503
sentry/rails/controller_transaction.rb in sentry_around_action at line 18
active_support/callbacks.rb in block in run_callbacks at line 130
active_support/callbacks.rb in run_callbacks at line 141
abstract_controller/callbacks.rb in process_action at line 260
action_controller/metal/rescue.rb in process_action at line 27
action_controller/metal/instrumentation.rb in block in process_action at line 77
active_support/notifications.rb in block in instrument at line 210
active_support/notifications/instrumenter.rb in instrument at line 58
active_support/notifications.rb in instrument at line 210
action_controller/metal/instrumentation.rb in process_action at line 76
action_controller/metal/params_wrapper.rb in process_action at line 259
active_record/railties/controller_runtime.rb in process_action at line 39
abstract_controller/base.rb in process at line 163
action_view/rendering.rb in process at line 40
action_controller/metal.rb in dispatch at line 252
action_controller/metal.rb in dispatch at line 335
action_dispatch/routing/route_set.rb in dispatch at line 67
action_dispatch/routing/route_set.rb in serve at line 50
action_dispatch/journey/router.rb in block in serve at line 53
action_dispatch/journey/router.rb in block in find_routes at line 133
action_dispatch/journey/router.rb in each at line 126
action_dispatch/journey/router.rb in find_routes at line 126
action_dispatch/journey/router.rb in serve at line 34
action_dispatch/routing/route_set.rb in call at line 896
rails/engine.rb in call at line 535
rails/railtie.rb in public_send at line 226
rails/railtie.rb in method_missing at line 226
action_dispatch/routing/mapper.rb in block in <class:Constraints> at line 33
action_dispatch/routing/mapper.rb in serve at line 62
action_dispatch/journey/router.rb in block in serve at line 53
action_dispatch/journey/router.rb in block in find_routes at line 133
action_dispatch/journey/router.rb in each at line 126
action_dispatch/journey/router.rb in find_routes at line 126
action_dispatch/journey/router.rb in serve at line 34
action_dispatch/routing/route_set.rb in call at line 896
warden/manager.rb in block in call at line 36
warden/manager.rb in catch at line 34
warden/manager.rb in call at line 34
rack/tempfile_reaper.rb in call at line 20
rack/etag.rb in call at line 29
rack/conditional_get.rb in call at line 31
rack/head.rb in call at line 15
action_dispatch/http/permissions_policy.rb in call at line 38
rack/session/abstract/id.rb in context at line 274
rack/session/abstract/id.rb in call at line 268
action_dispatch/middleware/cookies.rb in call at line 704
action_dispatch/middleware/callbacks.rb in block in call at line 31
active_support/callbacks.rb in run_callbacks at line 101
action_dispatch/middleware/callbacks.rb in call at line 30
sentry/rails/rescued_exception_interceptor.rb in call at line 14
action_dispatch/middleware/debug_exceptions.rb in call at line 31
sentry/rack/capture_exceptions.rb in block (2 levels) in call at line 30
sentry/hub.rb in with_session_tracking at line 269
sentry-ruby.rb in with_session_tracking at line 416
sentry/rack/capture_exceptions.rb in block in call at line 21
sentry/hub.rb in with_scope at line 59
sentry-ruby.rb in with_scope at line 396
sentry/rack/capture_exceptions.rb in call at line 20
action_dispatch/middleware/show_exceptions.rb in call at line 32
rails/rack/logger.rb in call_app at line 41
rails/rack/logger.rb in call at line 29
action_dispatch/middleware/remote_ip.rb in call at line 96
action_dispatch/middleware/request_id.rb in call at line 33
rack/method_override.rb in call at line 28
rack/runtime.rb in call at line 24
action_dispatch/middleware/executor.rb in call at line 16
action_dispatch/middleware/static.rb in call at line 27
rack/sendfile.rb in call at line 114
action_dispatch/middleware/ssl.rb in call at line 82
rails/engine.rb in call at line 535
puma/configuration.rb in call at line 279
puma/request.rb in block in handle_request at line 99
puma/thread_pool.rb in with_force_shutdown at line 389
puma/request.rb in handle_request at line 98
puma/server.rb in process_client at line 468
puma/server.rb in block in run at line 249
puma/thread_pool.rb in block in spawn_thread at line 166
Anybody else seen this and have a configuration workaround?
The text was updated successfully, but these errors were encountered:
Ended up modifying an existing patch to solve for this issue.
ActiveSupport.on_load(:active_record) do
require 'rails_admin/adapters/active_record'
module RailsAdmin # rubocop:disable Lint/ConstantDefinitionInBlock
module Adapters
module ActiveRecord
def query_scope(scope, query, fields = config.list.fields.select(&:queryable?))
wb = WhereBuilder.new(scope)
fields.each do |field|
next if field.is_a?(RailsAdmin::Config::Fields::Types::Serialized) #2017-03-17: Don't crash on "@example.com" in "serialize :my_field, JSON" fields.
# Handle integer fields (like `id`) safely: Don't crash on 6121231234 style phone numbers since they are bigger than the max integer.
if field.type == :integer
begin
# Convert query to integer for exact matches
int_query = Integer(query)
wb.add(field, int_query, 'eq')
rescue ArgumentError, TypeError
# If query is not an integer, handle it as a string by casting to text
scope = scope.where("#{field.name}::TEXT ILIKE ?", "%#{query}%")
end
else
# Default handling for other field types
value = parse_field_value(field, query)
wb.add(field, value, field.search_operator)
end
end
# OR all query statements
wb.build
end
end
end
end
end
Describe the bug
We recently upgraded Rails from 7.1.5.1 to 7.2.2.1 and when searching for phone numbers in Rails Admin we're getting a new error
PG::NumericValueOutOfRange: ERROR: value "6121234567" is out of range for type integer
. Our phone field has a type of "text" but Rails Admin is looking at all fields including our ID fields which are integer, thus causing the issue.Reproduction steps
With the gems and versions listed below, click on a model in Rails Admin and use the main search field and enter in a phone number without dashes that is greater than 2147483647 (such as 6121234567) and hit the "refresh" button.
Expected behavior
Able to search across the fields of the model (both text and integers) without error.
Additional context
We isolated that this works as expected in 7.1.5.1 but in 7.2.0 does not.
Stack Trace
Anybody else seen this and have a configuration workaround?
The text was updated successfully, but these errors were encountered: