activerecord 5.2.4.3 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +614 -588
 - data/MIT-LICENSE +3 -1
 - data/README.rdoc +4 -2
 - data/examples/performance.rb +1 -1
 - data/lib/active_record.rb +9 -2
 - data/lib/active_record/aggregations.rb +4 -2
 - data/lib/active_record/associations.rb +19 -14
 - data/lib/active_record/associations/association.rb +52 -19
 - data/lib/active_record/associations/association_scope.rb +4 -6
 - data/lib/active_record/associations/belongs_to_association.rb +36 -42
 - data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
 - data/lib/active_record/associations/builder/association.rb +14 -18
 - data/lib/active_record/associations/builder/belongs_to.rb +19 -52
 - data/lib/active_record/associations/builder/collection_association.rb +3 -13
 - data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
 - data/lib/active_record/associations/builder/has_many.rb +2 -0
 - data/lib/active_record/associations/builder/has_one.rb +35 -1
 - data/lib/active_record/associations/builder/singular_association.rb +2 -0
 - data/lib/active_record/associations/collection_association.rb +6 -21
 - data/lib/active_record/associations/collection_proxy.rb +12 -15
 - data/lib/active_record/associations/foreign_association.rb +7 -0
 - data/lib/active_record/associations/has_many_association.rb +2 -10
 - data/lib/active_record/associations/has_many_through_association.rb +14 -14
 - data/lib/active_record/associations/has_one_association.rb +28 -30
 - data/lib/active_record/associations/has_one_through_association.rb +5 -5
 - data/lib/active_record/associations/join_dependency.rb +24 -28
 - data/lib/active_record/associations/join_dependency/join_association.rb +9 -10
 - data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
 - data/lib/active_record/associations/preloader.rb +40 -32
 - data/lib/active_record/associations/preloader/association.rb +38 -36
 - data/lib/active_record/associations/preloader/through_association.rb +48 -39
 - data/lib/active_record/associations/singular_association.rb +2 -16
 - data/lib/active_record/attribute_assignment.rb +7 -10
 - data/lib/active_record/attribute_methods.rb +28 -100
 - data/lib/active_record/attribute_methods/before_type_cast.rb +4 -1
 - data/lib/active_record/attribute_methods/dirty.rb +111 -40
 - data/lib/active_record/attribute_methods/primary_key.rb +15 -22
 - data/lib/active_record/attribute_methods/query.rb +2 -3
 - data/lib/active_record/attribute_methods/read.rb +15 -53
 - data/lib/active_record/attribute_methods/serialization.rb +1 -1
 - data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
 - data/lib/active_record/attribute_methods/write.rb +17 -24
 - data/lib/active_record/attributes.rb +13 -0
 - data/lib/active_record/autosave_association.rb +5 -9
 - data/lib/active_record/base.rb +2 -3
 - data/lib/active_record/callbacks.rb +5 -19
 - data/lib/active_record/connection_adapters/abstract/connection_pool.rb +94 -16
 - data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -4
 - data/lib/active_record/connection_adapters/abstract/database_statements.rb +95 -123
 - data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -8
 - data/lib/active_record/connection_adapters/abstract/quoting.rb +68 -17
 - data/lib/active_record/connection_adapters/abstract/schema_creation.rb +19 -12
 - data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +76 -48
 - data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -3
 - data/lib/active_record/connection_adapters/abstract/schema_statements.rb +132 -53
 - data/lib/active_record/connection_adapters/abstract/transaction.rb +96 -56
 - data/lib/active_record/connection_adapters/abstract_adapter.rb +180 -47
 - data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +128 -194
 - data/lib/active_record/connection_adapters/column.rb +17 -13
 - data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
 - data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +6 -10
 - data/lib/active_record/connection_adapters/mysql/database_statements.rb +73 -13
 - data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
 - data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
 - data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +40 -32
 - data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
 - data/lib/active_record/connection_adapters/mysql/schema_statements.rb +129 -13
 - data/lib/active_record/connection_adapters/mysql/type_metadata.rb +6 -10
 - data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -9
 - data/lib/active_record/connection_adapters/postgresql/column.rb +17 -31
 - data/lib/active_record/connection_adapters/postgresql/database_statements.rb +20 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
 - data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/range.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
 - data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +6 -3
 - data/lib/active_record/connection_adapters/postgresql/quoting.rb +44 -7
 - data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +12 -1
 - data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
 - data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +55 -53
 - data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +24 -27
 - data/lib/active_record/connection_adapters/postgresql_adapter.rb +160 -74
 - data/lib/active_record/connection_adapters/schema_cache.rb +37 -14
 - data/lib/active_record/connection_adapters/sql_type_metadata.rb +11 -8
 - data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
 - data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -6
 - data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +42 -11
 - data/lib/active_record/connection_adapters/sqlite3_adapter.rb +125 -141
 - data/lib/active_record/connection_handling.rb +149 -27
 - data/lib/active_record/core.rb +100 -60
 - data/lib/active_record/counter_cache.rb +4 -29
 - 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 +79 -0
 - data/lib/active_record/dynamic_matchers.rb +1 -1
 - data/lib/active_record/enum.rb +37 -7
 - data/lib/active_record/errors.rb +15 -7
 - data/lib/active_record/explain.rb +1 -1
 - 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 +153 -0
 - data/lib/active_record/fixture_set/table_rows.rb +47 -0
 - data/lib/active_record/fixtures.rb +145 -472
 - data/lib/active_record/gem_version.rb +4 -4
 - data/lib/active_record/inheritance.rb +13 -3
 - data/lib/active_record/insert_all.rb +179 -0
 - data/lib/active_record/integration.rb +68 -16
 - data/lib/active_record/internal_metadata.rb +10 -2
 - data/lib/active_record/locking/optimistic.rb +5 -6
 - data/lib/active_record/locking/pessimistic.rb +3 -3
 - data/lib/active_record/log_subscriber.rb +7 -26
 - data/lib/active_record/middleware/database_selector.rb +75 -0
 - data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
 - data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
 - data/lib/active_record/migration.rb +100 -81
 - data/lib/active_record/migration/command_recorder.rb +50 -6
 - data/lib/active_record/migration/compatibility.rb +76 -49
 - data/lib/active_record/model_schema.rb +30 -9
 - data/lib/active_record/nested_attributes.rb +2 -2
 - data/lib/active_record/no_touching.rb +7 -0
 - data/lib/active_record/persistence.rb +228 -24
 - data/lib/active_record/query_cache.rb +11 -4
 - data/lib/active_record/querying.rb +32 -20
 - data/lib/active_record/railtie.rb +80 -43
 - data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
 - data/lib/active_record/railties/controller_runtime.rb +30 -35
 - data/lib/active_record/railties/databases.rake +196 -46
 - data/lib/active_record/reflection.rb +32 -30
 - data/lib/active_record/relation.rb +310 -80
 - data/lib/active_record/relation/batches.rb +13 -10
 - data/lib/active_record/relation/calculations.rb +53 -47
 - data/lib/active_record/relation/delegation.rb +26 -43
 - data/lib/active_record/relation/finder_methods.rb +13 -26
 - data/lib/active_record/relation/merger.rb +11 -20
 - data/lib/active_record/relation/predicate_builder.rb +4 -6
 - data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
 - data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
 - data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
 - data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
 - data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
 - data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
 - data/lib/active_record/relation/query_attribute.rb +13 -8
 - data/lib/active_record/relation/query_methods.rb +189 -63
 - data/lib/active_record/relation/spawn_methods.rb +1 -1
 - data/lib/active_record/relation/where_clause.rb +14 -10
 - data/lib/active_record/relation/where_clause_factory.rb +1 -2
 - data/lib/active_record/result.rb +30 -11
 - data/lib/active_record/sanitization.rb +32 -40
 - data/lib/active_record/schema.rb +2 -11
 - data/lib/active_record/schema_dumper.rb +22 -7
 - data/lib/active_record/schema_migration.rb +5 -1
 - data/lib/active_record/scoping.rb +8 -8
 - data/lib/active_record/scoping/default.rb +4 -5
 - data/lib/active_record/scoping/named.rb +19 -15
 - data/lib/active_record/statement_cache.rb +30 -3
 - data/lib/active_record/store.rb +87 -8
 - data/lib/active_record/table_metadata.rb +10 -17
 - data/lib/active_record/tasks/database_tasks.rb +194 -25
 - data/lib/active_record/tasks/mysql_database_tasks.rb +5 -5
 - data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
 - data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
 - data/lib/active_record/test_databases.rb +23 -0
 - data/lib/active_record/test_fixtures.rb +224 -0
 - data/lib/active_record/timestamp.rb +39 -25
 - data/lib/active_record/touch_later.rb +4 -2
 - data/lib/active_record/transactions.rb +57 -66
 - data/lib/active_record/translation.rb +1 -1
 - data/lib/active_record/type.rb +3 -4
 - data/lib/active_record/type/adapter_specific_registry.rb +1 -8
 - data/lib/active_record/type_caster/connection.rb +15 -14
 - data/lib/active_record/type_caster/map.rb +1 -4
 - data/lib/active_record/validations.rb +1 -0
 - data/lib/active_record/validations/uniqueness.rb +15 -27
 - data/lib/arel.rb +51 -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 +257 -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 +204 -0
 - data/lib/arel/visitors/dot.rb +297 -0
 - data/lib/arel/visitors/ibm_db.rb +34 -0
 - data/lib/arel/visitors/informix.rb +62 -0
 - data/lib/arel/visitors/mssql.rb +157 -0
 - data/lib/arel/visitors/mysql.rb +83 -0
 - data/lib/arel/visitors/oracle.rb +159 -0
 - data/lib/arel/visitors/oracle12.rb +66 -0
 - data/lib/arel/visitors/postgresql.rb +110 -0
 - data/lib/arel/visitors/sqlite.rb +39 -0
 - data/lib/arel/visitors/to_sql.rb +889 -0
 - data/lib/arel/visitors/visitor.rb +46 -0
 - data/lib/arel/visitors/where_sql.rb +23 -0
 - data/lib/arel/window_predications.rb +9 -0
 - data/lib/rails/generators/active_record/migration.rb +14 -1
 - data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
 - data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +1 -1
 - data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -2
 - data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
 - data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
 - metadata +108 -26
 - data/lib/active_record/collection_cache_key.rb +0 -53
 
