activerecord 5.0.7.2 → 6.0.6.1
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 +844 -1944
- 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/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/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +113 -55
- data/lib/active_record/associations/association_scope.rb +102 -96
- 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 +93 -254
- data/lib/active_record/associations/collection_proxy.rb +159 -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/join_association.rb +43 -85
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +152 -177
- data/lib/active_record/associations/preloader/association.rb +101 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/preloader.rb +94 -103
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- 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/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +58 -39
- 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 +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -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 +128 -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 +233 -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 +373 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -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 +268 -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/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 +12 -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 +52 -30
- 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/oid.rb +24 -21
- 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 +261 -267
- 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 +207 -160
- data/lib/active_record/counter_cache.rb +60 -28
- 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/database_configurations.rb +233 -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 +67 -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 +85 -86
- 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/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- 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/migration.rb +369 -302
- data/lib/active_record/model_schema.rb +160 -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 -254
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +73 -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 +82 -61
- 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/predicate_builder.rb +83 -105
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +488 -332
- 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/relation.rb +443 -318
- 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/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +51 -26
- data/lib/active_record/scoping.rb +20 -20
- 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 +243 -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/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 +12 -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.rb +23 -18
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -2
- 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/validations.rb +7 -5
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +37 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -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/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/nodes.rb +68 -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/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/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- 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/migration.rb +17 -3
- 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.rb +7 -5
- metadata +138 -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/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/attribute_set.rb +0 -110
- 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/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,21 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/deprecation"
|
4
|
+
|
1
5
|
module ActiveRecord
|
2
6
|
module ConnectionAdapters # :nodoc:
|
3
7
|
module DatabaseLimits
|
8
|
+
def max_identifier_length # :nodoc:
|
9
|
+
64
|
10
|
+
end
|
4
11
|
|
5
12
|
# Returns the maximum length of a table alias.
|
6
13
|
def table_alias_length
|
7
|
-
|
14
|
+
max_identifier_length
|
8
15
|
end
|
9
16
|
|
10
17
|
# Returns the maximum length of a column name.
|
11
18
|
def column_name_length
|
12
|
-
|
19
|
+
max_identifier_length
|
13
20
|
end
|
21
|
+
deprecate :column_name_length
|
14
22
|
|
15
23
|
# Returns the maximum length of a table name.
|
16
24
|
def table_name_length
|
17
|
-
|
25
|
+
max_identifier_length
|
18
26
|
end
|
27
|
+
deprecate :table_name_length
|
19
28
|
|
20
29
|
# Returns the maximum allowed length for an index name. This
|
21
30
|
# limit is enforced by \Rails and is less than or equal to
|
@@ -28,26 +37,29 @@ module ActiveRecord
|
|
28
37
|
|
29
38
|
# Returns the maximum length of an index name.
|
30
39
|
def index_name_length
|
31
|
-
|
40
|
+
max_identifier_length
|
32
41
|
end
|
33
42
|
|
34
43
|
# Returns the maximum number of columns per table.
|
35
44
|
def columns_per_table
|
36
45
|
1024
|
37
46
|
end
|
47
|
+
deprecate :columns_per_table
|
38
48
|
|
39
49
|
# Returns the maximum number of indexes per table.
|
40
50
|
def indexes_per_table
|
41
51
|
16
|
42
52
|
end
|
53
|
+
deprecate :indexes_per_table
|
43
54
|
|
44
55
|
# Returns the maximum number of columns in a multicolumn index.
|
45
56
|
def columns_per_multicolumn_index
|
46
57
|
16
|
47
58
|
end
|
59
|
+
deprecate :columns_per_multicolumn_index
|
48
60
|
|
49
61
|
# Returns the maximum number of elements in an IN (x,y,z) clause.
|
50
|
-
# nil means no limit.
|
62
|
+
# +nil+ means no limit.
|
51
63
|
def in_clause_length
|
52
64
|
nil
|
53
65
|
end
|
@@ -56,12 +68,18 @@ module ActiveRecord
|
|
56
68
|
def sql_query_length
|
57
69
|
1048575
|
58
70
|
end
|
71
|
+
deprecate :sql_query_length
|
59
72
|
|
60
73
|
# Returns maximum number of joins in a single query.
|
61
74
|
def joins_per_query
|
62
75
|
256
|
63
76
|
end
|
77
|
+
deprecate :joins_per_query
|
64
78
|
|
79
|
+
private
|
80
|
+
def bind_params_length
|
81
|
+
65535
|
82
|
+
end
|
65
83
|
end
|
66
84
|
end
|
67
85
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters # :nodoc:
|
3
5
|
module DatabaseStatements
|
@@ -7,34 +9,61 @@ module ActiveRecord
|
|
7
9
|
end
|
8
10
|
|
9
11
|
# Converts an arel AST to SQL
|
10
|
-
def to_sql(
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def to_sql(arel_or_sql_string, binds = [])
|
13
|
+
sql, _ = to_sql_and_binds(arel_or_sql_string, binds)
|
14
|
+
sql
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_sql_and_binds(arel_or_sql_string, binds = []) # :nodoc:
|
18
|
+
if arel_or_sql_string.respond_to?(:ast)
|
19
|
+
unless binds.empty?
|
20
|
+
raise "Passing bind parameters with an arel AST is forbidden. " \
|
21
|
+
"The values must be stored on the AST directly"
|
22
|
+
end
|
23
|
+
|
24
|
+
if prepared_statements
|
25
|
+
sql, binds = visitor.compile(arel_or_sql_string.ast, collector)
|
26
|
+
|
27
|
+
if binds.length > bind_params_length
|
28
|
+
unprepared_statement do
|
29
|
+
sql, binds = to_sql_and_binds(arel_or_sql_string)
|
30
|
+
visitor.preparable = false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
sql = visitor.compile(arel_or_sql_string.ast, collector)
|
35
|
+
end
|
36
|
+
[sql.freeze, binds]
|
14
37
|
else
|
15
|
-
|
38
|
+
visitor.preparable = false if prepared_statements
|
39
|
+
[arel_or_sql_string.dup.freeze, binds]
|
16
40
|
end
|
17
41
|
end
|
42
|
+
private :to_sql_and_binds
|
18
43
|
|
19
44
|
# This is used in the StatementCache object. It returns an object that
|
20
45
|
# can be used to query the database repeatedly.
|
21
|
-
def cacheable_query(arel) # :nodoc:
|
46
|
+
def cacheable_query(klass, arel) # :nodoc:
|
22
47
|
if prepared_statements
|
23
|
-
|
48
|
+
sql, binds = visitor.compile(arel.ast, collector)
|
49
|
+
query = klass.query(sql)
|
24
50
|
else
|
25
|
-
|
51
|
+
collector = klass.partial_query_collector
|
52
|
+
parts, binds = visitor.compile(arel.ast, collector)
|
53
|
+
query = klass.partial_query(parts)
|
26
54
|
end
|
55
|
+
[query, binds]
|
27
56
|
end
|
28
57
|
|
29
58
|
# Returns an ActiveRecord::Result instance.
|
30
59
|
def select_all(arel, name = nil, binds = [], preparable: nil)
|
31
|
-
arel
|
32
|
-
sql =
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
preparable = visitor.preparable
|
60
|
+
arel = arel_from_relation(arel)
|
61
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
62
|
+
|
63
|
+
if preparable.nil?
|
64
|
+
preparable = prepared_statements ? visitor.preparable : false
|
37
65
|
end
|
66
|
+
|
38
67
|
if prepared_statements && preparable
|
39
68
|
select_prepared(sql, name, binds)
|
40
69
|
else
|
@@ -50,23 +79,36 @@ module ActiveRecord
|
|
50
79
|
|
51
80
|
# Returns a single value from a record
|
52
81
|
def select_value(arel, name = nil, binds = [])
|
53
|
-
arel,
|
54
|
-
if result = select_rows(to_sql(arel, binds), name, binds).first
|
55
|
-
result.first
|
56
|
-
end
|
82
|
+
single_value_from_rows(select_rows(arel, name, binds))
|
57
83
|
end
|
58
84
|
|
59
85
|
# Returns an array of the values of the first column in a select:
|
60
86
|
# select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
|
61
87
|
def select_values(arel, name = nil, binds = [])
|
62
|
-
arel,
|
63
|
-
select_rows(to_sql(arel, binds), name, binds).map(&:first)
|
88
|
+
select_rows(arel, name, binds).map(&:first)
|
64
89
|
end
|
65
90
|
|
66
91
|
# Returns an array of arrays containing the field values.
|
67
92
|
# Order is the same as that returned by +columns+.
|
68
|
-
def select_rows(
|
69
|
-
|
93
|
+
def select_rows(arel, name = nil, binds = [])
|
94
|
+
select_all(arel, name, binds).rows
|
95
|
+
end
|
96
|
+
|
97
|
+
def query_value(sql, name = nil) # :nodoc:
|
98
|
+
single_value_from_rows(query(sql, name))
|
99
|
+
end
|
100
|
+
|
101
|
+
def query_values(sql, name = nil) # :nodoc:
|
102
|
+
query(sql, name).map(&:first)
|
103
|
+
end
|
104
|
+
|
105
|
+
def query(sql, name = nil) # :nodoc:
|
106
|
+
exec_query(sql, name).rows
|
107
|
+
end
|
108
|
+
|
109
|
+
# Determines whether the SQL statement is a write query.
|
110
|
+
def write_query?(sql)
|
111
|
+
raise NotImplementedError
|
70
112
|
end
|
71
113
|
|
72
114
|
# Executes the SQL statement in the context of this connection and returns
|
@@ -81,71 +123,77 @@ module ActiveRecord
|
|
81
123
|
# Executes +sql+ statement in the context of this connection using
|
82
124
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
83
125
|
# the executed +sql+ statement.
|
84
|
-
def exec_query(sql, name =
|
126
|
+
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
85
127
|
raise NotImplementedError
|
86
128
|
end
|
87
129
|
|
88
130
|
# Executes insert +sql+ statement in the context of this connection using
|
89
131
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
90
132
|
# the executed +sql+ statement.
|
91
|
-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
133
|
+
def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
|
134
|
+
sql, binds = sql_for_insert(sql, pk, binds)
|
92
135
|
exec_query(sql, name, binds)
|
93
136
|
end
|
94
137
|
|
95
138
|
# Executes delete +sql+ statement in the context of this connection using
|
96
139
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
97
140
|
# the executed +sql+ statement.
|
98
|
-
def exec_delete(sql, name, binds)
|
141
|
+
def exec_delete(sql, name = nil, binds = [])
|
99
142
|
exec_query(sql, name, binds)
|
100
143
|
end
|
101
144
|
|
102
|
-
# Executes the truncate statement.
|
103
|
-
def truncate(table_name, name = nil)
|
104
|
-
raise NotImplementedError
|
105
|
-
end
|
106
|
-
|
107
145
|
# Executes update +sql+ statement in the context of this connection using
|
108
146
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
109
147
|
# the executed +sql+ statement.
|
110
|
-
def exec_update(sql, name, binds)
|
148
|
+
def exec_update(sql, name = nil, binds = [])
|
111
149
|
exec_query(sql, name, binds)
|
112
150
|
end
|
113
151
|
|
152
|
+
def exec_insert_all(sql, name) # :nodoc:
|
153
|
+
exec_query(sql, name)
|
154
|
+
end
|
155
|
+
|
114
156
|
# Executes an INSERT query and returns the new record's ID
|
115
157
|
#
|
116
|
-
# +id_value+ will be returned unless the value is nil
|
158
|
+
# +id_value+ will be returned unless the value is +nil+, in
|
117
159
|
# which case the database will attempt to calculate the last inserted
|
118
160
|
# id and return that value.
|
119
161
|
#
|
120
162
|
# If the next id was calculated in advance (as in Oracle), it should be
|
121
163
|
# passed in as +id_value+.
|
122
164
|
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
123
|
-
sql, binds
|
165
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
124
166
|
value = exec_insert(sql, name, binds, pk, sequence_name)
|
125
167
|
id_value || last_inserted_id(value)
|
126
168
|
end
|
127
169
|
alias create insert
|
128
|
-
alias insert_sql insert
|
129
|
-
deprecate insert_sql: :insert
|
130
170
|
|
131
171
|
# Executes the update statement and returns the number of rows affected.
|
132
172
|
def update(arel, name = nil, binds = [])
|
133
|
-
|
173
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
174
|
+
exec_update(sql, name, binds)
|
134
175
|
end
|
135
|
-
alias update_sql update
|
136
|
-
deprecate update_sql: :update
|
137
176
|
|
138
177
|
# Executes the delete statement and returns the number of rows affected.
|
139
178
|
def delete(arel, name = nil, binds = [])
|
140
|
-
|
179
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
180
|
+
exec_delete(sql, name, binds)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Executes the truncate statement.
|
184
|
+
def truncate(table_name, name = nil)
|
185
|
+
execute(build_truncate_statement(table_name), name)
|
141
186
|
end
|
142
|
-
alias delete_sql delete
|
143
|
-
deprecate delete_sql: :delete
|
144
187
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
188
|
+
def truncate_tables(*table_names) # :nodoc:
|
189
|
+
return if table_names.empty?
|
190
|
+
|
191
|
+
with_multi_statements do
|
192
|
+
disable_referential_integrity do
|
193
|
+
statements = build_truncate_statements(table_names)
|
194
|
+
execute_batch(statements, "Truncate Tables")
|
195
|
+
end
|
196
|
+
end
|
149
197
|
end
|
150
198
|
|
151
199
|
# Runs the given block in a database transaction, and returns the result
|
@@ -159,7 +207,7 @@ module ActiveRecord
|
|
159
207
|
#
|
160
208
|
# In order to get around this problem, #transaction will emulate the effect
|
161
209
|
# of nested transactions, by using savepoints:
|
162
|
-
#
|
210
|
+
# https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
|
163
211
|
# Savepoints are supported by MySQL and PostgreSQL. SQLite3 version >= '3.6.8'
|
164
212
|
# supports savepoints.
|
165
213
|
#
|
@@ -211,7 +259,7 @@ module ActiveRecord
|
|
211
259
|
# You should consult the documentation for your database to understand the
|
212
260
|
# semantics of these different levels:
|
213
261
|
#
|
214
|
-
# *
|
262
|
+
# * https://www.postgresql.org/docs/current/static/transaction-iso.html
|
215
263
|
# * https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
|
216
264
|
#
|
217
265
|
# An ActiveRecord::TransactionIsolationError will be raised if:
|
@@ -237,7 +285,9 @@ module ActiveRecord
|
|
237
285
|
|
238
286
|
attr_reader :transaction_manager #:nodoc:
|
239
287
|
|
240
|
-
delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
|
288
|
+
delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
|
289
|
+
:commit_transaction, :rollback_transaction, :materialize_transactions,
|
290
|
+
:disable_lazy_transactions!, :enable_lazy_transactions!, to: :transaction_manager
|
241
291
|
|
242
292
|
def transaction_open?
|
243
293
|
current_transaction.open?
|
@@ -302,70 +352,136 @@ module ActiveRecord
|
|
302
352
|
|
303
353
|
# Inserts the given fixture into the table. Overridden in adapters that require
|
304
354
|
# something beyond a simple insert (eg. Oracle).
|
355
|
+
# Most of adapters should implement `insert_fixtures_set` that leverages bulk SQL insert.
|
356
|
+
# We keep this method to provide fallback
|
357
|
+
# for databases like sqlite that do not support bulk inserts.
|
305
358
|
def insert_fixture(fixture, table_name)
|
306
|
-
fixture
|
359
|
+
execute(build_fixture_sql(Array.wrap(fixture), table_name), "Fixture Insert")
|
360
|
+
end
|
307
361
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
value_list = prepare_binds_for_database(binds).map do |value|
|
319
|
-
begin
|
320
|
-
quote(value)
|
321
|
-
rescue TypeError
|
322
|
-
quote(YAML.dump(value))
|
362
|
+
def insert_fixtures_set(fixture_set, tables_to_delete = [])
|
363
|
+
fixture_inserts = build_fixture_statements(fixture_set)
|
364
|
+
table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
|
365
|
+
statements = table_deletes + fixture_inserts
|
366
|
+
|
367
|
+
with_multi_statements do
|
368
|
+
disable_referential_integrity do
|
369
|
+
transaction(requires_new: true) do
|
370
|
+
execute_batch(statements, "Fixtures Load")
|
371
|
+
end
|
323
372
|
end
|
324
373
|
end
|
325
|
-
|
326
|
-
execute "INSERT INTO #{quote_table_name(table_name)} (#{key_list.join(', ')}) VALUES (#{value_list.join(', ')})", 'Fixture Insert'
|
327
374
|
end
|
328
375
|
|
329
|
-
def empty_insert_statement_value
|
376
|
+
def empty_insert_statement_value(primary_key = nil)
|
330
377
|
"DEFAULT VALUES"
|
331
378
|
end
|
332
379
|
|
333
380
|
# Sanitizes the given LIMIT parameter in order to prevent SQL injection.
|
334
381
|
#
|
335
382
|
# The +limit+ may be anything that can evaluate to a string via #to_s. It
|
336
|
-
# should look like an integer, or
|
337
|
-
# an Arel SQL literal.
|
383
|
+
# should look like an integer, or an Arel SQL literal.
|
338
384
|
#
|
339
385
|
# Returns Integer and Arel::Nodes::SqlLiteral limits as is.
|
340
|
-
# Returns the sanitized limit parameter, either as an integer, or as a
|
341
|
-
# string which contains a comma-delimited list of integers.
|
342
386
|
def sanitize_limit(limit)
|
343
387
|
if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
|
344
388
|
limit
|
345
|
-
elsif limit.to_s.include?(',')
|
346
|
-
Arel.sql limit.to_s.split(',').map{ |i| Integer(i) }.join(',')
|
347
389
|
else
|
348
390
|
Integer(limit)
|
349
391
|
end
|
350
392
|
end
|
351
393
|
|
352
|
-
#
|
353
|
-
#
|
354
|
-
#
|
355
|
-
def
|
356
|
-
|
357
|
-
|
358
|
-
|
394
|
+
# Fixture value is quoted by Arel, however scalar values
|
395
|
+
# are not quotable. In this case we want to convert
|
396
|
+
# the column value to YAML.
|
397
|
+
def with_yaml_fallback(value) # :nodoc:
|
398
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
399
|
+
YAML.dump(value)
|
400
|
+
else
|
401
|
+
value
|
402
|
+
end
|
359
403
|
end
|
360
|
-
alias join_to_delete join_to_update
|
361
404
|
|
362
|
-
|
405
|
+
private
|
406
|
+
def execute_batch(statements, name = nil)
|
407
|
+
statements.each do |statement|
|
408
|
+
execute(statement, name)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
DEFAULT_INSERT_VALUE = Arel.sql("DEFAULT").freeze
|
413
|
+
private_constant :DEFAULT_INSERT_VALUE
|
414
|
+
|
415
|
+
def default_insert_value(column)
|
416
|
+
DEFAULT_INSERT_VALUE
|
417
|
+
end
|
418
|
+
|
419
|
+
def build_fixture_sql(fixtures, table_name)
|
420
|
+
columns = schema_cache.columns_hash(table_name)
|
421
|
+
|
422
|
+
values_list = fixtures.map do |fixture|
|
423
|
+
fixture = fixture.stringify_keys
|
424
|
+
|
425
|
+
unknown_columns = fixture.keys - columns.keys
|
426
|
+
if unknown_columns.any?
|
427
|
+
raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
|
428
|
+
end
|
429
|
+
|
430
|
+
columns.map do |name, column|
|
431
|
+
if fixture.key?(name)
|
432
|
+
type = lookup_cast_type_from_column(column)
|
433
|
+
with_yaml_fallback(type.serialize(fixture[name]))
|
434
|
+
else
|
435
|
+
default_insert_value(column)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
table = Arel::Table.new(table_name)
|
441
|
+
manager = Arel::InsertManager.new
|
442
|
+
manager.into(table)
|
443
|
+
|
444
|
+
if values_list.size == 1
|
445
|
+
values = values_list.shift
|
446
|
+
new_values = []
|
447
|
+
columns.each_key.with_index { |column, i|
|
448
|
+
unless values[i].equal?(DEFAULT_INSERT_VALUE)
|
449
|
+
new_values << values[i]
|
450
|
+
manager.columns << table[column]
|
451
|
+
end
|
452
|
+
}
|
453
|
+
values_list << new_values
|
454
|
+
else
|
455
|
+
columns.each_key { |column| manager.columns << table[column] }
|
456
|
+
end
|
363
457
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
458
|
+
manager.values = manager.create_values_list(values_list)
|
459
|
+
visitor.compile(manager.ast)
|
460
|
+
end
|
461
|
+
|
462
|
+
def build_fixture_statements(fixture_set)
|
463
|
+
fixture_set.map do |table_name, fixtures|
|
464
|
+
next if fixtures.empty?
|
465
|
+
build_fixture_sql(fixtures, table_name)
|
466
|
+
end.compact
|
467
|
+
end
|
468
|
+
|
469
|
+
def build_truncate_statement(table_name)
|
470
|
+
"TRUNCATE TABLE #{quote_table_name(table_name)}"
|
471
|
+
end
|
472
|
+
|
473
|
+
def build_truncate_statements(table_names)
|
474
|
+
table_names.map do |table_name|
|
475
|
+
build_truncate_statement(table_name)
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
def with_multi_statements
|
480
|
+
yield
|
481
|
+
end
|
482
|
+
|
483
|
+
def combine_multi_statements(total_sql)
|
484
|
+
total_sql.join(";\n")
|
369
485
|
end
|
370
486
|
|
371
487
|
# Returns an ActiveRecord::Result instance.
|
@@ -377,20 +493,25 @@ module ActiveRecord
|
|
377
493
|
exec_query(sql, name, binds, prepare: true)
|
378
494
|
end
|
379
495
|
|
380
|
-
def sql_for_insert(sql, pk,
|
381
|
-
[sql, binds
|
496
|
+
def sql_for_insert(sql, pk, binds)
|
497
|
+
[sql, binds]
|
382
498
|
end
|
383
499
|
|
384
500
|
def last_inserted_id(result)
|
385
|
-
|
501
|
+
single_value_from_rows(result.rows)
|
502
|
+
end
|
503
|
+
|
504
|
+
def single_value_from_rows(rows)
|
505
|
+
row = rows.first
|
386
506
|
row && row.first
|
387
507
|
end
|
388
508
|
|
389
|
-
def
|
390
|
-
if relation.is_a?(Relation)
|
391
|
-
relation
|
509
|
+
def arel_from_relation(relation)
|
510
|
+
if relation.is_a?(Relation)
|
511
|
+
relation.arel
|
512
|
+
else
|
513
|
+
relation
|
392
514
|
end
|
393
|
-
[relation, binds]
|
394
515
|
end
|
395
516
|
end
|
396
517
|
end
|