activerecord 5.0.6 → 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +638 -2023
- data/MIT-LICENSE +3 -1
- data/README.rdoc +8 -6
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/aggregations.rb +249 -246
- data/lib/active_record/association_relation.rb +24 -13
- data/lib/active_record/associations/alias_tracker.rb +24 -33
- data/lib/active_record/associations/association.rb +119 -56
- data/lib/active_record/associations/association_scope.rb +94 -94
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +42 -61
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +80 -252
- data/lib/active_record/associations/collection_proxy.rb +158 -121
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -29
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -90
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
- data/lib/active_record/associations/join_dependency.rb +134 -176
- data/lib/active_record/associations/preloader/association.rb +84 -125
- data/lib/active_record/associations/preloader/through_association.rb +82 -75
- data/lib/active_record/associations/preloader.rb +90 -102
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +26 -14
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -60
- data/lib/active_record/attribute_decorators.rb +38 -15
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -7
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +86 -91
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +21 -49
- data/lib/active_record/attribute_methods/serialization.rb +30 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -64
- data/lib/active_record/attribute_methods/write.rb +35 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -24
- data/lib/active_record/autosave_association.rb +53 -32
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +63 -33
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -11
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +553 -321
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +213 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -28
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -27
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +207 -126
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +369 -199
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +363 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +405 -551
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -138
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +143 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -22
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +50 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +49 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +22 -7
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +60 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -10
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -17
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +31 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +35 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +380 -300
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +10 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +382 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +74 -19
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +254 -262
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -7
- data/lib/active_record/connection_handling.rb +159 -40
- data/lib/active_record/core.rb +202 -162
- data/lib/active_record/counter_cache.rb +57 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +79 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -86
- data/lib/active_record/enum.rb +60 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -3
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +195 -502
- data/lib/active_record/gem_version.rb +4 -2
- data/lib/active_record/inheritance.rb +151 -97
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +15 -18
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +78 -87
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/migration/command_recorder.rb +143 -97
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -6
- data/lib/active_record/migration.rb +367 -300
- data/lib/active_record/model_schema.rb +145 -139
- data/lib/active_record/nested_attributes.rb +214 -201
- data/lib/active_record/no_touching.rb +10 -1
- data/lib/active_record/null_relation.rb +13 -34
- data/lib/active_record/persistence.rb +442 -72
- data/lib/active_record/query_cache.rb +15 -14
- data/lib/active_record/querying.rb +36 -23
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +309 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +211 -249
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +99 -52
- data/lib/active_record/relation/calculations.rb +211 -172
- data/lib/active_record/relation/delegation.rb +67 -65
- data/lib/active_record/relation/finder_methods.rb +208 -247
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +78 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +86 -104
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +458 -329
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -7
- data/lib/active_record/relation/where_clause.rb +111 -95
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +429 -318
- data/lib/active_record/result.rb +69 -39
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +15 -5
- data/lib/active_record/scoping/default.rb +93 -95
- data/lib/active_record/scoping/named.rb +45 -25
- data/lib/active_record/scoping.rb +20 -19
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +4 -1
- data/lib/active_record/table_metadata.rb +26 -20
- data/lib/active_record/tasks/database_tasks.rb +276 -85
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -90
- data/lib/active_record/tasks/postgresql_database_tasks.rb +78 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +34 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +70 -35
- data/lib/active_record/touch_later.rb +7 -4
- data/lib/active_record/transactions.rb +133 -149
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -45
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -8
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +2 -1
- data/lib/active_record/type/type_map.rb +13 -15
- data/lib/active_record/type/unsigned_integer.rb +17 -0
- data/lib/active_record/type.rb +23 -17
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -1
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -4
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +36 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +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/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/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +58 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -29
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +133 -50
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -130
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,31 +1,30 @@
|
|
1
|
-
|
2
|
-
require 'active_record/connection_adapters/mysql/database_statements'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
require
|
6
|
-
|
3
|
+
require "active_record/connection_adapters/abstract_mysql_adapter"
|
4
|
+
require "active_record/connection_adapters/mysql/database_statements"
|
5
|
+
|
6
|
+
gem "mysql2", ">= 0.4.4"
|
7
|
+
require "mysql2"
|
7
8
|
|
8
9
|
module ActiveRecord
|
9
10
|
module ConnectionHandling # :nodoc:
|
11
|
+
ER_BAD_DB_ERROR = 1049
|
12
|
+
|
10
13
|
# Establishes a connection to the database that's used by all Active Record objects.
|
11
14
|
def mysql2_connection(config)
|
12
15
|
config = config.symbolize_keys
|
13
|
-
|
14
|
-
config[:username] = 'root' if config[:username].nil?
|
15
16
|
config[:flags] ||= 0
|
16
17
|
|
17
|
-
if
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
config[:flags] |= Mysql2::Client::FOUND_ROWS
|
22
|
-
end
|
18
|
+
if config[:flags].kind_of? Array
|
19
|
+
config[:flags].push "FOUND_ROWS"
|
20
|
+
else
|
21
|
+
config[:flags] |= Mysql2::Client::FOUND_ROWS
|
23
22
|
end
|
24
23
|
|
25
24
|
client = Mysql2::Client.new(config)
|
26
25
|
ConnectionAdapters::Mysql2Adapter.new(client, logger, nil, config)
|
27
26
|
rescue Mysql2::Error => error
|
28
|
-
if error.
|
27
|
+
if error.error_number == ER_BAD_DB_ERROR
|
29
28
|
raise ActiveRecord::NoDatabaseError
|
30
29
|
else
|
31
30
|
raise
|
@@ -35,18 +34,24 @@ module ActiveRecord
|
|
35
34
|
|
36
35
|
module ConnectionAdapters
|
37
36
|
class Mysql2Adapter < AbstractMysqlAdapter
|
38
|
-
ADAPTER_NAME =
|
37
|
+
ADAPTER_NAME = "Mysql2"
|
39
38
|
|
40
39
|
include MySQL::DatabaseStatements
|
41
40
|
|
42
41
|
def initialize(connection, logger, connection_options, config)
|
43
|
-
|
44
|
-
|
42
|
+
superclass_config = config.reverse_merge(prepared_statements: false)
|
43
|
+
super(connection, logger, connection_options, superclass_config)
|
45
44
|
configure_connection
|
46
45
|
end
|
47
46
|
|
47
|
+
def self.database_exists?(config)
|
48
|
+
!!ActiveRecord::Base.mysql2_connection(config)
|
49
|
+
rescue ActiveRecord::NoDatabaseError
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
48
53
|
def supports_json?
|
49
|
-
!mariadb? &&
|
54
|
+
!mariadb? && database_version >= "5.7.8"
|
50
55
|
end
|
51
56
|
|
52
57
|
def supports_comments?
|
@@ -61,11 +66,15 @@ module ActiveRecord
|
|
61
66
|
true
|
62
67
|
end
|
63
68
|
|
69
|
+
def supports_lazy_transactions?
|
70
|
+
true
|
71
|
+
end
|
72
|
+
|
64
73
|
# HELPER METHODS ===========================================
|
65
74
|
|
66
75
|
def each_hash(result) # :nodoc:
|
67
76
|
if block_given?
|
68
|
-
result.each(:
|
77
|
+
result.each(as: :hash, symbolize_keys: true) do |row|
|
69
78
|
yield row
|
70
79
|
end
|
71
80
|
else
|
@@ -107,21 +116,31 @@ module ActiveRecord
|
|
107
116
|
@connection.close
|
108
117
|
end
|
109
118
|
|
119
|
+
def discard! # :nodoc:
|
120
|
+
super
|
121
|
+
@connection.automatic_close = false
|
122
|
+
@connection = nil
|
123
|
+
end
|
124
|
+
|
110
125
|
private
|
111
126
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
127
|
+
def connect
|
128
|
+
@connection = Mysql2::Client.new(@config)
|
129
|
+
configure_connection
|
130
|
+
end
|
116
131
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
132
|
+
def configure_connection
|
133
|
+
@connection.query_options[:as] = :array
|
134
|
+
super
|
135
|
+
end
|
121
136
|
|
122
|
-
|
123
|
-
|
124
|
-
|
137
|
+
def full_version
|
138
|
+
schema_cache.database_version.full_version_string
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_full_version
|
142
|
+
@connection.server_info[:version]
|
143
|
+
end
|
125
144
|
end
|
126
145
|
end
|
127
146
|
end
|
@@ -1,15 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
module PostgreSQL
|
6
|
+
class Column < ConnectionAdapters::Column # :nodoc:
|
7
|
+
delegate :oid, :fmod, to: :sql_type_metadata
|
8
|
+
|
9
|
+
def initialize(*, serial: nil, **)
|
10
|
+
super
|
11
|
+
@serial = serial
|
12
|
+
end
|
13
|
+
|
14
|
+
def serial?
|
15
|
+
@serial
|
16
|
+
end
|
7
17
|
|
8
|
-
|
9
|
-
|
18
|
+
def array
|
19
|
+
sql_type_metadata.sql_type.end_with?("[]")
|
20
|
+
end
|
21
|
+
alias :array? :array
|
10
22
|
|
11
|
-
|
23
|
+
def sql_type
|
24
|
+
super.sub(/\[\]\z/, "")
|
25
|
+
end
|
12
26
|
end
|
13
27
|
end
|
28
|
+
PostgreSQLColumn = PostgreSQL::Column # :nodoc:
|
14
29
|
end
|
15
30
|
end
|
@@ -1,38 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
4
6
|
module DatabaseStatements
|
5
7
|
def explain(arel, binds = [])
|
6
8
|
sql = "EXPLAIN #{to_sql(arel, binds)}"
|
7
|
-
PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query(sql,
|
8
|
-
end
|
9
|
-
|
10
|
-
def select_value(arel, name = nil, binds = [])
|
11
|
-
arel, binds = binds_from_relation arel, binds
|
12
|
-
sql = to_sql(arel, binds)
|
13
|
-
execute_and_clear(sql, name, binds) do |result|
|
14
|
-
result.getvalue(0, 0) if result.ntuples > 0 && result.nfields > 0
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def select_values(arel, name = nil, binds = [])
|
19
|
-
arel, binds = binds_from_relation arel, binds
|
20
|
-
sql = to_sql(arel, binds)
|
21
|
-
execute_and_clear(sql, name, binds) do |result|
|
22
|
-
if result.nfields > 0
|
23
|
-
result.column_values(0)
|
24
|
-
else
|
25
|
-
[]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Executes a SELECT query and returns an array of rows. Each row is an
|
31
|
-
# array of field values.
|
32
|
-
def select_rows(sql, name = nil, binds = [])
|
33
|
-
execute_and_clear(sql, name, binds) do |result|
|
34
|
-
result.values
|
35
|
-
end
|
9
|
+
PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", binds))
|
36
10
|
end
|
37
11
|
|
38
12
|
# The internal PostgreSQL identifier of the money data type.
|
@@ -74,9 +48,9 @@ module ActiveRecord
|
|
74
48
|
# (2) $12.345.678,12
|
75
49
|
case data
|
76
50
|
when /^-?\D+[\d,]+\.\d{2}$/ # (1)
|
77
|
-
data.gsub!(/[^-\d.]/,
|
51
|
+
data.gsub!(/[^-\d.]/, "")
|
78
52
|
when /^-?\D+[\d.]+,\d{2}$/ # (2)
|
79
|
-
data.gsub!(/[^-\d,]/,
|
53
|
+
data.gsub!(/[^-\d,]/, "").sub!(/,/, ".")
|
80
54
|
end
|
81
55
|
end
|
82
56
|
end
|
@@ -84,22 +58,43 @@ module ActiveRecord
|
|
84
58
|
|
85
59
|
# Queries the database and returns the results in an Array-like object
|
86
60
|
def query(sql, name = nil) #:nodoc:
|
61
|
+
materialize_transactions
|
62
|
+
|
87
63
|
log(sql, name) do
|
88
|
-
|
64
|
+
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
|
65
|
+
result_as_array @connection.async_exec(sql)
|
66
|
+
end
|
89
67
|
end
|
90
68
|
end
|
91
69
|
|
92
|
-
|
93
|
-
|
94
|
-
#
|
95
|
-
|
70
|
+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
|
71
|
+
:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :with
|
72
|
+
) # :nodoc:
|
73
|
+
private_constant :READ_QUERY
|
74
|
+
|
75
|
+
def write_query?(sql) # :nodoc:
|
76
|
+
!READ_QUERY.match?(sql)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Executes an SQL statement, returning a PG::Result object on success
|
80
|
+
# or raising a PG::Error exception otherwise.
|
81
|
+
# Note: the PG::Result object is manually memory managed; if you don't
|
82
|
+
# need it specifically, you may want consider the <tt>exec_query</tt> wrapper.
|
96
83
|
def execute(sql, name = nil)
|
84
|
+
if preventing_writes? && write_query?(sql)
|
85
|
+
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
|
86
|
+
end
|
87
|
+
|
88
|
+
materialize_transactions
|
89
|
+
|
97
90
|
log(sql, name) do
|
98
|
-
|
91
|
+
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
|
92
|
+
@connection.async_exec(sql)
|
93
|
+
end
|
99
94
|
end
|
100
95
|
end
|
101
96
|
|
102
|
-
def exec_query(sql, name =
|
97
|
+
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
103
98
|
execute_and_clear(sql, name, binds, prepare: prepare) do |result|
|
104
99
|
types = {}
|
105
100
|
fields = result.fields
|
@@ -112,38 +107,41 @@ module ActiveRecord
|
|
112
107
|
end
|
113
108
|
end
|
114
109
|
|
115
|
-
def exec_delete(sql, name =
|
116
|
-
execute_and_clear(sql, name, binds) {|result| result.cmd_tuples }
|
110
|
+
def exec_delete(sql, name = nil, binds = [])
|
111
|
+
execute_and_clear(sql, name, binds) { |result| result.cmd_tuples }
|
117
112
|
end
|
118
113
|
alias :exec_update :exec_delete
|
119
114
|
|
120
|
-
def sql_for_insert(sql, pk,
|
115
|
+
def sql_for_insert(sql, pk, binds) # :nodoc:
|
121
116
|
if pk.nil?
|
122
117
|
# Extract the table from the insert sql. Yuck.
|
123
118
|
table_ref = extract_table_ref_from_insert_sql(sql)
|
124
119
|
pk = primary_key(table_ref) if table_ref
|
125
120
|
end
|
126
121
|
|
127
|
-
pk = suppress_composite_primary_key(pk)
|
128
|
-
|
129
|
-
if pk && use_insert_returning?
|
122
|
+
if pk = suppress_composite_primary_key(pk)
|
130
123
|
sql = "#{sql} RETURNING #{quote_column_name(pk)}"
|
131
124
|
end
|
132
125
|
|
133
126
|
super
|
134
127
|
end
|
128
|
+
private :sql_for_insert
|
135
129
|
|
136
|
-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
137
|
-
|
138
|
-
|
130
|
+
def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
|
131
|
+
if use_insert_returning? || pk == false
|
132
|
+
super
|
133
|
+
else
|
134
|
+
result = exec_query(sql, name, binds)
|
139
135
|
unless sequence_name
|
140
136
|
table_ref = extract_table_ref_from_insert_sql(sql)
|
141
|
-
|
142
|
-
|
137
|
+
if table_ref
|
138
|
+
pk = primary_key(table_ref) if pk.nil?
|
139
|
+
pk = suppress_composite_primary_key(pk)
|
140
|
+
sequence_name = default_sequence_name(table_ref, pk)
|
141
|
+
end
|
142
|
+
return result unless sequence_name
|
143
143
|
end
|
144
144
|
last_insert_id_result(sequence_name)
|
145
|
-
else
|
146
|
-
val
|
147
145
|
end
|
148
146
|
end
|
149
147
|
|
@@ -168,10 +166,18 @@ module ActiveRecord
|
|
168
166
|
end
|
169
167
|
|
170
168
|
private
|
169
|
+
def build_truncate_statements(*table_names)
|
170
|
+
"TRUNCATE TABLE #{table_names.map(&method(:quote_table_name)).join(", ")}"
|
171
|
+
end
|
171
172
|
|
172
|
-
|
173
|
-
|
174
|
-
|
173
|
+
# Returns the current ID of a table's sequence.
|
174
|
+
def last_insert_id_result(sequence_name)
|
175
|
+
exec_query("SELECT currval(#{quote(sequence_name)})", "SQL")
|
176
|
+
end
|
177
|
+
|
178
|
+
def suppress_composite_primary_key(pk)
|
179
|
+
pk unless pk.is_a?(Array)
|
180
|
+
end
|
175
181
|
end
|
176
182
|
end
|
177
183
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
@@ -26,12 +28,12 @@ module ActiveRecord
|
|
26
28
|
pp = []
|
27
29
|
|
28
30
|
pp << header.center(width).rstrip
|
29
|
-
pp <<
|
31
|
+
pp << "-" * width
|
30
32
|
|
31
|
-
pp += lines.map {|line| " #{line}"}
|
33
|
+
pp += lines.map { |line| " #{line}" }
|
32
34
|
|
33
35
|
nrows = result.rows.length
|
34
|
-
rows_label = nrows == 1 ?
|
36
|
+
rows_label = nrows == 1 ? "row" : "rows"
|
35
37
|
pp << "(#{nrows} #{rows_label})"
|
36
38
|
|
37
39
|
pp.join("\n") + "\n"
|
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
4
6
|
module OID # :nodoc:
|
5
7
|
class Array < Type::Value # :nodoc:
|
6
|
-
include Type::Helpers::Mutable
|
8
|
+
include ActiveModel::Type::Helpers::Mutable
|
7
9
|
|
8
10
|
Data = Struct.new(:encoder, :values) # :nodoc:
|
9
11
|
|
10
12
|
attr_reader :subtype, :delimiter
|
11
|
-
delegate :type, :user_input_in_time_zone, :limit, to: :subtype
|
13
|
+
delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype
|
12
14
|
|
13
|
-
def initialize(subtype, delimiter =
|
15
|
+
def initialize(subtype, delimiter = ",")
|
14
16
|
@subtype = subtype
|
15
17
|
@delimiter = delimiter
|
16
18
|
|
@@ -31,7 +33,13 @@ module ActiveRecord
|
|
31
33
|
|
32
34
|
def cast(value)
|
33
35
|
if value.is_a?(::String)
|
34
|
-
value =
|
36
|
+
value = begin
|
37
|
+
@pg_decoder.decode(value)
|
38
|
+
rescue TypeError
|
39
|
+
# malformed array string is treated as [], will raise in PG 2.0 gem
|
40
|
+
# this keeps a consistent implementation
|
41
|
+
[]
|
42
|
+
end
|
35
43
|
end
|
36
44
|
type_cast_array(value, :cast)
|
37
45
|
end
|
@@ -64,15 +72,19 @@ module ActiveRecord
|
|
64
72
|
deserialize(raw_old_value) != new_value
|
65
73
|
end
|
66
74
|
|
75
|
+
def force_equality?(value)
|
76
|
+
value.is_a?(::Array)
|
77
|
+
end
|
78
|
+
|
67
79
|
private
|
68
80
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
81
|
+
def type_cast_array(value, method)
|
82
|
+
if value.is_a?(::Array)
|
83
|
+
value.map { |item| type_cast_array(item, method) }
|
84
|
+
else
|
85
|
+
@subtype.public_send(method, value)
|
86
|
+
end
|
74
87
|
end
|
75
|
-
end
|
76
88
|
end
|
77
89
|
end
|
78
90
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
@@ -34,16 +36,15 @@ module ActiveRecord
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def binary?
|
37
|
-
/\A[01]*\Z
|
39
|
+
/\A[01]*\Z/.match?(value)
|
38
40
|
end
|
39
41
|
|
40
42
|
def hex?
|
41
|
-
/\A[0-9A-F]*\Z/i
|
43
|
+
/\A[0-9A-F]*\Z/i.match?(value)
|
42
44
|
end
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
attr_reader :value
|
46
|
+
private
|
47
|
+
attr_reader :value
|
47
48
|
end
|
48
49
|
end
|
49
50
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module PostgreSQL
|
6
|
+
module OID # :nodoc:
|
7
|
+
class Date < Type::Date # :nodoc:
|
8
|
+
def cast_value(value)
|
9
|
+
case value
|
10
|
+
when "infinity" then ::Float::INFINITY
|
11
|
+
when "-infinity" then -::Float::INFINITY
|
12
|
+
when / BC$/
|
13
|
+
astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
|
14
|
+
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
@@ -5,8 +7,8 @@ module ActiveRecord
|
|
5
7
|
class DateTime < Type::DateTime # :nodoc:
|
6
8
|
def cast_value(value)
|
7
9
|
case value
|
8
|
-
when
|
9
|
-
when
|
10
|
+
when "infinity" then ::Float::INFINITY
|
11
|
+
when "-infinity" then -::Float::INFINITY
|
10
12
|
when / BC$/
|
11
13
|
astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
|
12
14
|
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
4
6
|
module OID # :nodoc:
|
5
7
|
class Decimal < Type::Decimal # :nodoc:
|
6
8
|
def infinity(options = {})
|
7
|
-
BigDecimal
|
9
|
+
BigDecimal("Infinity") * (options[:negative] ? -1 : 1)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
@@ -9,9 +11,9 @@ module ActiveRecord
|
|
9
11
|
|
10
12
|
private
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
def cast_value(value)
|
15
|
+
value.to_s
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
4
6
|
module OID # :nodoc:
|
5
7
|
class Hstore < Type::Value # :nodoc:
|
6
|
-
include Type::Helpers::Mutable
|
8
|
+
include ActiveModel::Type::Helpers::Mutable
|
7
9
|
|
8
10
|
def type
|
9
11
|
:hstore
|
@@ -12,8 +14,8 @@ module ActiveRecord
|
|
12
14
|
def deserialize(value)
|
13
15
|
if value.is_a?(::String)
|
14
16
|
::Hash[value.scan(HstorePair).map { |k, v|
|
15
|
-
v = v.upcase ==
|
16
|
-
k = k.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
|
17
|
+
v = v.upcase == "NULL" ? nil : v.gsub(/\A"(.*)"\Z/m, '\1').gsub(/\\(.)/, '\1')
|
18
|
+
k = k.gsub(/\A"(.*)"\Z/m, '\1').gsub(/\\(.)/, '\1')
|
17
19
|
[k, v]
|
18
20
|
}]
|
19
21
|
else
|
@@ -23,7 +25,7 @@ module ActiveRecord
|
|
23
25
|
|
24
26
|
def serialize(value)
|
25
27
|
if value.is_a?(::Hash)
|
26
|
-
value.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(
|
28
|
+
value.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(", ")
|
27
29
|
elsif value.respond_to?(:to_unsafe_h)
|
28
30
|
serialize(value.to_unsafe_h)
|
29
31
|
else
|
@@ -45,23 +47,23 @@ module ActiveRecord
|
|
45
47
|
|
46
48
|
private
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
HstorePair = begin
|
51
|
+
quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"/
|
52
|
+
unquoted_string = /(?:\\.|[^\s,])[^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
|
53
|
+
/(#{quoted_string}|#{unquoted_string})\s*=>\s*(#{quoted_string}|#{unquoted_string})/
|
54
|
+
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
else
|
58
|
-
if value == ""
|
59
|
-
'""'
|
56
|
+
def escape_hstore(value)
|
57
|
+
if value.nil?
|
58
|
+
"NULL"
|
60
59
|
else
|
61
|
-
|
60
|
+
if value == ""
|
61
|
+
'""'
|
62
|
+
else
|
63
|
+
'"%s"' % value.to_s.gsub(/(["\\])/, '\\\\\1')
|
64
|
+
end
|
62
65
|
end
|
63
66
|
end
|
64
|
-
end
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
@@ -1,21 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters
|
3
5
|
module PostgreSQL
|
4
6
|
module OID # :nodoc:
|
5
|
-
class Jsonb < Json # :nodoc:
|
7
|
+
class Jsonb < Type::Json # :nodoc:
|
6
8
|
def type
|
7
9
|
:jsonb
|
8
10
|
end
|
9
|
-
|
10
|
-
def changed_in_place?(raw_old_value, new_value)
|
11
|
-
# Postgres does not preserve insignificant whitespaces when
|
12
|
-
# round-tripping jsonb columns. This causes some false positives for
|
13
|
-
# the comparison here. Therefore, we need to parse and re-dump the
|
14
|
-
# raw value here to ensure the insignificant whitespaces are
|
15
|
-
# consistent with our encoder's output.
|
16
|
-
raw_old_value = serialize(deserialize(raw_old_value))
|
17
|
-
super(raw_old_value, new_value)
|
18
|
-
end
|
19
11
|
end
|
20
12
|
end
|
21
13
|
end
|