| 
         @@ -40,24 +40,6 @@ module ActiveRecord 
     | 
|
| 
       40 
40 
     | 
    
         
             
                    committed? || rolledback?
         
     | 
| 
       41 
41 
     | 
    
         
             
                  end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                  def set_state(state)
         
     | 
| 
       44 
     | 
    
         
            -
                    ActiveSupport::Deprecation.warn(<<-MSG.squish)
         
     | 
| 
       45 
     | 
    
         
            -
                      The set_state method is deprecated and will be removed in
         
     | 
| 
       46 
     | 
    
         
            -
                      Rails 6.0. Please use rollback! or commit! to set transaction
         
     | 
| 
       47 
     | 
    
         
            -
                      state directly.
         
     | 
| 
       48 
     | 
    
         
            -
                    MSG
         
     | 
| 
       49 
     | 
    
         
            -
                    case state
         
     | 
| 
       50 
     | 
    
         
            -
                    when :rolledback
         
     | 
| 
       51 
     | 
    
         
            -
                      rollback!
         
     | 
| 
       52 
     | 
    
         
            -
                    when :committed
         
     | 
| 
       53 
     | 
    
         
            -
                      commit!
         
     | 
| 
       54 
     | 
    
         
            -
                    when nil
         
     | 
| 
       55 
     | 
    
         
            -
                      nullify!
         
     | 
| 
       56 
     | 
    
         
            -
                    else
         
     | 
| 
       57 
     | 
    
         
            -
                      raise ArgumentError, "Invalid transaction state: #{state}"
         
     | 
| 
       58 
     | 
    
         
            -
                    end
         
     | 
| 
       59 
     | 
    
         
            -
                  end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
43 
     | 
    
         
             
                  def rollback!
         
     | 
| 
       62 
44 
     | 
    
         
             
                    @children.each { |c| c.rollback! }
         
     | 
| 
       63 
45 
     | 
    
         
             
                    @state = :rolledback
         
     | 
| 
         @@ -91,13 +73,14 @@ module ActiveRecord 
     | 
|
| 
       91 
73 
     | 
    
         
             
                end
         
     | 
| 
       92 
74 
     | 
    
         | 
| 
       93 
75 
     | 
    
         
             
                class Transaction #:nodoc:
         
     | 
| 
       94 
     | 
    
         
            -
                  attr_reader :connection, :state, :records, :savepoint_name
         
     | 
| 
       95 
     | 
    
         
            -
                  attr_writer :joinable
         
     | 
| 
      
 76 
     | 
    
         
            +
                  attr_reader :connection, :state, :records, :savepoint_name, :isolation_level
         
     | 
| 
       96 
77 
     | 
    
         | 
| 
       97 
78 
     | 
    
         
             
                  def initialize(connection, options, run_commit_callbacks: false)
         
     | 
| 
       98 
79 
     | 
    
         
             
                    @connection = connection
         
     | 
| 
       99 
80 
     | 
    
         
             
                    @state = TransactionState.new
         
     | 
| 
       100 
81 
     | 
    
         
             
                    @records = []
         
     | 
| 
      
 82 
     | 
    
         
            +
                    @isolation_level = options[:isolation]
         
     | 
| 
      
 83 
     | 
    
         
            +
                    @materialized = false
         
     | 
| 
       101 
84 
     | 
    
         
             
                    @joinable = options.fetch(:joinable, true)
         
     | 
| 
       102 
85 
     | 
    
         
             
                    @run_commit_callbacks = run_commit_callbacks
         
     | 
| 
       103 
86 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -106,10 +89,22 @@ module ActiveRecord 
     | 
|
| 
       106 
89 
     | 
    
         
             
                    records << record
         
     | 
| 
       107 
90 
     | 
    
         
             
                  end
         
     | 
| 
       108 
91 
     | 
    
         | 
| 
      
 92 
     | 
    
         
            +
                  def materialize!
         
     | 
| 
      
 93 
     | 
    
         
            +
                    @materialized = true
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  def materialized?
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @materialized
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
       109 
100 
     | 
    
         
             
                  def rollback_records
         
     | 
| 
       110 
     | 
    
         
            -
                    ite = records.uniq
         
     | 
| 
      
 101 
     | 
    
         
            +
                    ite = records.uniq(&:object_id)
         
     | 
| 
      
 102 
     | 
    
         
            +
                    already_run_callbacks = {}
         
     | 
| 
       111 
103 
     | 
    
         
             
                    while record = ite.shift
         
     | 
| 
       112 
     | 
    
         
            -
                      record. 
     | 
| 
      
 104 
     | 
    
         
            +
                      trigger_callbacks = record.trigger_transactional_callbacks?
         
     | 
| 
      
 105 
     | 
    
         
            +
                      should_run_callbacks = !already_run_callbacks[record] && trigger_callbacks
         
     | 
| 
      
 106 
     | 
    
         
            +
                      already_run_callbacks[record] ||= trigger_callbacks
         
     | 
| 
      
 107 
     | 
    
         
            +
                      record.rolledback!(force_restore_state: full_rollback?, should_run_callbacks: should_run_callbacks)
         
     | 
| 
       113 
108 
     | 
    
         
             
                    end
         
     | 
| 
       114 
109 
     | 
    
         
             
                  ensure
         
     | 
| 
       115 
110 
     | 
    
         
             
                    ite.each do |i|
         
     | 
| 
         @@ -122,13 +117,17 @@ module ActiveRecord 
     | 
|
| 
       122 
117 
     | 
    
         
             
                  end
         
     | 
| 
       123 
118 
     | 
    
         | 
| 
       124 
119 
     | 
    
         
             
                  def commit_records
         
     | 
| 
       125 
     | 
    
         
            -
                    ite = records.uniq
         
     | 
| 
      
 120 
     | 
    
         
            +
                    ite = records.uniq(&:object_id)
         
     | 
| 
      
 121 
     | 
    
         
            +
                    already_run_callbacks = {}
         
     | 
| 
       126 
122 
     | 
    
         
             
                    while record = ite.shift
         
     | 
| 
       127 
123 
     | 
    
         
             
                      if @run_commit_callbacks
         
     | 
| 
       128 
     | 
    
         
            -
                        record. 
     | 
| 
      
 124 
     | 
    
         
            +
                        trigger_callbacks = record.trigger_transactional_callbacks?
         
     | 
| 
      
 125 
     | 
    
         
            +
                        should_run_callbacks = !already_run_callbacks[record] && trigger_callbacks
         
     | 
