activerecord 5.0.7.2 → 6.0.3.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +708 -2040
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record.rb +37 -22
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +114 -55
- data/lib/active_record/associations/association_scope.rb +94 -94
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +86 -254
- data/lib/active_record/associations/collection_proxy.rb +158 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +143 -176
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -87
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
- data/lib/active_record/associations/preloader.rb +90 -103
- data/lib/active_record/associations/preloader/association.rb +86 -100
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +26 -14
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +54 -35
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -12
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +552 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +228 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +367 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +396 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -31
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +259 -266
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +201 -163
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +60 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +77 -87
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/model_schema.rb +131 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -252
- data/lib/active_record/relation.rb +440 -318
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +72 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +78 -62
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +476 -334
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +47 -27
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +225 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +23 -18
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +2 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +4 -3
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +62 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record.rb +7 -5
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +137 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
data/lib/active_record/errors.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module ActiveRecord
|
3
4
|
# = Active Record Errors
|
4
5
|
#
|
5
6
|
# Generic Active Record exception class.
|
@@ -44,10 +45,14 @@ module ActiveRecord
|
|
44
45
|
|
45
46
|
# Raised when connection to the database could not been established (for example when
|
46
47
|
# {ActiveRecord::Base.connection=}[rdoc-ref:ConnectionHandling#connection]
|
47
|
-
# is given a nil object).
|
48
|
+
# is given a +nil+ object).
|
48
49
|
class ConnectionNotEstablished < ActiveRecordError
|
49
50
|
end
|
50
51
|
|
52
|
+
# Raised when a write to the database is attempted on a read only connection.
|
53
|
+
class ReadOnlyError < ActiveRecordError
|
54
|
+
end
|
55
|
+
|
51
56
|
# Raised when Active Record cannot find a record by given id or set of ids.
|
52
57
|
class RecordNotFound < ActiveRecordError
|
53
58
|
attr_reader :model, :primary_key, :id
|
@@ -63,7 +68,7 @@ module ActiveRecord
|
|
63
68
|
|
64
69
|
# Raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
|
65
70
|
# {ActiveRecord::Base.create!}[rdoc-ref:Persistence::ClassMethods#create!]
|
66
|
-
# methods when a record is invalid and
|
71
|
+
# methods when a record is invalid and cannot be saved.
|
67
72
|
class RecordNotSaved < ActiveRecordError
|
68
73
|
attr_reader :record
|
69
74
|
|
@@ -96,20 +101,13 @@ module ActiveRecord
|
|
96
101
|
#
|
97
102
|
# Wraps the underlying database error as +cause+.
|
98
103
|
class StatementInvalid < ActiveRecordError
|
99
|
-
|
100
|
-
def initialize(message = nil, original_exception = nil)
|
101
|
-
if original_exception
|
102
|
-
ActiveSupport::Deprecation.warn("Passing #original_exception is deprecated and has no effect. " \
|
103
|
-
"Exceptions will automatically capture the original exception.", caller)
|
104
|
-
end
|
105
|
-
|
104
|
+
def initialize(message = nil, sql: nil, binds: nil)
|
106
105
|
super(message || $!.try(:message))
|
106
|
+
@sql = sql
|
107
|
+
@binds = binds
|
107
108
|
end
|
108
109
|
|
109
|
-
|
110
|
-
ActiveSupport::Deprecation.warn("#original_exception is deprecated. Use #cause instead.", caller)
|
111
|
-
cause
|
112
|
-
end
|
110
|
+
attr_reader :sql, :binds
|
113
111
|
end
|
114
112
|
|
115
113
|
# Defunct wrapper class kept for compatibility.
|
@@ -117,18 +115,60 @@ module ActiveRecord
|
|
117
115
|
class WrappedDatabaseException < StatementInvalid
|
118
116
|
end
|
119
117
|
|
120
|
-
# Raised when a record cannot be inserted because it would violate a uniqueness constraint.
|
118
|
+
# Raised when a record cannot be inserted or updated because it would violate a uniqueness constraint.
|
121
119
|
class RecordNotUnique < WrappedDatabaseException
|
122
120
|
end
|
123
121
|
|
124
|
-
# Raised when a record cannot be inserted or updated because it references a non-existent record
|
122
|
+
# Raised when a record cannot be inserted or updated because it references a non-existent record,
|
123
|
+
# or when a record cannot be deleted because a parent record references it.
|
125
124
|
class InvalidForeignKey < WrappedDatabaseException
|
126
125
|
end
|
127
126
|
|
127
|
+
# Raised when a foreign key constraint cannot be added because the column type does not match the referenced column type.
|
128
|
+
class MismatchedForeignKey < StatementInvalid
|
129
|
+
def initialize(
|
130
|
+
message: nil,
|
131
|
+
sql: nil,
|
132
|
+
binds: nil,
|
133
|
+
table: nil,
|
134
|
+
foreign_key: nil,
|
135
|
+
target_table: nil,
|
136
|
+
primary_key: nil,
|
137
|
+
primary_key_column: nil
|
138
|
+
)
|
139
|
+
if table
|
140
|
+
type = primary_key_column.bigint? ? :bigint : primary_key_column.type
|
141
|
+
msg = <<~EOM.squish
|
142
|
+
Column `#{foreign_key}` on table `#{table}` does not match column `#{primary_key}` on `#{target_table}`,
|
143
|
+
which has type `#{primary_key_column.sql_type}`.
|
144
|
+
To resolve this issue, change the type of the `#{foreign_key}` column on `#{table}` to be :#{type}.
|
145
|
+
(For example `t.#{type} :#{foreign_key}`).
|
146
|
+
EOM
|
147
|
+
else
|
148
|
+
msg = <<~EOM.squish
|
149
|
+
There is a mismatch between the foreign key and primary key column types.
|
150
|
+
Verify that the foreign key column type and the primary key of the associated table match types.
|
151
|
+
EOM
|
152
|
+
end
|
153
|
+
if message
|
154
|
+
msg << "\nOriginal message: #{message}"
|
155
|
+
end
|
156
|
+
super(msg, sql: sql, binds: binds)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Raised when a record cannot be inserted or updated because it would violate a not null constraint.
|
161
|
+
class NotNullViolation < StatementInvalid
|
162
|
+
end
|
163
|
+
|
128
164
|
# Raised when a record cannot be inserted or updated because a value too long for a column type.
|
129
165
|
class ValueTooLong < StatementInvalid
|
130
166
|
end
|
131
167
|
|
168
|
+
# Raised when values that executed are out of range.
|
169
|
+
class RangeError < StatementInvalid
|
170
|
+
end
|
171
|
+
|
132
172
|
# Raised when number of bind variables in statement given to +:condition+ key
|
133
173
|
# (for example, when using {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] method)
|
134
174
|
# does not match number of expected values supplied.
|
@@ -143,7 +183,7 @@ module ActiveRecord
|
|
143
183
|
class NoDatabaseError < StatementInvalid
|
144
184
|
end
|
145
185
|
|
146
|
-
# Raised when
|
186
|
+
# Raised when PostgreSQL returns 'cached plan must not change result type' and
|
147
187
|
# we cannot retry gracefully (e.g. inside a transaction)
|
148
188
|
class PreparedStatementCacheExpired < StatementInvalid
|
149
189
|
end
|
@@ -166,7 +206,6 @@ module ActiveRecord
|
|
166
206
|
super("Stale object error.")
|
167
207
|
end
|
168
208
|
end
|
169
|
-
|
170
209
|
end
|
171
210
|
|
172
211
|
# Raised when association is being configured improperly or user tries to use
|
@@ -285,8 +324,65 @@ module ActiveRecord
|
|
285
324
|
class TransactionIsolationError < ActiveRecordError
|
286
325
|
end
|
287
326
|
|
327
|
+
# TransactionRollbackError will be raised when a transaction is rolled
|
328
|
+
# back by the database due to a serialization failure or a deadlock.
|
329
|
+
#
|
330
|
+
# See the following:
|
331
|
+
#
|
332
|
+
# * https://www.postgresql.org/docs/current/static/transaction-iso.html
|
333
|
+
# * https://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html#error_er_lock_deadlock
|
334
|
+
class TransactionRollbackError < StatementInvalid
|
335
|
+
end
|
336
|
+
|
337
|
+
# SerializationFailure will be raised when a transaction is rolled
|
338
|
+
# back by the database due to a serialization failure.
|
339
|
+
class SerializationFailure < TransactionRollbackError
|
340
|
+
end
|
341
|
+
|
342
|
+
# Deadlocked will be raised when a transaction is rolled
|
343
|
+
# back by the database when a deadlock is encountered.
|
344
|
+
class Deadlocked < TransactionRollbackError
|
345
|
+
end
|
346
|
+
|
288
347
|
# IrreversibleOrderError is raised when a relation's order is too complex for
|
289
348
|
# +reverse_order+ to automatically reverse.
|
290
349
|
class IrreversibleOrderError < ActiveRecordError
|
291
350
|
end
|
351
|
+
|
352
|
+
# LockWaitTimeout will be raised when lock wait timeout exceeded.
|
353
|
+
class LockWaitTimeout < StatementInvalid
|
354
|
+
end
|
355
|
+
|
356
|
+
# StatementTimeout will be raised when statement timeout exceeded.
|
357
|
+
class StatementTimeout < StatementInvalid
|
358
|
+
end
|
359
|
+
|
360
|
+
# QueryCanceled will be raised when canceling statement due to user request.
|
361
|
+
class QueryCanceled < StatementInvalid
|
362
|
+
end
|
363
|
+
|
364
|
+
# UnknownAttributeReference is raised when an unknown and potentially unsafe
|
365
|
+
# value is passed to a query method when allow_unsafe_raw_sql is set to
|
366
|
+
# :disabled. For example, passing a non column name value to a relation's
|
367
|
+
# #order method might cause this exception.
|
368
|
+
#
|
369
|
+
# When working around this exception, caution should be taken to avoid SQL
|
370
|
+
# injection vulnerabilities when passing user-provided values to query
|
371
|
+
# methods. Known-safe values can be passed to query methods by wrapping them
|
372
|
+
# in Arel.sql.
|
373
|
+
#
|
374
|
+
# For example, with allow_unsafe_raw_sql set to :disabled, the following
|
375
|
+
# code would raise this exception:
|
376
|
+
#
|
377
|
+
# Post.order("length(title)").first
|
378
|
+
#
|
379
|
+
# The desired result can be accomplished by wrapping the known-safe string
|
380
|
+
# in Arel.sql:
|
381
|
+
#
|
382
|
+
# Post.order(Arel.sql("length(title)")).first
|
383
|
+
#
|
384
|
+
# Again, such a workaround should *not* be used when passing user-provided
|
385
|
+
# values, such as request parameters or model attributes to query methods.
|
386
|
+
class UnknownAttributeReference < ActiveRecordError
|
387
|
+
end
|
292
388
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record/explain_registry"
|
3
4
|
|
4
5
|
module ActiveRecord
|
5
6
|
module Explain
|
@@ -17,7 +18,7 @@ module ActiveRecord
|
|
17
18
|
# Returns a formatted string ready to be logged.
|
18
19
|
def exec_explain(queries) # :nodoc:
|
19
20
|
str = queries.map do |sql, binds|
|
20
|
-
msg = "EXPLAIN for: #{sql}"
|
21
|
+
msg = +"EXPLAIN for: #{sql}"
|
21
22
|
unless binds.empty?
|
22
23
|
msg << " "
|
23
24
|
msg << binds.map { |attr| render_bind(attr) }.inspect
|
@@ -35,7 +36,6 @@ module ActiveRecord
|
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
38
|
-
|
39
39
|
def render_bind(attr)
|
40
40
|
value = if attr.type.binary? && attr.value
|
41
41
|
"<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/notifications"
|
4
|
+
require "active_record/explain_registry"
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
class ExplainSubscriber # :nodoc:
|
@@ -18,10 +20,13 @@ module ActiveRecord
|
|
18
20
|
#
|
19
21
|
# On the other hand, we want to monitor the performance of our real database
|
20
22
|
# queries, not the performance of the access to the query cache.
|
21
|
-
IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN
|
23
|
+
IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN)
|
22
24
|
EXPLAINED_SQLS = /\A\s*(with|select|update|delete|insert)\b/i
|
23
25
|
def ignore_payload?(payload)
|
24
|
-
payload[:exception] ||
|
26
|
+
payload[:exception] ||
|
27
|
+
payload[:cached] ||
|
28
|
+
IGNORED_PAYLOADS.include?(payload[:name]) ||
|
29
|
+
payload[:sql] !~ EXPLAINED_SQLS
|
25
30
|
end
|
26
31
|
|
27
32
|
ActiveSupport::Notifications.subscribe("sql.active_record", new)
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "yaml"
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
class FixtureSet
|
@@ -24,21 +26,21 @@ module ActiveRecord
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def model_class
|
27
|
-
config_row[
|
29
|
+
config_row["model_class"]
|
28
30
|
end
|
29
31
|
|
30
32
|
private
|
31
33
|
def rows
|
32
|
-
@rows ||= raw_rows.reject { |fixture_name, _| fixture_name ==
|
34
|
+
@rows ||= raw_rows.reject { |fixture_name, _| fixture_name == "_fixture" }
|
33
35
|
end
|
34
36
|
|
35
37
|
def config_row
|
36
38
|
@config_row ||= begin
|
37
|
-
row = raw_rows.find { |fixture_name, _| fixture_name ==
|
39
|
+
row = raw_rows.find { |fixture_name, _| fixture_name == "_fixture" }
|
38
40
|
if row
|
39
41
|
row.last
|
40
42
|
else
|
41
|
-
{'model_class': nil}
|
43
|
+
{ 'model_class': nil }
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
@@ -66,10 +68,13 @@ module ActiveRecord
|
|
66
68
|
# Validate our unmarshalled data.
|
67
69
|
def validate(data)
|
68
70
|
unless Hash === data || YAML::Omap === data
|
69
|
-
raise Fixture::FormatError,
|
71
|
+
raise Fixture::FormatError, "fixture is not a hash: #{@file}"
|
70
72
|
end
|
71
73
|
|
72
|
-
|
74
|
+
invalid = data.reject { |_, row| Hash === row }
|
75
|
+
if invalid.any?
|
76
|
+
raise Fixture::FormatError, "fixture key is not a hash: #{@file}, keys: #{invalid.keys.inspect}"
|
77
|
+
end
|
73
78
|
data
|
74
79
|
end
|
75
80
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class FixtureSet
|
5
|
+
class ModelMetadata # :nodoc:
|
6
|
+
def initialize(model_class)
|
7
|
+
@model_class = model_class
|
8
|
+
end
|
9
|
+
|
10
|
+
def primary_key_name
|
11
|
+
@primary_key_name ||= @model_class && @model_class.primary_key
|
12
|
+
end
|
13
|
+
|
14
|
+
def primary_key_type
|
15
|
+
@primary_key_type ||= @model_class && @model_class.type_for_attribute(@model_class.primary_key).type
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_primary_key_column?
|
19
|
+
@has_primary_key_column ||= primary_key_name &&
|
20
|
+
@model_class.columns.any? { |col| col.name == primary_key_name }
|
21
|
+
end
|
22
|
+
|
23
|
+
def timestamp_column_names
|
24
|
+
@timestamp_column_names ||=
|
25
|
+
%w(created_at created_on updated_at updated_on) & @model_class.column_names
|
26
|
+
end
|
27
|
+
|
28
|
+
def inheritance_column_name
|
29
|
+
@inheritance_column_name ||= @model_class && @model_class.inheritance_column
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# NOTE: This class has to be defined in compact style in
|
4
|
+
# order for rendering context subclassing to work correctly.
|
5
|
+
class ActiveRecord::FixtureSet::RenderContext # :nodoc:
|
6
|
+
def self.create_subclass
|
7
|
+
Class.new(ActiveRecord::FixtureSet.context_class) do
|
8
|
+
def get_binding
|
9
|
+
binding()
|
10
|
+
end
|
11
|
+
|
12
|
+
def binary(path)
|
13
|
+
%(!!binary "#{Base64.strict_encode64(File.read(path))}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class FixtureSet
|
5
|
+
class TableRow # :nodoc:
|
6
|
+
class ReflectionProxy # :nodoc:
|
7
|
+
def initialize(association)
|
8
|
+
@association = association
|
9
|
+
end
|
10
|
+
|
11
|
+
def join_table
|
12
|
+
@association.join_table
|
13
|
+
end
|
14
|
+
|
15
|
+
def name
|
16
|
+
@association.name
|
17
|
+
end
|
18
|
+
|
19
|
+
def primary_key_type
|
20
|
+
@association.klass.type_for_attribute(@association.klass.primary_key).type
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class HasManyThroughProxy < ReflectionProxy # :nodoc:
|
25
|
+
def rhs_key
|
26
|
+
@association.foreign_key
|
27
|
+
end
|
28
|
+
|
29
|
+
def lhs_key
|
30
|
+
@association.through_reflection.foreign_key
|
31
|
+
end
|
32
|
+
|
33
|
+
def join_table
|
34
|
+
@association.through_reflection.table_name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(fixture, table_rows:, label:, now:)
|
39
|
+
@table_rows = table_rows
|
40
|
+
@label = label
|
41
|
+
@now = now
|
42
|
+
@row = fixture.to_hash
|
43
|
+
fill_row_model_attributes
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_hash
|
47
|
+
@row
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def model_metadata
|
52
|
+
@table_rows.model_metadata
|
53
|
+
end
|
54
|
+
|
55
|
+
def model_class
|
56
|
+
@table_rows.model_class
|
57
|
+
end
|
58
|
+
|
59
|
+
def fill_row_model_attributes
|
60
|
+
return unless model_class
|
61
|
+
fill_timestamps
|
62
|
+
interpolate_label
|
63
|
+
generate_primary_key
|
64
|
+
resolve_enums
|
65
|
+
resolve_sti_reflections
|
66
|
+
end
|
67
|
+
|
68
|
+
def reflection_class
|
69
|
+
@reflection_class ||= if @row.include?(model_metadata.inheritance_column_name)
|
70
|
+
@row[model_metadata.inheritance_column_name].constantize rescue model_class
|
71
|
+
else
|
72
|
+
model_class
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def fill_timestamps
|
77
|
+
# fill in timestamp columns if they aren't specified and the model is set to record_timestamps
|
78
|
+
if model_class.record_timestamps
|
79
|
+
model_metadata.timestamp_column_names.each do |c_name|
|
80
|
+
@row[c_name] = @now unless @row.key?(c_name)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def interpolate_label
|
86
|
+
# interpolate the fixture label
|
87
|
+
@row.each do |key, value|
|
88
|
+
@row[key] = value.gsub("$LABEL", @label.to_s) if value.is_a?(String)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def generate_primary_key
|
93
|
+
# generate a primary key if necessary
|
94
|
+
if model_metadata.has_primary_key_column? && !@row.include?(model_metadata.primary_key_name)
|
95
|
+
@row[model_metadata.primary_key_name] = ActiveRecord::FixtureSet.identify(
|
96
|
+
@label, model_metadata.primary_key_type
|
97
|
+
)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def resolve_enums
|
102
|
+
model_class.defined_enums.each do |name, values|
|
103
|
+
if @row.include?(name)
|
104
|
+
@row[name] = values.fetch(@row[name], @row[name])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def resolve_sti_reflections
|
110
|
+
# If STI is used, find the correct subclass for association reflection
|
111
|
+
reflection_class._reflections.each_value do |association|
|
112
|
+
case association.macro
|
113
|
+
when :belongs_to
|
114
|
+
# Do not replace association name with association foreign key if they are named the same
|
115
|
+
fk_name = (association.options[:foreign_key] || "#{association.name}_id").to_s
|
116
|
+
|
117
|
+
if association.name.to_s != fk_name && value = @row.delete(association.name.to_s)
|
118
|
+
if association.polymorphic? && value.sub!(/\s*\(([^\)]*)\)\s*$/, "")
|
119
|
+
# support polymorphic belongs_to as "label (Type)"
|
120
|
+
@row[association.foreign_type] = $1
|
121
|
+
end
|
122
|
+
|
123
|
+
fk_type = reflection_class.type_for_attribute(fk_name).type
|
124
|
+
@row[fk_name] = ActiveRecord::FixtureSet.identify(value, fk_type)
|
125
|
+
end
|
126
|
+
when :has_many
|
127
|
+
if association.options[:through]
|
128
|
+
add_join_records(HasManyThroughProxy.new(association))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_join_records(association)
|
135
|
+
# This is the case when the join table has no fixtures file
|
136
|
+
if (targets = @row.delete(association.name.to_s))
|
137
|
+
table_name = association.join_table
|
138
|
+
column_type = association.primary_key_type
|
139
|
+
lhs_key = association.lhs_key
|
140
|
+
rhs_key = association.rhs_key
|
141
|
+
|
142
|
+
targets = targets.is_a?(Array) ? targets : targets.split(/\s*,\s*/)
|
143
|
+
joins = targets.map do |target|
|
144
|
+
{ lhs_key => @row[model_metadata.primary_key_name],
|
145
|
+
rhs_key => ActiveRecord::FixtureSet.identify(target, column_type) }
|
146
|
+
end
|
147
|
+
@table_rows.tables[table_name].concat(joins)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|