activerecord 5.2.8 → 7.0.2
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 +1393 -587
- data/MIT-LICENSE +3 -1
- data/README.rdoc +7 -5
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +10 -9
- data/lib/active_record/association_relation.rb +22 -12
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +122 -47
- data/lib/active_record/associations/association_scope.rb +24 -24
- data/lib/active_record/associations/belongs_to_association.rb +67 -49
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +16 -7
- data/lib/active_record/associations/builder/association.rb +52 -23
- data/lib/active_record/associations/builder/belongs_to.rb +44 -61
- data/lib/active_record/associations/builder/collection_association.rb +17 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
- data/lib/active_record/associations/builder/has_many.rb +10 -3
- data/lib/active_record/associations/builder/has_one.rb +35 -3
- data/lib/active_record/associations/builder/singular_association.rb +5 -3
- data/lib/active_record/associations/collection_association.rb +59 -50
- data/lib/active_record/associations/collection_proxy.rb +32 -23
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +27 -14
- data/lib/active_record/associations/has_many_through_association.rb +26 -19
- data/lib/active_record/associations/has_one_association.rb +52 -37
- data/lib/active_record/associations/has_one_through_association.rb +6 -6
- data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
- data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +97 -62
- data/lib/active_record/associations/preloader/association.rb +220 -60
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +147 -0
- data/lib/active_record/associations/preloader/through_association.rb +85 -40
- data/lib/active_record/associations/preloader.rb +44 -105
- data/lib/active_record/associations/singular_association.rb +9 -17
- data/lib/active_record/associations/through_association.rb +4 -4
- data/lib/active_record/associations.rb +207 -66
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +17 -19
- data/lib/active_record/attribute_methods/before_type_cast.rb +19 -8
- data/lib/active_record/attribute_methods/dirty.rb +141 -47
- data/lib/active_record/attribute_methods/primary_key.rb +22 -27
- data/lib/active_record/attribute_methods/query.rb +6 -10
- data/lib/active_record/attribute_methods/read.rb +15 -55
- data/lib/active_record/attribute_methods/serialization.rb +77 -18
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +16 -18
- data/lib/active_record/attribute_methods/write.rb +18 -37
- data/lib/active_record/attribute_methods.rb +90 -153
- data/lib/active_record/attributes.rb +38 -12
- data/lib/active_record/autosave_association.rb +50 -50
- data/lib/active_record/base.rb +23 -18
- data/lib/active_record/callbacks.rb +159 -44
- data/lib/active_record/coders/yaml_column.rb +12 -3
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +292 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +209 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +76 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +92 -464
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -51
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +209 -164
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +38 -22
- data/lib/active_record/connection_adapters/abstract/quoting.rb +103 -82
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +140 -110
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -94
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +16 -5
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +456 -159
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +367 -162
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +311 -327
- data/lib/active_record/connection_adapters/column.rb +33 -11
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +113 -45
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +71 -5
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +25 -8
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +143 -19
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +63 -22
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +53 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +56 -63
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +54 -16
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +26 -12
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -52
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +34 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +39 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +128 -91
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +25 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +149 -113
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +386 -182
- data/lib/active_record/connection_adapters/schema_cache.rb +161 -22
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +65 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +92 -26
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +251 -204
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_adapters.rb +53 -0
- data/lib/active_record/connection_handling.rb +292 -38
- data/lib/active_record/core.rb +385 -158
- data/lib/active_record/counter_cache.rb +8 -30
- data/lib/active_record/database_configurations/connection_url_resolver.rb +100 -0
- data/lib/active_record/database_configurations/database_config.rb +83 -0
- data/lib/active_record/database_configurations/hash_config.rb +154 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +256 -0
- data/lib/active_record/delegated_type.rb +250 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +4 -5
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +98 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +44 -0
- data/lib/active_record/encryption/configurable.rb +61 -0
- data/lib/active_record/encryption/context.rb +35 -0
- data/lib/active_record/encryption/contexts.rb +72 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +12 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +208 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +140 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +155 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +160 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +42 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_serializer.rb +90 -0
- data/lib/active_record/encryption/null_encryptor.rb +21 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
- data/lib/active_record/encryption/scheme.rb +99 -0
- data/lib/active_record/encryption.rb +55 -0
- data/lib/active_record/enum.rb +130 -51
- data/lib/active_record/errors.rb +129 -23
- data/lib/active_record/explain.rb +10 -6
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +22 -15
- data/lib/active_record/fixture_set/model_metadata.rb +32 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +187 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +206 -490
- data/lib/active_record/future_result.rb +139 -0
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +104 -37
- data/lib/active_record/insert_all.rb +278 -0
- data/lib/active_record/integration.rb +69 -18
- data/lib/active_record/internal_metadata.rb +24 -9
- data/lib/active_record/legacy_yaml_adapter.rb +3 -36
- data/lib/active_record/locking/optimistic.rb +41 -26
- data/lib/active_record/locking/pessimistic.rb +18 -8
- data/lib/active_record/log_subscriber.rb +46 -35
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector.rb +82 -0
- data/lib/active_record/middleware/shard_selector.rb +60 -0
- data/lib/active_record/migration/command_recorder.rb +96 -44
- data/lib/active_record/migration/compatibility.rb +246 -64
- data/lib/active_record/migration/join_table.rb +1 -2
- data/lib/active_record/migration.rb +266 -187
- data/lib/active_record/model_schema.rb +165 -52
- data/lib/active_record/nested_attributes.rb +17 -19
- data/lib/active_record/no_touching.rb +11 -4
- data/lib/active_record/null_relation.rb +2 -7
- data/lib/active_record/persistence.rb +467 -92
- data/lib/active_record/query_cache.rb +21 -4
- data/lib/active_record/query_logs.rb +138 -0
- data/lib/active_record/querying.rb +51 -24
- data/lib/active_record/railtie.rb +224 -57
- data/lib/active_record/railties/console_sandbox.rb +2 -4
- data/lib/active_record/railties/controller_runtime.rb +31 -36
- data/lib/active_record/railties/databases.rake +369 -101
- data/lib/active_record/readonly_attributes.rb +15 -0
- data/lib/active_record/reflection.rb +170 -137
- data/lib/active_record/relation/batches/batch_enumerator.rb +44 -14
- data/lib/active_record/relation/batches.rb +46 -37
- data/lib/active_record/relation/calculations.rb +168 -96
- data/lib/active_record/relation/delegation.rb +37 -52
- data/lib/active_record/relation/finder_methods.rb +79 -58
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +50 -51
- data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +58 -46
- data/lib/active_record/relation/query_attribute.rb +9 -10
- data/lib/active_record/relation/query_methods.rb +685 -208
- data/lib/active_record/relation/record_fetch_warning.rb +9 -11
- data/lib/active_record/relation/spawn_methods.rb +10 -10
- data/lib/active_record/relation/where_clause.rb +108 -64
- data/lib/active_record/relation.rb +515 -151
- data/lib/active_record/result.rb +78 -42
- data/lib/active_record/runtime_registry.rb +9 -13
- data/lib/active_record/sanitization.rb +29 -44
- data/lib/active_record/schema.rb +37 -31
- data/lib/active_record/schema_dumper.rb +74 -23
- data/lib/active_record/schema_migration.rb +7 -9
- data/lib/active_record/scoping/default.rb +62 -17
- data/lib/active_record/scoping/named.rb +17 -32
- data/lib/active_record/scoping.rb +70 -41
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +6 -4
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +49 -6
- data/lib/active_record/store.rb +88 -9
- data/lib/active_record/suppressor.rb +13 -17
- data/lib/active_record/table_metadata.rb +42 -43
- data/lib/active_record/tasks/database_tasks.rb +352 -94
- data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
- data/lib/active_record/tasks/postgresql_database_tasks.rb +41 -39
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +287 -0
- data/lib/active_record/timestamp.rb +44 -34
- data/lib/active_record/touch_later.rb +23 -22
- data/lib/active_record/transactions.rb +67 -128
- data/lib/active_record/translation.rb +3 -3
- data/lib/active_record/type/adapter_specific_registry.rb +34 -19
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
- data/lib/active_record/type/internal/timezone.rb +2 -2
- data/lib/active_record/type/serialized.rb +7 -4
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type/type_map.rb +17 -21
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +9 -5
- data/lib/active_record/type_caster/connection.rb +15 -15
- data/lib/active_record/type_caster/map.rb +8 -8
- data/lib/active_record/validations/associated.rb +2 -3
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +39 -31
- data/lib/active_record/validations.rb +4 -3
- data/lib/active_record.rb +209 -32
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +33 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +48 -0
- data/lib/arel/delete_manager.rb +32 -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/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +48 -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 +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +44 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +45 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +76 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -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 +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -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 +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -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 +46 -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 +71 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +258 -0
- data/lib/arel/select_manager.rb +276 -0
- data/lib/arel/table.rb +117 -0
- data/lib/arel/tree_manager.rb +60 -0
- data/lib/arel/update_manager.rb +48 -0
- data/lib/arel/visitors/dot.rb +298 -0
- data/lib/arel/visitors/mysql.rb +99 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +955 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +55 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
- data/lib/rails/generators/active_record/migration.rb +19 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +162 -32
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
- data/lib/active_record/relation/where_clause_factory.rb +0 -34
@@ -6,8 +6,9 @@ module ActiveRecord
|
|
6
6
|
module ConnectionAdapters # :nodoc:
|
7
7
|
module QueryCache
|
8
8
|
class << self
|
9
|
-
def included(base)
|
10
|
-
dirties_query_cache base, :insert, :update, :delete, :
|
9
|
+
def included(base) # :nodoc:
|
10
|
+
dirties_query_cache base, :create, :insert, :update, :delete, :truncate, :truncate_tables,
|
11
|
+
:rollback_to_savepoint, :rollback_db_transaction, :exec_insert_all
|
11
12
|
|
12
13
|
base.set_callback :checkout, :after, :configure_query_cache!
|
13
14
|
base.set_callback :checkin, :after, :disable_query_cache!
|
@@ -17,7 +18,7 @@ module ActiveRecord
|
|
17
18
|
method_names.each do |method_name|
|
18
19
|
base.class_eval <<-end_code, __FILE__, __LINE__ + 1
|
19
20
|
def #{method_name}(*)
|
20
|
-
|
21
|
+
ActiveRecord::Base.clear_query_caches_for_current_thread
|
21
22
|
super
|
22
23
|
end
|
23
24
|
end_code
|
@@ -92,22 +93,36 @@ module ActiveRecord
|
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
95
|
-
def select_all(arel, name = nil, binds = [], preparable: nil)
|
96
|
-
|
97
|
-
arel = arel_from_relation(arel)
|
98
|
-
sql, binds = to_sql_and_binds(arel, binds)
|
96
|
+
def select_all(arel, name = nil, binds = [], preparable: nil, async: false)
|
97
|
+
arel = arel_from_relation(arel)
|
99
98
|
|
100
|
-
|
101
|
-
|
102
|
-
|
99
|
+
# If arel is locked this is a SELECT ... FOR UPDATE or somesuch.
|
100
|
+
# Such queries should not be cached.
|
101
|
+
if @query_cache_enabled && !(arel.respond_to?(:locked) && arel.locked)
|
102
|
+
sql, binds, preparable = to_sql_and_binds(arel, binds, preparable)
|
103
103
|
|
104
|
-
|
104
|
+
if async
|
105
|
+
lookup_sql_cache(sql, name, binds) || super(sql, name, binds, preparable: preparable, async: async)
|
106
|
+
else
|
107
|
+
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable, async: async) }
|
108
|
+
end
|
105
109
|
else
|
106
110
|
super
|
107
111
|
end
|
108
112
|
end
|
109
113
|
|
110
114
|
private
|
115
|
+
def lookup_sql_cache(sql, name, binds)
|
116
|
+
@lock.synchronize do
|
117
|
+
if @query_cache[sql].key?(binds)
|
118
|
+
ActiveSupport::Notifications.instrument(
|
119
|
+
"sql.active_record",
|
120
|
+
cache_notification_info(sql, name, binds)
|
121
|
+
)
|
122
|
+
@query_cache[sql][binds]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
111
126
|
|
112
127
|
def cache_sql(sql, name, binds)
|
113
128
|
@lock.synchronize do
|
@@ -115,12 +130,7 @@ module ActiveRecord
|
|
115
130
|
if @query_cache[sql].key?(binds)
|
116
131
|
ActiveSupport::Notifications.instrument(
|
117
132
|
"sql.active_record",
|
118
|
-
sql
|
119
|
-
binds: binds,
|
120
|
-
type_casted_binds: -> { type_casted_binds(binds) },
|
121
|
-
name: name,
|
122
|
-
connection_id: object_id,
|
123
|
-
cached: true,
|
133
|
+
cache_notification_info(sql, name, binds)
|
124
134
|
)
|
125
135
|
@query_cache[sql][binds]
|
126
136
|
else
|
@@ -130,11 +140,17 @@ module ActiveRecord
|
|
130
140
|
end
|
131
141
|
end
|
132
142
|
|
133
|
-
#
|
134
|
-
#
|
135
|
-
def
|
136
|
-
|
137
|
-
|
143
|
+
# Database adapters can override this method to
|
144
|
+
# provide custom cache information.
|
145
|
+
def cache_notification_info(sql, name, binds)
|
146
|
+
{
|
147
|
+
sql: sql,
|
148
|
+
binds: binds,
|
149
|
+
type_casted_binds: -> { type_casted_binds(binds) },
|
150
|
+
name: name,
|
151
|
+
connection: self,
|
152
|
+
cached: true
|
153
|
+
}
|
138
154
|
end
|
139
155
|
|
140
156
|
def configure_query_cache!
|
@@ -9,29 +9,46 @@ module ActiveRecord
|
|
9
9
|
# Quotes the column value to help prevent
|
10
10
|
# {SQL injection attacks}[https://en.wikipedia.org/wiki/SQL_injection].
|
11
11
|
def quote(value)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
case value
|
13
|
+
when String, Symbol, ActiveSupport::Multibyte::Chars
|
14
|
+
"'#{quote_string(value.to_s)}'"
|
15
|
+
when true then quoted_true
|
16
|
+
when false then quoted_false
|
17
|
+
when nil then "NULL"
|
18
|
+
# BigDecimals need to be put in a non-normalized form and quoted.
|
19
|
+
when BigDecimal then value.to_s("F")
|
20
|
+
when Numeric, ActiveSupport::Duration then value.to_s
|
21
|
+
when Type::Binary::Data then quoted_binary(value)
|
22
|
+
when Type::Time::Value then "'#{quoted_time(value)}'"
|
23
|
+
when Date, Time then "'#{quoted_date(value)}'"
|
24
|
+
when Class then "'#{value}'"
|
25
|
+
else raise TypeError, "can't quote #{value.class.name}"
|
16
26
|
end
|
17
|
-
|
18
|
-
_quote(value)
|
19
27
|
end
|
20
28
|
|
21
29
|
# Cast a +value+ to a type that the database understands. For example,
|
22
30
|
# SQLite does not understand dates, so this method will convert a Date
|
23
31
|
# to a String.
|
24
|
-
def type_cast(value
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
def type_cast(value)
|
33
|
+
case value
|
34
|
+
when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
|
35
|
+
value.to_s
|
36
|
+
when true then unquoted_true
|
37
|
+
when false then unquoted_false
|
38
|
+
# BigDecimals need to be put in a non-normalized form and quoted.
|
39
|
+
when BigDecimal then value.to_s("F")
|
40
|
+
when nil, Numeric, String then value
|
41
|
+
when Type::Time::Value then quoted_time(value)
|
42
|
+
when Date, Time then quoted_date(value)
|
43
|
+
else raise TypeError, "can't cast #{value.class.name}"
|
29
44
|
end
|
45
|
+
end
|
30
46
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
47
|
+
# Quote a value to be used as a bound parameter of unknown type. For example,
|
48
|
+
# MySQL might perform dangerous castings when comparing a string to a number,
|
49
|
+
# so this method will cast numbers to string.
|
50
|
+
def quote_bound_value(value)
|
51
|
+
quote(value)
|
35
52
|
end
|
36
53
|
|
37
54
|
# If you are having to call this function, you are likely doing something
|
@@ -43,16 +60,6 @@ module ActiveRecord
|
|
43
60
|
# represent the type doesn't sufficiently reflect the differences
|
44
61
|
# (varchar vs binary) for example. The type used to get this primitive
|
45
62
|
# should have been provided before reaching the connection adapter.
|
46
|
-
def type_cast_from_column(column, value) # :nodoc:
|
47
|
-
if column
|
48
|
-
type = lookup_cast_type_from_column(column)
|
49
|
-
type.serialize(value)
|
50
|
-
else
|
51
|
-
value
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# See docs for #type_cast_from_column
|
56
63
|
def lookup_cast_type_from_column(column) # :nodoc:
|
57
64
|
lookup_cast_type(column.sql_type)
|
58
65
|
end
|
@@ -60,7 +67,7 @@ module ActiveRecord
|
|
60
67
|
# Quotes a string, escaping any ' (single quote) and \ (backslash)
|
61
68
|
# characters.
|
62
69
|
def quote_string(s)
|
63
|
-
s.gsub(
|
70
|
+
s.gsub("\\", '\&\&').gsub("'", "''") # ' (for ruby-mode)
|
64
71
|
end
|
65
72
|
|
66
73
|
# Quotes the column name. Defaults to no quoting.
|
@@ -95,7 +102,7 @@ module ActiveRecord
|
|
95
102
|
end
|
96
103
|
|
97
104
|
def quoted_true
|
98
|
-
"TRUE"
|
105
|
+
"TRUE"
|
99
106
|
end
|
100
107
|
|
101
108
|
def unquoted_true
|
@@ -103,7 +110,7 @@ module ActiveRecord
|
|
103
110
|
end
|
104
111
|
|
105
112
|
def quoted_false
|
106
|
-
"FALSE"
|
113
|
+
"FALSE"
|
107
114
|
end
|
108
115
|
|
109
116
|
def unquoted_false
|
@@ -114,16 +121,16 @@ module ActiveRecord
|
|
114
121
|
# if the value is a Time responding to usec.
|
115
122
|
def quoted_date(value)
|
116
123
|
if value.acts_like?(:time)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
value = value.
|
124
|
+
if ActiveRecord.default_timezone == :utc
|
125
|
+
value = value.getutc if !value.utc?
|
126
|
+
else
|
127
|
+
value = value.getlocal
|
121
128
|
end
|
122
129
|
end
|
123
130
|
|
124
|
-
result = value.
|
131
|
+
result = value.to_fs(:db)
|
125
132
|
if value.respond_to?(:usec) && value.usec > 0
|
126
|
-
"
|
133
|
+
result << "." << sprintf("%06d", value.usec)
|
127
134
|
else
|
128
135
|
result
|
129
136
|
end
|
@@ -138,62 +145,76 @@ module ActiveRecord
|
|
138
145
|
"'#{quote_string(value.to_s)}'"
|
139
146
|
end
|
140
147
|
|
141
|
-
def
|
142
|
-
|
143
|
-
binds.map { |column, value| type_cast(value, column) }
|
144
|
-
else
|
145
|
-
binds.map { |attr| type_cast(attr.value_for_database) }
|
146
|
-
end
|
148
|
+
def sanitize_as_sql_comment(value) # :nodoc:
|
149
|
+
value.to_s.gsub(%r{ (/ (?: | \g<1>) \*) \+? \s* | \s* (\* (?: | \g<2>) /) }x, "")
|
147
150
|
end
|
148
151
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
end
|
152
|
+
def column_name_matcher # :nodoc:
|
153
|
+
COLUMN_NAME
|
154
|
+
end
|
153
155
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
end
|
158
|
-
end
|
156
|
+
def column_name_with_order_matcher # :nodoc:
|
157
|
+
COLUMN_NAME_WITH_ORDER
|
158
|
+
end
|
159
159
|
|
160
|
-
|
161
|
-
|
162
|
-
|
160
|
+
# Regexp for column names (with or without a table name prefix).
|
161
|
+
# Matches the following:
|
162
|
+
#
|
163
|
+
# "#{table_name}.#{column_name}"
|
164
|
+
# "#{column_name}"
|
165
|
+
COLUMN_NAME = /
|
166
|
+
\A
|
167
|
+
(
|
168
|
+
(?:
|
169
|
+
# table_name.column_name | function(one or no argument)
|
170
|
+
((?:\w+\.)?\w+) | \w+\((?:|\g<2>)\)
|
171
|
+
)
|
172
|
+
(?:(?:\s+AS)?\s+\w+)?
|
173
|
+
)
|
174
|
+
(?:\s*,\s*\g<1>)*
|
175
|
+
\z
|
176
|
+
/ix
|
177
|
+
|
178
|
+
# Regexp for column names with order (with or without a table name prefix,
|
179
|
+
# with or without various order modifiers). Matches the following:
|
180
|
+
#
|
181
|
+
# "#{table_name}.#{column_name}"
|
182
|
+
# "#{table_name}.#{column_name} #{direction}"
|
183
|
+
# "#{table_name}.#{column_name} #{direction} NULLS FIRST"
|
184
|
+
# "#{table_name}.#{column_name} NULLS LAST"
|
185
|
+
# "#{column_name}"
|
186
|
+
# "#{column_name} #{direction}"
|
187
|
+
# "#{column_name} #{direction} NULLS FIRST"
|
188
|
+
# "#{column_name} NULLS LAST"
|
189
|
+
COLUMN_NAME_WITH_ORDER = /
|
190
|
+
\A
|
191
|
+
(
|
192
|
+
(?:
|
193
|
+
# table_name.column_name | function(one or no argument)
|
194
|
+
((?:\w+\.)?\w+) | \w+\((?:|\g<2>)\)
|
195
|
+
)
|
196
|
+
(?:\s+ASC|\s+DESC)?
|
197
|
+
(?:\s+NULLS\s+(?:FIRST|LAST))?
|
198
|
+
)
|
199
|
+
(?:\s*,\s*\g<1>)*
|
200
|
+
\z
|
201
|
+
/ix
|
202
|
+
|
203
|
+
private_constant :COLUMN_NAME, :COLUMN_NAME_WITH_ORDER
|
163
204
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
when BigDecimal then value.to_s("F")
|
173
|
-
when Numeric, ActiveSupport::Duration then value.to_s
|
174
|
-
when Type::Binary::Data then quoted_binary(value)
|
175
|
-
when Type::Time::Value then "'#{quoted_time(value)}'"
|
176
|
-
when Date, Time then "'#{quoted_date(value)}'"
|
177
|
-
when Symbol then "'#{quote_string(value.to_s)}'"
|
178
|
-
when Class then "'#{value}'"
|
179
|
-
else raise TypeError, "can't quote #{value.class.name}"
|
205
|
+
private
|
206
|
+
def type_casted_binds(binds)
|
207
|
+
binds.map do |value|
|
208
|
+
if ActiveModel::Attribute === value
|
209
|
+
type_cast(value.value_for_database)
|
210
|
+
else
|
211
|
+
type_cast(value)
|
212
|
+
end
|
180
213
|
end
|
181
214
|
end
|
182
215
|
|
183
|
-
def
|
184
|
-
|
185
|
-
when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
|
186
|
-
value.to_s
|
187
|
-
when true then unquoted_true
|
188
|
-
when false then unquoted_false
|
189
|
-
# BigDecimals need to be put in a non-normalized form and quoted.
|
190
|
-
when BigDecimal then value.to_s("F")
|
191
|
-
when Type::Time::Value then quoted_time(value)
|
192
|
-
when Date, Time then quoted_date(value)
|
193
|
-
when *types_which_need_no_typecasting
|
194
|
-
value
|
195
|
-
else raise TypeError
|
196
|
-
end
|
216
|
+
def lookup_cast_type(sql_type)
|
217
|
+
type_map.lookup(sql_type)
|
197
218
|
end
|
198
219
|
end
|
199
220
|
end
|
@@ -8,15 +8,15 @@ module ActiveRecord
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def create_savepoint(name = current_savepoint_name)
|
11
|
-
execute("SAVEPOINT #{name}")
|
11
|
+
execute("SAVEPOINT #{name}", "TRANSACTION")
|
12
12
|
end
|
13
13
|
|
14
14
|
def exec_rollback_to_savepoint(name = current_savepoint_name)
|
15
|
-
execute("ROLLBACK TO SAVEPOINT #{name}")
|
15
|
+
execute("ROLLBACK TO SAVEPOINT #{name}", "TRANSACTION")
|
16
16
|
end
|
17
17
|
|
18
18
|
def release_savepoint(name = current_savepoint_name)
|
19
|
-
execute("RELEASE SAVEPOINT #{name}")
|
19
|
+
execute("RELEASE SAVEPOINT #{name}", "TRANSACTION")
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -1,146 +1,176 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/string/strip"
|
4
|
-
|
5
3
|
module ActiveRecord
|
6
4
|
module ConnectionAdapters
|
7
|
-
class
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
class SchemaCreation # :nodoc:
|
6
|
+
def initialize(conn)
|
7
|
+
@conn = conn
|
8
|
+
@cache = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def accept(o)
|
12
|
+
m = @cache[o.class] ||= "visit_#{o.class.name.split('::').last}"
|
13
|
+
send m, o
|
14
|
+
end
|
15
|
+
|
16
|
+
delegate :quote_column_name, :quote_table_name, :quote_default_expression, :type_to_sql,
|
17
|
+
:options_include_default?, :supports_indexes_in_create?, :supports_foreign_keys?,
|
18
|
+
:quoted_columns_for_index, :supports_partial_index?, :supports_check_constraints?,
|
19
|
+
to: :@conn, private: true
|
20
|
+
|
21
|
+
private
|
22
|
+
def visit_AlterTable(o)
|
23
|
+
sql = +"ALTER TABLE #{quote_table_name(o.name)} "
|
24
|
+
sql << o.adds.map { |col| accept col }.join(" ")
|
25
|
+
sql << o.foreign_key_adds.map { |fk| visit_AddForeignKey fk }.join(" ")
|
26
|
+
sql << o.foreign_key_drops.map { |fk| visit_DropForeignKey fk }.join(" ")
|
27
|
+
sql << o.check_constraint_adds.map { |con| visit_AddCheckConstraint con }.join(" ")
|
28
|
+
sql << o.check_constraint_drops.map { |con| visit_DropCheckConstraint con }.join(" ")
|
12
29
|
end
|
13
30
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
31
|
+
def visit_ColumnDefinition(o)
|
32
|
+
o.sql_type = type_to_sql(o.type, **o.options)
|
33
|
+
column_sql = +"#{quote_column_name(o.name)} #{o.sql_type}"
|
34
|
+
add_column_options!(column_sql, column_options(o)) unless o.type == :primary_key
|
35
|
+
column_sql
|
17
36
|
end
|
18
37
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
38
|
+
def visit_AddColumnDefinition(o)
|
39
|
+
+"ADD #{accept(o.column)}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def visit_TableDefinition(o)
|
43
|
+
create_sql = +"CREATE#{table_modifier_in_create(o)} TABLE "
|
44
|
+
create_sql << "IF NOT EXISTS " if o.if_not_exists
|
45
|
+
create_sql << "#{quote_table_name(o.name)} "
|
23
46
|
|
24
|
-
|
47
|
+
statements = o.columns.map { |c| accept c }
|
48
|
+
statements << accept(o.primary_keys) if o.primary_keys
|
25
49
|
|
26
|
-
|
27
|
-
|
28
|
-
sql << o.adds.map { |col| accept col }.join(" ")
|
29
|
-
sql << o.foreign_key_adds.map { |fk| visit_AddForeignKey fk }.join(" ")
|
30
|
-
sql << o.foreign_key_drops.map { |fk| visit_DropForeignKey fk }.join(" ")
|
50
|
+
if supports_indexes_in_create?
|
51
|
+
statements.concat(o.indexes.map { |column_name, options| index_in_create(o.name, column_name, options) })
|
31
52
|
end
|
32
53
|
|
33
|
-
|
34
|
-
|
35
|
-
column_sql = "#{quote_column_name(o.name)} #{o.sql_type}".dup
|
36
|
-
add_column_options!(column_sql, column_options(o)) unless o.type == :primary_key
|
37
|
-
column_sql
|
54
|
+
if supports_foreign_keys?
|
55
|
+
statements.concat(o.foreign_keys.map { |fk| accept fk })
|
38
56
|
end
|
39
57
|
|
40
|
-
|
41
|
-
|
58
|
+
if supports_check_constraints?
|
59
|
+
statements.concat(o.check_constraints.map { |chk| accept chk })
|
42
60
|
end
|
43
61
|
|
44
|
-
|
45
|
-
|
62
|
+
create_sql << "(#{statements.join(', ')})" if statements.present?
|
63
|
+
add_table_options!(create_sql, o)
|
64
|
+
create_sql << " AS #{to_sql(o.as)}" if o.as
|
65
|
+
create_sql
|
66
|
+
end
|
46
67
|
|
47
|
-
|
48
|
-
|
68
|
+
def visit_PrimaryKeyDefinition(o)
|
69
|
+
"PRIMARY KEY (#{o.name.map { |name| quote_column_name(name) }.join(', ')})"
|
70
|
+
end
|
49
71
|
|
50
|
-
|
51
|
-
|
52
|
-
|
72
|
+
def visit_ForeignKeyDefinition(o)
|
73
|
+
sql = +<<~SQL
|
74
|
+
CONSTRAINT #{quote_column_name(o.name)}
|
75
|
+
FOREIGN KEY (#{quote_column_name(o.column)})
|
76
|
+
REFERENCES #{quote_table_name(o.to_table)} (#{quote_column_name(o.primary_key)})
|
77
|
+
SQL
|
78
|
+
sql << " #{action_sql('DELETE', o.on_delete)}" if o.on_delete
|
79
|
+
sql << " #{action_sql('UPDATE', o.on_update)}" if o.on_update
|
80
|
+
sql
|
81
|
+
end
|
53
82
|
|
54
|
-
|
55
|
-
|
56
|
-
|
83
|
+
def visit_AddForeignKey(o)
|
84
|
+
"ADD #{accept(o)}"
|
85
|
+
end
|
57
86
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
create_sql
|
62
|
-
end
|
87
|
+
def visit_DropForeignKey(name)
|
88
|
+
"DROP CONSTRAINT #{quote_column_name(name)}"
|
89
|
+
end
|
63
90
|
|
64
|
-
|
65
|
-
|
66
|
-
|
91
|
+
def visit_CreateIndexDefinition(o)
|
92
|
+
index = o.index
|
93
|
+
|
94
|
+
sql = ["CREATE"]
|
95
|
+
sql << "UNIQUE" if index.unique
|
96
|
+
sql << "INDEX"
|
97
|
+
sql << o.algorithm if o.algorithm
|
98
|
+
sql << "IF NOT EXISTS" if o.if_not_exists
|
99
|
+
sql << index.type if index.type
|
100
|
+
sql << "#{quote_column_name(index.name)} ON #{quote_table_name(index.table)}"
|
101
|
+
sql << "USING #{index.using}" if supports_index_using? && index.using
|
102
|
+
sql << "(#{quoted_columns(index)})"
|
103
|
+
sql << "WHERE #{index.where}" if supports_partial_index? && index.where
|
104
|
+
|
105
|
+
sql.join(" ")
|
106
|
+
end
|
67
107
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
FOREIGN KEY (#{quote_column_name(o.column)})
|
72
|
-
REFERENCES #{quote_table_name(o.to_table)} (#{quote_column_name(o.primary_key)})
|
73
|
-
SQL
|
74
|
-
sql << " #{action_sql('DELETE', o.on_delete)}" if o.on_delete
|
75
|
-
sql << " #{action_sql('UPDATE', o.on_update)}" if o.on_update
|
76
|
-
sql
|
77
|
-
end
|
108
|
+
def visit_CheckConstraintDefinition(o)
|
109
|
+
"CONSTRAINT #{o.name} CHECK (#{o.expression})"
|
110
|
+
end
|
78
111
|
|
79
|
-
|
80
|
-
|
81
|
-
|
112
|
+
def visit_AddCheckConstraint(o)
|
113
|
+
"ADD #{accept(o)}"
|
114
|
+
end
|
82
115
|
|
83
|
-
|
84
|
-
|
85
|
-
|
116
|
+
def visit_DropCheckConstraint(name)
|
117
|
+
"DROP CONSTRAINT #{quote_column_name(name)}"
|
118
|
+
end
|
86
119
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
table_options[:options] = o.options
|
91
|
-
table_options
|
92
|
-
end
|
120
|
+
def quoted_columns(o)
|
121
|
+
String === o.columns ? o.columns : quoted_columns_for_index(o.columns, o.column_options)
|
122
|
+
end
|
93
123
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
98
|
-
create_sql
|
99
|
-
end
|
124
|
+
def supports_index_using?
|
125
|
+
true
|
126
|
+
end
|
100
127
|
|
101
|
-
|
102
|
-
|
103
|
-
|
128
|
+
def add_table_options!(create_sql, o)
|
129
|
+
create_sql << " #{o.options}" if o.options
|
130
|
+
create_sql
|
131
|
+
end
|
104
132
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
if options[:null] == false
|
109
|
-
sql << " NOT NULL"
|
110
|
-
end
|
111
|
-
if options[:auto_increment] == true
|
112
|
-
sql << " AUTO_INCREMENT"
|
113
|
-
end
|
114
|
-
if options[:primary_key] == true
|
115
|
-
sql << " PRIMARY KEY"
|
116
|
-
end
|
117
|
-
sql
|
118
|
-
end
|
133
|
+
def column_options(o)
|
134
|
+
o.options.merge(column: o)
|
135
|
+
end
|
119
136
|
|
120
|
-
|
121
|
-
|
122
|
-
|
137
|
+
def add_column_options!(sql, options)
|
138
|
+
sql << " DEFAULT #{quote_default_expression(options[:default], options[:column])}" if options_include_default?(options)
|
139
|
+
# must explicitly check for :null to allow change_column to work on migrations
|
140
|
+
if options[:null] == false
|
141
|
+
sql << " NOT NULL"
|
123
142
|
end
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
143
|
+
if options[:auto_increment] == true
|
144
|
+
sql << " AUTO_INCREMENT"
|
145
|
+
end
|
146
|
+
if options[:primary_key] == true
|
147
|
+
sql << " PRIMARY KEY"
|
128
148
|
end
|
149
|
+
sql
|
150
|
+
end
|
151
|
+
|
152
|
+
def to_sql(sql)
|
153
|
+
sql = sql.to_sql if sql.respond_to?(:to_sql)
|
154
|
+
sql
|
155
|
+
end
|
129
156
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
157
|
+
# Returns any SQL string to go between CREATE and TABLE. May be nil.
|
158
|
+
def table_modifier_in_create(o)
|
159
|
+
" TEMPORARY" if o.temporary
|
160
|
+
end
|
161
|
+
|
162
|
+
def action_sql(action, dependency)
|
163
|
+
case dependency
|
164
|
+
when :nullify then "ON #{action} SET NULL"
|
165
|
+
when :cascade then "ON #{action} CASCADE"
|
166
|
+
when :restrict then "ON #{action} RESTRICT"
|
167
|
+
else
|
168
|
+
raise ArgumentError, <<~MSG
|
169
|
+
'#{dependency}' is not supported for :on_update or :on_delete.
|
170
|
+
Supported values are: :nullify, :cascade, :restrict
|
171
|
+
MSG
|
141
172
|
end
|
142
|
-
|
173
|
+
end
|
143
174
|
end
|
144
|
-
SchemaCreation = AbstractAdapter::SchemaCreation # :nodoc:
|
145
175
|
end
|
146
176
|
end
|