| 
      
 126 
     | 
    
         
            +
                        already_run_callbacks[record] ||= trigger_callbacks
         
     | 
| 
      
 127 
     | 
    
         
            +
                        record.committed!(should_run_callbacks: should_run_callbacks)
         
     | 
| 
       129 
128 
     | 
    
         
             
                      else
         
     | 
| 
       130 
129 
     | 
    
         
             
                        # if not running callbacks, only adds the record to the parent transaction
         
     | 
| 
       131 
     | 
    
         
            -
                        record 
     | 
| 
      
 130 
     | 
    
         
            +
                        connection.add_transaction_record(record)
         
     | 
| 
       132 
131 
     | 
    
         
             
                      end
         
     | 
| 
       133 
132 
     | 
    
         
             
                    end
         
     | 
| 
       134 
133 
     | 
    
         
             
                  ensure
         
     | 
| 
         @@ -142,24 +141,30 @@ module ActiveRecord 
     | 
|
| 
       142 
141 
     | 
    
         
             
                end
         
     | 
| 
       143 
142 
     | 
    
         | 
| 
       144 
143 
     | 
    
         
             
                class SavepointTransaction < Transaction
         
     | 
| 
       145 
     | 
    
         
            -
                  def initialize(connection, savepoint_name, parent_transaction,  
     | 
| 
       146 
     | 
    
         
            -
                    super(connection,  
     | 
| 
      
 144 
     | 
    
         
            +
                  def initialize(connection, savepoint_name, parent_transaction, *args)
         
     | 
| 
      
 145 
     | 
    
         
            +
                    super(connection, *args)
         
     | 
| 
       147 
146 
     | 
    
         | 
| 
       148 
147 
     | 
    
         
             
                    parent_transaction.state.add_child(@state)
         
     | 
| 
       149 
148 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                    if  
     | 
| 
      
 149 
     | 
    
         
            +
                    if isolation_level
         
     | 
| 
       151 
150 
     | 
    
         
             
                      raise ActiveRecord::TransactionIsolationError, "cannot set transaction isolation in a nested transaction"
         
     | 
| 
       152 
151 
     | 
    
         
             
                    end
         
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                    @savepoint_name = savepoint_name
         
     | 
| 
      
 154 
     | 
    
         
            +
                  end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
                  def materialize!
         
     | 
| 
      
 157 
     | 
    
         
            +
                    connection.create_savepoint(savepoint_name)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    super
         
     | 
| 
       154 
159 
     | 
    
         
             
                  end
         
     | 
| 
       155 
160 
     | 
    
         | 
| 
       156 
161 
     | 
    
         
             
                  def rollback
         
     | 
| 
       157 
     | 
    
         
            -
                    connection.rollback_to_savepoint(savepoint_name)
         
     | 
| 
      
 162 
     | 
    
         
            +
                    connection.rollback_to_savepoint(savepoint_name) if materialized?
         
     | 
| 
       158 
163 
     | 
    
         
             
                    @state.rollback!
         
     | 
| 
       159 
164 
     | 
    
         
             
                  end
         
     | 
| 
       160 
165 
     | 
    
         | 
| 
       161 
166 
     | 
    
         
             
                  def commit
         
     | 
| 
       162 
     | 
    
         
            -
                    connection.release_savepoint(savepoint_name)
         
     | 
| 
      
 167 
     | 
    
         
            +
                    connection.release_savepoint(savepoint_name) if materialized?
         
     | 
| 
       163 
168 
     | 
    
         
             
                    @state.commit!
         
     | 
| 
       164 
169 
     | 
    
         
             
                  end
         
     | 
| 
       165 
170 
     | 
    
         | 
| 
         @@ -167,22 +172,23 @@ module ActiveRecord 
     | 
|
| 
       167 
172 
     | 
    
         
             
                end
         
     | 
| 
       168 
173 
     | 
    
         | 
| 
       169 
174 
     | 
    
         
             
                class RealTransaction < Transaction
         
     | 
| 
       170 
     | 
    
         
            -
                  def  
     | 
| 
       171 
     | 
    
         
            -
                     
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
       173 
     | 
    
         
            -
                      connection.begin_isolated_db_transaction(options[:isolation])
         
     | 
| 
      
 175 
     | 
    
         
            +
                  def materialize!
         
     | 
| 
      
 176 
     | 
    
         
            +
                    if isolation_level
         
     | 
| 
      
 177 
     | 
    
         
            +
                      connection.begin_isolated_db_transaction(isolation_level)
         
     | 
| 
       174 
178 
     | 
    
         
             
                    else
         
     | 
| 
       175 
179 
     | 
    
         
             
                      connection.begin_db_transaction
         
     | 
| 
       176 
180 
     | 
    
         
             
                    end
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
                    super
         
     | 
| 
       177 
183 
     | 
    
         
             
                  end
         
     | 
| 
       178 
184 
     | 
    
         | 
| 
       179 
185 
     | 
    
         
             
                  def rollback
         
     | 
| 
       180 
     | 
    
         
            -
                    connection.rollback_db_transaction
         
     | 
| 
      
 186 
     | 
    
         
            +
                    connection.rollback_db_transaction if materialized?
         
     | 
| 
       181 
187 
     | 
    
         
             
                    @state.full_rollback!
         
     | 
| 
       182 
188 
     | 
    
         
             
                  end
         
     | 
| 
       183 
189 
     | 
    
         | 
| 
       184 
190 
     | 
    
         
             
                  def commit
         
     | 
| 
       185 
     | 
    
         
            -
                    connection.commit_db_transaction
         
     | 
| 
      
 191 
     | 
    
         
            +
                    connection.commit_db_transaction if materialized?
         
     | 
| 
       186 
192 
     | 
    
         
             
                    @state.full_commit!
         
     | 
| 
       187 
193 
     | 
    
         
             
                  end
         
     | 
| 
       188 
194 
     | 
    
         
             
                end
         
     | 
| 
         @@ -191,6 +197,9 @@ module ActiveRecord 
     | 
|
| 
       191 
197 
     | 
    
         
             
                  def initialize(connection)
         
     | 
| 
       192 
198 
     | 
    
         
             
                    @stack = []
         
     | 
| 
       193 
199 
     | 
    
         
             
                    @connection = connection
         
     | 
| 
      
 200 
     | 
    
         
            +
                    @has_unmaterialized_transactions = false
         
     | 
| 
      
 201 
     | 
    
         
            +
                    @materializing_transactions = false
         
     | 
| 
      
 202 
     | 
    
         
            +
                    @lazy_transactions_enabled = true
         
     | 
| 
       194 
203 
     | 
    
         
             
                  end
         
     | 
| 
       195 
204 
     | 
    
         | 
| 
       196 
205 
     | 
    
         
             
                  def begin_transaction(options = {})
         
     | 
| 
         @@ -204,11 +213,44 @@ module ActiveRecord 
     | 
|
| 
       204 
213 
     | 
    
         
             
                                                   run_commit_callbacks: run_commit_callbacks)
         
     | 
| 
       205 
214 
     | 
    
         
             
                        end
         
     | 
| 
       206 
215 
     | 
    
         | 
| 
      
 216 
     | 
    
         
            +
                      if @connection.supports_lazy_transactions? && lazy_transactions_enabled? && options[:_lazy] != false
         
     | 
| 
      
 217 
     | 
    
         
            +
                        @has_unmaterialized_transactions = true
         
     | 
| 
      
 218 
     | 
    
         
            +
                      else
         
     | 
| 
      
 219 
     | 
    
         
            +
                        transaction.materialize!
         
     | 
| 
      
 220 
     | 
    
         
            +
                      end
         
     | 
| 
       207 
221 
     | 
    
         
             
                      @stack.push(transaction)
         
     | 
| 
       208 
222 
     | 
    
         
             
                      transaction
         
     | 
| 
       209 
223 
     | 
    
         
             
                    end
         
     | 
| 
       210 
224 
     | 
    
         
             
                  end
         
     | 
| 
       211 
225 
     | 
    
         | 
| 
      
 226 
     | 
    
         
            +
                  def disable_lazy_transactions!
         
     | 
| 
      
 227 
     | 
    
         
            +
                    materialize_transactions
         
     | 
| 
      
 228 
     | 
    
         
            +
                    @lazy_transactions_enabled = false
         
     | 
| 
      
 229 
     | 
    
         
            +
                  end
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
      
 231 
     | 
    
         
            +
                  def enable_lazy_transactions!
         
     | 
| 
      
 232 
     | 
    
         
            +
                    @lazy_transactions_enabled = true
         
     | 
| 
      
 233 
     | 
    
         
            +
                  end
         
     | 
| 
      
 234 
     | 
    
         
            +
             
     | 
| 
      
 235 
     | 
    
         
            +
                  def lazy_transactions_enabled?
         
     | 
| 
      
 236 
     | 
    
         
            +
                    @lazy_transactions_enabled
         
     | 
| 
      
 237 
     | 
    
         
            +
                  end
         
     | 
| 
      
 238 
     | 
    
         
            +
             
     | 
| 
      
 239 
     | 
    
         
            +
                  def materialize_transactions
         
     | 
| 
      
 240 
     | 
    
         
            +
                    return if @materializing_transactions
         
     | 
| 
      
 241 
     | 
    
         
            +
                    return unless @has_unmaterialized_transactions
         
     | 
| 
      
 242 
     | 
    
         
            +
             
     | 
| 
      
 243 
     | 
    
         
            +
                    @connection.lock.synchronize do
         
     | 
| 
      
 244 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 245 
     | 
    
         
            +
                        @materializing_transactions = true
         
     | 
| 
      
 246 
     | 
    
         
            +
                        @stack.each { |t| t.materialize! unless t.materialized? }
         
     | 
| 
      
 247 
     | 
    
         
            +
                      ensure
         
     | 
| 
      
 248 
     | 
    
         
            +
                        @materializing_transactions = false
         
     | 
| 
      
 249 
     | 
    
         
            +
                      end
         
     | 
| 
      
 250 
     | 
    
         
            +
                      @has_unmaterialized_transactions = false
         
     | 
| 
      
 251 
     | 
    
         
            +
                    end
         
     | 
| 
      
 252 
     | 
    
         
            +
                  end
         
     | 
| 
      
 253 
     | 
    
         
            +
             
     | 
| 
       212 
254 
     | 
    
         
             
                  def commit_transaction
         
     | 
| 
       213 
255 
     | 
    
         
             
                    @connection.lock.synchronize do
         
     | 
| 
       214 
256 
     | 
    
         
             
                      transaction = @stack.last
         
     | 
| 
         @@ -234,26 +276,24 @@ module ActiveRecord 
     | 
|
| 
       234 
276 
     | 
    
         | 
| 
       235 
277 
     | 
    
         
             
                  def within_new_transaction(options = {})
         
     | 
| 
       236 
278 
     | 
    
         
             
                    @connection.lock.synchronize do
         
     | 
| 
       237 
     | 
    
         
            -
                       
     | 
| 
       238 
     | 
    
         
            -
             
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
       240 
     | 
    
         
            -
                       
     | 
| 
       241 
     | 
    
         
            -
                         
     | 
| 
      
 279 
     | 
    
         
            +
                      transaction = begin_transaction options
         
     | 
| 
      
 280 
     | 
    
         
            +
                      yield
         
     | 
| 
      
 281 
     | 
    
         
            +
                    rescue Exception => error
         
     | 
| 
      
 282 
     | 
    
         
            +
                      if transaction
         
     | 
| 
      
 283 
     | 
    
         
            +
                        rollback_transaction
         
     | 
| 
      
 284 
     | 
    
         
            +
                        after_failure_actions(transaction, error)
         
     | 
| 
      
 285 
     | 
    
         
            +
                      end
         
     | 
| 
      
 286 
     | 
    
         
            +
                      raise
         
     | 
| 
      
 287 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 288 
     | 
    
         
            +
                      if !error && transaction
         
     | 
| 
      
 289 
     | 
    
         
            +
                        if Thread.current.status == "aborting"
         
     | 
| 
       242 
290 
     | 
    
         
             
                          rollback_transaction
         
     | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
       245 
     | 
    
         
            -
             
     | 
| 
       246 
     | 
    
         
            -
             
     | 
| 
       247 
     | 
    
         
            -
             
     | 
| 
       248 
     | 
    
         
            -
             
     | 
| 
       249 
     | 
    
         
            -
                            rollback_transaction if transaction
         
     | 
| 
       250 
     | 
    
         
            -
                          else
         
     | 
| 
       251 
     | 
    
         
            -
                            begin
         
     | 
| 
       252 
     | 
    
         
            -
                              commit_transaction if transaction
         
     | 
| 
       253 
     | 
    
         
            -
                            rescue Exception
         
     | 
| 
       254 
     | 
    
         
            -
                              rollback_transaction(transaction) unless transaction.state.completed?
         
     | 
| 
       255 
     | 
    
         
            -
                              raise
         
     | 
| 
       256 
     | 
    
         
            -
                            end
         
     | 
| 
      
 291 
     | 
    
         
            +
                        else
         
     | 
| 
      
 292 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 293 
     | 
    
         
            +
                            commit_transaction
         
     | 
| 
      
 294 
     | 
    
         
            +
                          rescue Exception
         
     | 
| 
      
 295 
     | 
    
         
            +
                            rollback_transaction(transaction) unless transaction.state.completed?
         
     | 
| 
      
 296 
     | 
    
         
            +
                            raise
         
     | 
| 
       257 
297 
     | 
    
         
             
                          end
         
     | 
| 
       258 
298 
     | 
    
         
             
                        end
         
     | 
| 
       259 
299 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -6,10 +6,12 @@ require "active_record/connection_adapters/sql_type_metadata" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require "active_record/connection_adapters/abstract/schema_dumper"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "active_record/connection_adapters/abstract/schema_creation"
         
     | 
| 
       8 
8 
     | 
    
         
             
            require "active_support/concurrency/load_interlock_aware_monitor"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "active_support/deprecation"
         
     | 
| 
       9 
10 
     | 
    
         
             
            require "arel/collectors/bind"
         
     | 
| 
       10 
11 
     | 
    
         
             
            require "arel/collectors/composite"
         
     | 
| 
       11 
12 
     | 
    
         
             
            require "arel/collectors/sql_string"
         
     | 
| 
       12 
13 
     | 
    
         
             
            require "arel/collectors/substitute_binds"
         
     | 
| 
      
 14 
     | 
    
         
            +
            require "concurrent/atomic/thread_local_var"
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
       14 
16 
     | 
    
         
             
            module ActiveRecord
         
     | 
| 
       15 
17 
     | 
    
         
             
              module ConnectionAdapters # :nodoc:
         
     | 
| 
         @@ -65,7 +67,7 @@ module ActiveRecord 
     | 
|
| 
       65 
67 
     | 
    
         
             
                # Most of the methods in the adapter are useful during migrations. Most
         
     | 
| 
       66 
68 
     | 
    
         
             
                # notably, the instance methods provided by SchemaStatements are very useful.
         
     | 
| 
       67 
69 
     | 
    
         
             
                class AbstractAdapter
         
     | 
| 
       68 
     | 
    
         
            -
                  ADAPTER_NAME = "Abstract" 
     | 
| 
      
 70 
     | 
    
         
            +
                  ADAPTER_NAME = "Abstract"
         
     | 
| 
       69 
71 
     | 
    
         
             
                  include ActiveSupport::Callbacks
         
     | 
| 
       70 
72 
     | 
    
         
             
                  define_callbacks :checkout, :checkin
         
     | 
| 
       71 
73 
     | 
    
         | 
| 
         @@ -76,14 +78,16 @@ module ActiveRecord 
     | 
|
| 
       76 
78 
     | 
    
         | 
| 
       77 
79 
     | 
    
         
             
                  SIMPLE_INT = /\A\d+\z/
         
     | 
| 
       78 
80 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
       80 
     | 
    
         
            -
                  attr_reader : 
     | 
| 
      
 81 
     | 
    
         
            +
                  attr_accessor :pool
         
     | 
| 
      
 82 
     | 
    
         
            +
                  attr_reader :visitor, :owner, :logger, :lock
         
     | 
| 
       81 
83 
     | 
    
         
             
                  alias :in_use? :owner
         
     | 
| 
       82 
84 
     | 
    
         | 
| 
      
 85 
     | 
    
         
            +
                  set_callback :checkin, :after, :enable_lazy_transactions!
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
       83 
87 
     | 
    
         
             
                  def self.type_cast_config_to_integer(config)
         
     | 
| 
       84 
88 
     | 
    
         
             
                    if config.is_a?(Integer)
         
     | 
| 
       85 
89 
     | 
    
         
             
                      config
         
     | 
| 
       86 
     | 
    
         
            -
                    elsif config 
     | 
| 
      
 90 
     | 
    
         
            +
                    elsif SIMPLE_INT.match?(config)
         
     | 
| 
       87 
91 
     | 
    
         
             
                      config.to_i
         
     | 
| 
       88 
92 
     | 
    
         
             
                    else
         
     | 
| 
       89 
93 
     | 
    
         
             
                      config
         
     | 
| 
         @@ -98,6 +102,19 @@ module ActiveRecord 
     | 
|
| 
       98 
102 
     | 
    
         
             
                    end
         
     | 
| 
       99 
103 
     | 
    
         
             
                  end
         
     | 
| 
       100 
104 
     | 
    
         | 
| 
      
 105 
     | 
    
         
            +
                  def self.build_read_query_regexp(*parts) # :nodoc:
         
     | 
| 
      
 106 
     | 
    
         
            +
                    parts = parts.map { |part| /\A[\(\s]*#{part}/i }
         
     | 
| 
      
 107 
     | 
    
         
            +
                    Regexp.union(*parts)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  def self.quoted_column_names # :nodoc:
         
     | 
| 
      
 111 
     | 
    
         
            +
                    @quoted_column_names ||= {}
         
     | 
| 
      
 112 
     | 
    
         
            +
                  end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                  def self.quoted_table_names # :nodoc:
         
     | 
| 
      
 115 
     | 
    
         
            +
                    @quoted_table_names ||= {}
         
     | 
| 
      
 116 
     | 
    
         
            +
                  end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
       101 
118 
     | 
    
         
             
                  def initialize(connection, logger = nil, config = {}) # :nodoc:
         
     | 
| 
       102 
119 
     | 
    
         
             
                    super()
         
     | 
| 
       103 
120 
     | 
    
         | 
| 
         @@ -106,19 +123,34 @@ module ActiveRecord 
     | 
|
| 
       106 
123 
     | 
    
         
             
                    @instrumenter        = ActiveSupport::Notifications.instrumenter
         
     | 
| 
       107 
124 
     | 
    
         
             
                    @logger              = logger
         
     | 
| 
       108 
125 
     | 
    
         
             
                    @config              = config
         
     | 
| 
       109 
     | 
    
         
            -
                    @pool                =  
     | 
| 
      
 126 
     | 
    
         
            +
                    @pool                = ActiveRecord::ConnectionAdapters::NullPool.new
         
     | 
| 
       110 
127 
     | 
    
         
             
                    @idle_since          = Concurrent.monotonic_time
         
     | 
| 
       111 
     | 
    
         
            -
                    @schema_cache        = SchemaCache.new self
         
     | 
| 
       112 
     | 
    
         
            -
                    @quoted_column_names, @quoted_table_names = {}, {}
         
     | 
| 
       113 
128 
     | 
    
         
             
                    @visitor = arel_visitor
         
     | 
| 
      
 129 
     | 
    
         
            +
                    @statements = build_statement_pool
         
     | 
| 
       114 
130 
     | 
    
         
             
                    @lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
         
     | 
| 
       115 
131 
     | 
    
         | 
| 
       116 
132 
     | 
    
         
             
                    if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
         
     | 
| 
       117 
     | 
    
         
            -
                      @ 
     | 
| 
      
 133 
     | 
    
         
            +
                      @prepared_statement_status = Concurrent::ThreadLocalVar.new(true)
         
     | 
| 
       118 
134 
     | 
    
         
             
                      @visitor.extend(DetermineIfPreparableVisitor)
         
     | 
| 
       119 
135 
     | 
    
         
             
                    else
         
     | 
| 
       120 
     | 
    
         
            -
                      @ 
     | 
| 
      
 136 
     | 
    
         
            +
                      @prepared_statement_status = Concurrent::ThreadLocalVar.new(false)
         
     | 
| 
       121 
137 
     | 
    
         
             
                    end
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                    @advisory_locks_enabled = self.class.type_cast_config_to_boolean(
         
     | 
| 
      
 140 
     | 
    
         
            +
                      config.fetch(:advisory_locks, true)
         
     | 
| 
      
 141 
     | 
    
         
            +
                    )
         
     | 
| 
      
 142 
     | 
    
         
            +
                  end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                  def replica?
         
     | 
| 
      
 145 
     | 
    
         
            +
                    @config[:replica] || false
         
     | 
| 
      
 146 
     | 
    
         
            +
                  end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                  # Determines whether writes are currently being prevents.
         
     | 
| 
      
 149 
     | 
    
         
            +
                  #
         
     | 
| 
      
 150 
     | 
    
         
            +
                  # Returns true if the connection is a replica, or if +prevent_writes+
         
     | 
| 
      
 151 
     | 
    
         
            +
                  # is set to true.
         
     | 
| 
      
 152 
     | 
    
         
            +
                  def preventing_writes?
         
     | 
| 
      
 153 
     | 
    
         
            +
                    replica? || ActiveRecord::Base.connection_handler.prevent_writes
         
     | 
| 
       122 
154 
     | 
    
         
             
                  end
         
     | 
| 
       123 
155 
     | 
    
         | 
| 
       124 
156 
     | 
    
         
             
                  def migrations_paths # :nodoc:
         
     | 
| 
         @@ -126,19 +158,45 @@ module ActiveRecord 
     | 
|
| 
       126 
158 
     | 
    
         
             
                  end
         
     | 
| 
       127 
159 
     | 
    
         | 
| 
       128 
160 
     | 
    
         
             
                  def migration_context # :nodoc:
         
     | 
| 
       129 
     | 
    
         
            -
                    MigrationContext.new(migrations_paths)
         
     | 
| 
      
 161 
     | 
    
         
            +
                    MigrationContext.new(migrations_paths, schema_migration)
         
     | 
| 
      
 162 
     | 
    
         
            +
                  end
         
     | 
| 
      
 163 
     | 
    
         
            +
             
     | 
| 
      
 164 
     | 
    
         
            +
                  def schema_migration # :nodoc:
         
     | 
| 
      
 165 
     | 
    
         
            +
                    @schema_migration ||= begin
         
     | 
| 
      
 166 
     | 
    
         
            +
                                            conn = self
         
     | 
| 
      
 167 
     | 
    
         
            +
                                            spec_name = conn.pool.spec.name
         
     | 
| 
      
 168 
     | 
    
         
            +
                                            name = "#{spec_name}::SchemaMigration"
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
      
 170 
     | 
    
         
            +
                                            Class.new(ActiveRecord::SchemaMigration) do
         
     | 
| 
      
 171 
     | 
    
         
            +
                                              define_singleton_method(:name) { name }
         
     | 
| 
      
 172 
     | 
    
         
            +
                                              define_singleton_method(:to_s) { name }
         
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
      
 174 
     | 
    
         
            +
                                              self.connection_specification_name = spec_name
         
     | 
| 
      
 175 
     | 
    
         
            +
                                            end
         
     | 
| 
      
 176 
     | 
    
         
            +
                                          end
         
     | 
| 
      
 177 
     | 
    
         
            +
                  end
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
                  def prepared_statements
         
     | 
| 
      
 180 
     | 
    
         
            +
                    @prepared_statement_status.value
         
     | 
| 
       130 
181 
     | 
    
         
             
                  end
         
     | 
| 
       131 
182 
     | 
    
         | 
| 
       132 
183 
     | 
    
         
             
                  class Version
         
     | 
| 
       133 
184 
     | 
    
         
             
                    include Comparable
         
     | 
| 
       134 
185 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                     
     | 
| 
      
 186 
     | 
    
         
            +
                    attr_reader :full_version_string
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
                    def initialize(version_string, full_version_string = nil)
         
     | 
| 
       136 
189 
     | 
    
         
             
                      @version = version_string.split(".").map(&:to_i)
         
     | 
| 
      
 190 
     | 
    
         
            +
                      @full_version_string = full_version_string
         
     | 
| 
       137 
191 
     | 
    
         
             
                    end
         
     | 
| 
       138 
192 
     | 
    
         | 
| 
       139 
193 
     | 
    
         
             
                    def <=>(version_string)
         
     | 
| 
       140 
194 
     | 
    
         
             
                      @version <=> version_string.split(".").map(&:to_i)
         
     | 
| 
       141 
195 
     | 
    
         
             
                    end
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                    def to_s
         
     | 
| 
      
 198 
     | 
    
         
            +
                      @version.join(".")
         
     | 
| 
      
 199 
     | 
    
         
            +
                    end
         
     | 
| 
       142 
200 
     | 
    
         
             
                  end
         
     | 
| 
       143 
201 
     | 
    
         | 
| 
       144 
202 
     | 
    
         
             
                  def valid_type?(type) # :nodoc:
         
     | 
| 
         @@ -148,7 +206,7 @@ module ActiveRecord 
     | 
|
| 
       148 
206 
     | 
    
         
             
                  # this method must only be called while holding connection pool's mutex
         
     | 
| 
       149 
207 
     | 
    
         
             
                  def lease
         
     | 
| 
       150 
208 
     | 
    
         
             
                    if in_use?
         
     | 
| 
       151 
     | 
    
         
            -
                      msg = "Cannot lease connection, " 
     | 
| 
      
 209 
     | 
    
         
            +
                      msg = +"Cannot lease connection, "
         
     | 
| 
       152 
210 
     | 
    
         
             
                      if @owner == Thread.current
         
     | 
| 
       153 
211 
     | 
    
         
             
                        msg << "it is already leased by the current thread."
         
     | 
| 
       154 
212 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -161,9 +219,13 @@ module ActiveRecord 
     | 
|
| 
       161 
219 
     | 
    
         
             
                    @owner = Thread.current
         
     | 
| 
       162 
220 
     | 
    
         
             
                  end
         
     | 
| 
       163 
221 
     | 
    
         | 
| 
      
 222 
     | 
    
         
            +
                  def schema_cache
         
     | 
| 
      
 223 
     | 
    
         
            +
                    @pool.get_schema_cache(self)
         
     | 
| 
      
 224 
     | 
    
         
            +
                  end
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
       164 
226 
     | 
    
         
             
                  def schema_cache=(cache)
         
     | 
| 
       165 
227 
     | 
    
         
             
                    cache.connection = self
         
     | 
| 
       166 
     | 
    
         
            -
                    @ 
     | 
| 
      
 228 
     | 
    
         
            +
                    @pool.set_schema_cache(cache)
         
     | 
| 
       167 
229 
     | 
    
         
             
                  end
         
     | 
| 
       168 
230 
     | 
    
         | 
| 
       169 
231 
     | 
    
         
             
                  # this method must only be called while holding connection pool's mutex
         
     | 
| 
         @@ -202,10 +264,7 @@ module ActiveRecord 
     | 
|
| 
       202 
264 
     | 
    
         
             
                  end
         
     | 
| 
       203 
265 
     | 
    
         | 
| 
       204 
266 
     | 
    
         
             
                  def unprepared_statement
         
     | 
| 
       205 
     | 
    
         
            -
                     
     | 
| 
       206 
     | 
    
         
            -
                    yield
         
     | 
| 
       207 
     | 
    
         
            -
                  ensure
         
     | 
| 
       208 
     | 
    
         
            -
                    @prepared_statements = old_prepared_statements
         
     | 
| 
      
 267 
     | 
    
         
            +
                    @prepared_statement_status.bind(false) { yield }
         
     | 
| 
       209 
268 
     | 
    
         
             
                  end
         
     | 
| 
       210 
269 
     | 
    
         | 
| 
       211 
270 
     | 
    
         
             
                  # Returns the human-readable name of the adapter. Use mixed case - one
         
     | 
| 
         @@ -214,6 +273,11 @@ module ActiveRecord 
     | 
|
| 
       214 
273 
     | 
    
         
             
                    self.class::ADAPTER_NAME
         
     | 
| 
       215 
274 
     | 
    
         
             
                  end
         
     | 
| 
       216 
275 
     | 
    
         | 
| 
      
 276 
     | 
    
         
            +
                  # Does the database for this adapter exist?
         
     | 
| 
      
 277 
     | 
    
         
            +
                  def self.database_exists?(config)
         
     | 
| 
      
 278 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
      
 279 
     | 
    
         
            +
                  end
         
     | 
| 
      
 280 
     | 
    
         
            +
             
     | 
| 
       217 
281 
     | 
    
         
             
                  # Does this adapter support DDL rollbacks in transactions? That is, would
         
     | 
| 
       218 
282 
     | 
    
         
             
                  # CREATE TABLE or ALTER TABLE get rolled back by a transaction?
         
     | 
| 
       219 
283 
     | 
    
         
             
                  def supports_ddl_transactions?
         
     | 
| 
         @@ -292,12 +356,18 @@ module ActiveRecord 
     | 
|
| 
       292 
356 
     | 
    
         
             
                  def supports_foreign_keys_in_create?
         
     | 
| 
       293 
357 
     | 
    
         
             
                    supports_foreign_keys?
         
     | 
| 
       294 
358 
     | 
    
         
             
                  end
         
     | 
| 
      
 359 
     | 
    
         
            +
                  deprecate :supports_foreign_keys_in_create?
         
     | 
| 
       295 
360 
     | 
    
         | 
| 
       296 
361 
     | 
    
         
             
                  # Does this adapter support views?
         
     | 
| 
       297 
362 
     | 
    
         
             
                  def supports_views?
         
     | 
| 
       298 
363 
     | 
    
         
             
                    false
         
     | 
| 
       299 
364 
     | 
    
         
             
                  end
         
     | 
| 
       300 
365 
     | 
    
         | 
| 
      
 366 
     | 
    
         
            +
                  # Does this adapter support materialized views?
         
     | 
| 
      
 367 
     | 
    
         
            +
                  def supports_materialized_views?
         
     | 
| 
      
 368 
     | 
    
         
            +
                    false
         
     | 
| 
      
 369 
     | 
    
         
            +
                  end
         
     | 
| 
      
 370 
     | 
    
         
            +
             
     | 
| 
       301 
371 
     | 
    
         
             
                  # Does this adapter support datetime with precision?
         
     | 
| 
       302 
372 
     | 
    
         
             
                  def supports_datetime_with_precision?
         
     | 
| 
       303 
373 
     | 
    
         
             
                    false
         
     | 
| 
         @@ -322,6 +392,7 @@ module ActiveRecord 
     | 
|
| 
       322 
392 
     | 
    
         
             
                  def supports_multi_insert?
         
     | 
| 
       323 
393 
     | 
    
         
             
                    true
         
     | 
| 
       324 
394 
     | 
    
         
             
                  end
         
     | 
| 
      
 395 
     | 
    
         
            +
                  deprecate :supports_multi_insert?
         
     | 
| 
       325 
396 
     | 
    
         | 
| 
       326 
397 
     | 
    
         
             
                  # Does this adapter support virtual columns?
         
     | 
| 
       327 
398 
     | 
    
         
             
                  def supports_virtual_columns?
         
     | 
| 
         @@ -333,6 +404,31 @@ module ActiveRecord 
     | 
|
| 
       333 
404 
     | 
    
         
             
                    false
         
     | 
| 
       334 
405 
     | 
    
         
             
                  end
         
     | 
| 
       335 
406 
     | 
    
         | 
| 
      
 407 
     | 
    
         
            +
                  # Does this adapter support optimizer hints?
         
     | 
| 
      
 408 
     | 
    
         
            +
                  def supports_optimizer_hints?
         
     | 
| 
      
 409 
     | 
    
         
            +
                    false
         
     | 
| 
      
 410 
     | 
    
         
            +
                  end
         
     | 
| 
      
 411 
     | 
    
         
            +
             
     | 
| 
      
 412 
     | 
    
         
            +
                  def supports_lazy_transactions?
         
     | 
| 
      
 413 
     | 
    
         
            +
                    false
         
     | 
| 
      
 414 
     | 
    
         
            +
                  end
         
     | 
| 
      
 415 
     | 
    
         
            +
             
     | 
| 
      
 416 
     | 
    
         
            +
                  def supports_insert_returning?
         
     | 
| 
      
 417 
     | 
    
         
            +
                    false
         
     | 
| 
      
 418 
     | 
    
         
            +
                  end
         
     | 
| 
      
 419 
     | 
    
         
            +
             
     | 
| 
      
 420 
     | 
    
         
            +
                  def supports_insert_on_duplicate_skip?
         
     | 
| 
      
 421 
     | 
    
         
            +
                    false
         
     | 
| 
      
 422 
     | 
    
         
            +
                  end
         
     | 
| 
      
 423 
     | 
    
         
            +
             
     | 
| 
      
 424 
     | 
    
         
            +
                  def supports_insert_on_duplicate_update?
         
     | 
| 
      
 425 
     | 
    
         
            +
                    false
         
     | 
| 
      
 426 
     | 
    
         
            +
                  end
         
     | 
| 
      
 427 
     | 
    
         
            +
             
     | 
| 
      
 428 
     | 
    
         
            +
                  def supports_insert_conflict_target?
         
     | 
| 
      
 429 
     | 
    
         
            +
                    false
         
     | 
| 
      
 430 
     | 
    
         
            +
                  end
         
     | 
| 
      
 431 
     | 
    
         
            +
             
     | 
| 
       336 
432 
     | 
    
         
             
                  # This is meant to be implemented by the adapters that support extensions
         
     | 
| 
       337 
433 
     | 
    
         
             
                  def disable_extension(name)
         
     | 
| 
       338 
434 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -341,6 +437,10 @@ module ActiveRecord 
     | 
|
| 
       341 
437 
     | 
    
         
             
                  def enable_extension(name)
         
     | 
| 
       342 
438 
     | 
    
         
             
                  end
         
     | 
| 
       343 
439 
     | 
    
         | 
| 
      
 440 
     | 
    
         
            +
                  def advisory_locks_enabled? # :nodoc:
         
     | 
| 
      
 441 
     | 
    
         
            +
                    supports_advisory_locks? && @advisory_locks_enabled
         
     | 
| 
      
 442 
     | 
    
         
            +
                  end
         
     | 
| 
      
 443 
     | 
    
         
            +
             
     | 
| 
       344 
444 
     | 
    
         
             
                  # This is meant to be implemented by the adapters that support advisory
         
     | 
| 
       345 
445 
     | 
    
         
             
                  # locks
         
     | 
| 
       346 
446 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -406,6 +506,9 @@ module ActiveRecord 
     | 
|
| 
       406 
506 
     | 
    
         
             
                    #
         
     | 
| 
       407 
507 
     | 
    
         
             
                    # Prevent @connection's finalizer from touching the socket, or
         
     | 
| 
       408 
508 
     | 
    
         
             
                    # otherwise communicating with its server, when it is collected.
         
     | 
| 
      
 509 
     | 
    
         
            +
                    if schema_cache.connection == self
         
     | 
| 
      
 510 
     | 
    
         
            +
                      schema_cache.connection = nil
         
     | 
| 
      
 511 
     | 
    
         
            +
                    end
         
     | 
| 
       409 
512 
     | 
    
         
             
                  end
         
     | 
| 
       410 
513 
     | 
    
         | 
| 
       411 
514 
     | 
    
         
             
                  # Reset the state of this connection, directing the DBMS to clear
         
     | 
| 
         @@ -418,11 +521,9 @@ module ActiveRecord 
     | 
|
| 
       418 
521 
     | 
    
         
             
                    # this should be overridden by concrete adapters
         
     | 
| 
       419 
522 
     | 
    
         
             
                  end
         
     | 
| 
       420 
523 
     | 
    
         | 
| 
       421 
     | 
    
         
            -
                   
     | 
| 
       422 
     | 
    
         
            -
                  # Clear any caching the database adapter may be doing, for example
         
     | 
| 
       423 
     | 
    
         
            -
                  # clearing the prepared statement cache. This is database specific.
         
     | 
| 
      
 524 
     | 
    
         
            +
                  # Clear any caching the database adapter may be doing.
         
     | 
| 
       424 
525 
     | 
    
         
             
                  def clear_cache!
         
     | 
| 
       425 
     | 
    
         
            -
                     
     | 
| 
      
 526 
     | 
    
         
            +
                    @lock.synchronize { @statements.clear } if @statements
         
     | 
| 
       426 
527 
     | 
    
         
             
                  end
         
     | 
| 
       427 
528 
     | 
    
         | 
| 
       428 
529 
     | 
    
         
             
                  # Returns true if its required to reload the connection between requests for development mode.
         
     | 
| 
         @@ -444,18 +545,25 @@ module ActiveRecord 
     | 
|
| 
       444 
545 
     | 
    
         
             
                  # This is useful for when you need to call a proprietary method such as
         
     | 
| 
       445 
546 
     | 
    
         
             
                  # PostgreSQL's lo_* methods.
         
     | 
| 
       446 
547 
     | 
    
         
             
                  def raw_connection
         
     | 
| 
      
 548 
     | 
    
         
            +
                    disable_lazy_transactions!
         
     | 
| 
       447 
549 
     | 
    
         
             
                    @connection
         
     | 
| 
       448 
550 
     | 
    
         
             
                  end
         
     | 
| 
       449 
551 
     | 
    
         | 
| 
       450 
     | 
    
         
            -
                  def  
     | 
| 
       451 
     | 
    
         
            -
                     
     | 
| 
      
 552 
     | 
    
         
            +
                  def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
         
     | 
| 
      
 553 
     | 
    
         
            +
                    attribute.eq(value)
         
     | 
| 
      
 554 
     | 
    
         
            +
                  end
         
     | 
| 
      
 555 
     | 
    
         
            +
             
     | 
| 
      
 556 
     | 
    
         
            +
                  def case_sensitive_comparison(attribute, value) # :nodoc:
         
     | 
| 
      
 557 
     | 
    
         
            +
                    attribute.eq(value)
         
     | 
| 
       452 
558 
     | 
    
         
             
                  end
         
     | 
| 
       453 
559 
     | 
    
         | 
| 
       454 
     | 
    
         
            -
                  def case_insensitive_comparison( 
     | 
| 
      
 560 
     | 
    
         
            +
                  def case_insensitive_comparison(attribute, value) # :nodoc:
         
     | 
| 
      
 561 
     | 
    
         
            +
                    column = column_for_attribute(attribute)
         
     | 
| 
      
 562 
     | 
    
         
            +
             
     | 
| 
       455 
563 
     | 
    
         
             
                    if can_perform_case_insensitive_comparison_for?(column)
         
     | 
| 
       456 
     | 
    
         
            -
                       
     | 
| 
      
 564 
     | 
    
         
            +
                      attribute.lower.eq(attribute.relation.lower(value))
         
     | 
| 
       457 
565 
     | 
    
         
             
                    else
         
     | 
| 
       458 
     | 
    
         
            -
                       
     | 
| 
      
 566 
     | 
    
         
            +
                      attribute.eq(value)
         
     | 
| 
       459 
567 
     | 
    
         
             
                    end
         
     | 
| 
       460 
568 
     | 
    
         
             
                  end
         
     | 
| 
       461 
569 
     | 
    
         | 
| 
         @@ -470,18 +578,38 @@ module ActiveRecord 
     | 
|
| 
       470 
578 
     | 
    
         
             
                  end
         
     | 
| 
       471 
579 
     | 
    
         | 
| 
       472 
580 
     | 
    
         
             
                  def column_name_for_operation(operation, node) # :nodoc:
         
     | 
| 
       473 
     | 
    
         
            -
                     
     | 
| 
       474 
     | 
    
         
            -
                  end
         
     | 
| 
       475 
     | 
    
         
            -
             
     | 
| 
       476 
     | 
    
         
            -
                  def column_name_from_arel_node(node) # :nodoc:
         
     | 
| 
       477 
     | 
    
         
            -
                    visitor.accept(node, Arel::Collectors::SQLString.new).value
         
     | 
| 
      
 581 
     | 
    
         
            +
                    visitor.compile(node)
         
     | 
| 
       478 
582 
     | 
    
         
             
                  end
         
     | 
| 
       479 
583 
     | 
    
         | 
| 
       480 
584 
     | 
    
         
             
                  def default_index_type?(index) # :nodoc:
         
     | 
| 
       481 
585 
     | 
    
         
             
                    index.using.nil?
         
     | 
| 
       482 
586 
     | 
    
         
             
                  end
         
     | 
| 
       483 
587 
     | 
    
         | 
| 
      
 588 
     | 
    
         
            +
                  # Called by ActiveRecord::InsertAll,
         
     | 
| 
      
 589 
     | 
    
         
            +
                  # Passed an instance of ActiveRecord::InsertAll::Builder,
         
     | 
| 
      
 590 
     | 
    
         
            +
                  # This method implements standard bulk inserts for all databases, but
         
     | 
| 
      
 591 
     | 
    
         
            +
                  # should be overridden by adapters to implement common features with
         
     | 
| 
      
 592 
     | 
    
         
            +
                  # non-standard syntax like handling duplicates or returning values.
         
     | 
| 
      
 593 
     | 
    
         
            +
                  def build_insert_sql(insert) # :nodoc:
         
     | 
| 
      
 594 
     | 
    
         
            +
                    if insert.skip_duplicates? || insert.update_duplicates?
         
     | 
| 
      
 595 
     | 
    
         
            +
                      raise NotImplementedError, "#{self.class} should define `build_insert_sql` to implement adapter-specific logic for handling duplicates during INSERT"
         
     | 
| 
      
 596 
     | 
    
         
            +
                    end
         
     | 
| 
      
 597 
     | 
    
         
            +
             
     | 
| 
      
 598 
     | 
    
         
            +
                    "INSERT #{insert.into} #{insert.values_list}"
         
     | 
| 
      
 599 
     | 
    
         
            +
                  end
         
     | 
| 
      
 600 
     | 
    
         
            +
             
     | 
| 
      
 601 
     | 
    
         
            +
                  def get_database_version # :nodoc:
         
     | 
| 
      
 602 
     | 
    
         
            +
                  end
         
     | 
| 
      
 603 
     | 
    
         
            +
             
     | 
| 
      
 604 
     | 
    
         
            +
                  def database_version # :nodoc:
         
     | 
| 
      
 605 
     | 
    
         
            +
                    schema_cache.database_version
         
     | 
| 
      
 606 
     | 
    
         
            +
                  end
         
     | 
| 
      
 607 
     | 
    
         
            +
             
     | 
| 
      
 608 
     | 
    
         
            +
                  def check_version # :nodoc:
         
     | 
| 
      
 609 
     | 
    
         
            +
                  end
         
     | 
| 
      
 610 
     | 
    
         
            +
             
     | 
| 
       484 
611 
     | 
    
         
             
                  private
         
     | 
| 
      
 612 
     | 
    
         
            +
             
     | 
| 
       485 
613 
     | 
    
         
             
                    def type_map
         
     | 
| 
       486 
614 
     | 
    
         
             
                      @type_map ||= Type::TypeMap.new.tap do |mapping|
         
     | 
| 
       487 
615 
     | 
    
         
             
                        initialize_type_map(mapping)
         
     | 
| 
         @@ -555,14 +683,12 @@ module ActiveRecord 
     | 
|
| 
       555 
683 
     | 
    
         
             
                      $1.to_i if sql_type =~ /\((.*)\)/
         
     | 
| 
       556 
684 
     | 
    
         
             
                    end
         
     | 
| 
       557 
685 
     | 
    
         | 
| 
       558 
     | 
    
         
            -
                    def translate_exception_class(e, sql)
         
     | 
| 
       559 
     | 
    
         
            -
                       
     | 
| 
       560 
     | 
    
         
            -
                        message = "#{e.class.name}: #{e.message}: #{sql}"
         
     | 
| 
       561 
     | 
    
         
            -
                      rescue Encoding::CompatibilityError
         
     | 
| 
       562 
     | 
    
         
            -
                        message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
         
     | 
| 
       563 
     | 
    
         
            -
                      end
         
     | 
| 
      
 686 
     | 
    
         
            +
                    def translate_exception_class(e, sql, binds)
         
     | 
| 
      
 687 
     | 
    
         
            +
                      message = "#{e.class.name}: #{e.message}"
         
     | 
| 
       564 
688 
     | 
    
         | 
| 
       565 
     | 
    
         
            -
                      exception = translate_exception( 
     | 
| 
      
 689 
     | 
    
         
            +
                      exception = translate_exception(
         
     | 
| 
      
 690 
     | 
    
         
            +
                        e, message: message, sql: sql, binds: binds
         
     | 
| 
      
 691 
     | 
    
         
            +
                      )
         
     | 
| 
       566 
692 
     | 
    
         
             
                      exception.set_backtrace e.backtrace
         
     | 
| 
       567 
693 
     | 
    
         
             
                      exception
         
     | 
| 
       568 
694 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -575,24 +701,23 @@ module ActiveRecord 
     | 
|
| 
       575 
701 
     | 
    
         
             
                        binds:             binds,
         
     | 
| 
       576 
702 
     | 
    
         
             
                        type_casted_binds: type_casted_binds,
         
     | 
| 
       577 
703 
     | 
    
         
             
                        statement_name:    statement_name,
         
     | 
| 
       578 
     | 
    
         
            -
                        connection_id:     object_id 
     | 
| 
       579 
     | 
    
         
            -
                         
     | 
| 
       580 
     | 
    
         
            -
             
     | 
| 
       581 
     | 
    
         
            -
             
     | 
| 
       582 
     | 
    
         
            -
                          end
         
     | 
| 
       583 
     | 
    
         
            -
                        rescue => e
         
     | 
| 
       584 
     | 
    
         
            -
                          raise translate_exception_class(e, sql)
         
     | 
| 
      
 704 
     | 
    
         
            +
                        connection_id:     object_id,
         
     | 
| 
      
 705 
     | 
    
         
            +
                        connection:        self) do
         
     | 
| 
      
 706 
     | 
    
         
            +
                        @lock.synchronize do
         
     | 
| 
      
 707 
     | 
    
         
            +
                          yield
         
     | 
| 
       585 
708 
     | 
    
         
             
                        end
         
     | 
| 
      
 709 
     | 
    
         
            +
                      rescue => e
         
     | 
| 
      
 710 
     | 
    
         
            +
                        raise translate_exception_class(e, sql, binds)
         
     | 
| 
       586 
711 
     | 
    
         
             
                      end
         
     | 
| 
       587 
712 
     | 
    
         
             
                    end
         
     | 
| 
       588 
713 
     | 
    
         | 
| 
       589 
     | 
    
         
            -
                    def translate_exception(exception, message)
         
     | 
| 
      
 714 
     | 
    
         
            +
                    def translate_exception(exception, message:, sql:, binds:)
         
     | 
| 
       590 
715 
     | 
    
         
             
                      # override in derived class
         
     | 
| 
       591 
716 
     | 
    
         
             
                      case exception
         
     | 
| 
       592 
717 
     | 
    
         
             
                      when RuntimeError
         
     | 
| 
       593 
718 
     | 
    
         
             
                        exception
         
     | 
| 
       594 
719 
     | 
    
         
             
                      else
         
     | 
| 
       595 
     | 
    
         
            -
                        ActiveRecord::StatementInvalid.new(message)
         
     | 
| 
      
 720 
     | 
    
         
            +
                        ActiveRecord::StatementInvalid.new(message, sql: sql, binds: binds)
         
     | 
| 
       596 
721 
     | 
    
         
             
                      end
         
     | 
| 
       597 
722 
     | 
    
         
             
                    end
         
     | 
| 
       598 
723 
     | 
    
         | 
| 
         @@ -606,6 +731,11 @@ module ActiveRecord 
     | 
|
| 
       606 
731 
     | 
    
         
             
                        raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
         
     | 
| 
       607 
732 
     | 
    
         
             
                    end
         
     | 
| 
       608 
733 
     | 
    
         | 
| 
      
 734 
     | 
    
         
            +
                    def column_for_attribute(attribute)
         
     | 
| 
      
 735 
     | 
    
         
            +
                      table_name = attribute.relation.name
         
     | 
| 
      
 736 
     | 
    
         
            +
                      schema_cache.columns_hash(table_name)[attribute.name.to_s]
         
     | 
| 
      
 737 
     | 
    
         
            +
                    end
         
     | 
| 
      
 738 
     | 
    
         
            +
             
     | 
| 
       609 
739 
     | 
    
         
             
                    def collector
         
     | 
| 
       610 
740 
     | 
    
         
             
                      if prepared_statements
         
     | 
| 
       611 
741 
     | 
    
         
             
                        Arel::Collectors::Composite.new(
         
     | 
| 
         @@ -623,6 +753,9 @@ module ActiveRecord 
     | 
|
| 
       623 
753 
     | 
    
         
             
                    def arel_visitor
         
     | 
| 
       624 
754 
     | 
    
         
             
                      Arel::Visitors::ToSql.new(self)
         
     | 
| 
       625 
755 
     | 
    
         
             
                    end
         
     | 
| 
      
 756 
     | 
    
         
            +
             
     | 
| 
      
 757 
     | 
    
         
            +
                    def build_statement_pool
         
     | 
| 
      
 758 
     | 
    
         
            +
                    end
         
     | 
| 
       626 
759 
     | 
    
         
             
                end
         
     | 
| 
       627 
760 
     | 
    
         
             
              end
         
     | 
| 
       628 
761 
     | 
    
         
             
            end
         
     |