omg-activerecord 8.0.0.alpha1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +355 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +219 -0
- data/examples/performance.rb +185 -0
- data/examples/simple.rb +15 -0
- data/lib/active_record/aggregations.rb +287 -0
- data/lib/active_record/association_relation.rb +50 -0
- data/lib/active_record/associations/alias_tracker.rb +90 -0
- data/lib/active_record/associations/association.rb +417 -0
- data/lib/active_record/associations/association_scope.rb +175 -0
- data/lib/active_record/associations/belongs_to_association.rb +163 -0
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
- data/lib/active_record/associations/builder/association.rb +170 -0
- data/lib/active_record/associations/builder/belongs_to.rb +160 -0
- data/lib/active_record/associations/builder/collection_association.rb +80 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
- data/lib/active_record/associations/builder/has_many.rb +23 -0
- data/lib/active_record/associations/builder/has_one.rb +61 -0
- data/lib/active_record/associations/builder/singular_association.rb +48 -0
- data/lib/active_record/associations/collection_association.rb +535 -0
- data/lib/active_record/associations/collection_proxy.rb +1163 -0
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +40 -0
- data/lib/active_record/associations/has_many_association.rb +167 -0
- data/lib/active_record/associations/has_many_through_association.rb +232 -0
- data/lib/active_record/associations/has_one_association.rb +142 -0
- data/lib/active_record/associations/has_one_through_association.rb +45 -0
- data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
- data/lib/active_record/associations/join_dependency.rb +301 -0
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +316 -0
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +150 -0
- data/lib/active_record/associations/preloader.rb +135 -0
- data/lib/active_record/associations/singular_association.rb +76 -0
- data/lib/active_record/associations/through_association.rb +132 -0
- data/lib/active_record/associations.rb +1897 -0
- data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
- data/lib/active_record/attribute_assignment.rb +82 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +262 -0
- data/lib/active_record/attribute_methods/primary_key.rb +158 -0
- data/lib/active_record/attribute_methods/query.rb +50 -0
- data/lib/active_record/attribute_methods/read.rb +46 -0
- data/lib/active_record/attribute_methods/serialization.rb +232 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
- data/lib/active_record/attribute_methods/write.rb +49 -0
- data/lib/active_record/attribute_methods.rb +542 -0
- data/lib/active_record/attributes.rb +307 -0
- data/lib/active_record/autosave_association.rb +586 -0
- data/lib/active_record/base.rb +338 -0
- data/lib/active_record/callbacks.rb +452 -0
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +15 -0
- data/lib/active_record/coders/yaml_column.rb +95 -0
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
- data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
- data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
- data/lib/active_record/connection_adapters/column.rb +122 -0
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
- data/lib/active_record/connection_adapters/pool_config.rb +83 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
- data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
- data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
- data/lib/active_record/connection_adapters.rb +176 -0
- data/lib/active_record/connection_handling.rb +413 -0
- data/lib/active_record/core.rb +836 -0
- data/lib/active_record/counter_cache.rb +230 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
- data/lib/active_record/database_configurations/database_config.rb +104 -0
- data/lib/active_record/database_configurations/hash_config.rb +172 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +309 -0
- data/lib/active_record/delegated_type.rb +289 -0
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +38 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +121 -0
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +70 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +177 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +107 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +424 -0
- data/lib/active_record/errors.rb +614 -0
- data/lib/active_record/explain.rb +63 -0
- data/lib/active_record/explain_registry.rb +37 -0
- data/lib/active_record/explain_subscriber.rb +34 -0
- data/lib/active_record/fixture_set/file.rb +89 -0
- data/lib/active_record/fixture_set/model_metadata.rb +42 -0
- data/lib/active_record/fixture_set/render_context.rb +19 -0
- data/lib/active_record/fixture_set/table_row.rb +208 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +850 -0
- data/lib/active_record/future_result.rb +182 -0
- data/lib/active_record/gem_version.rb +17 -0
- data/lib/active_record/inheritance.rb +366 -0
- data/lib/active_record/insert_all.rb +328 -0
- data/lib/active_record/integration.rb +209 -0
- data/lib/active_record/internal_metadata.rb +164 -0
- data/lib/active_record/legacy_yaml_adapter.rb +15 -0
- data/lib/active_record/locale/en.yml +48 -0
- data/lib/active_record/locking/optimistic.rb +228 -0
- data/lib/active_record/locking/pessimistic.rb +102 -0
- data/lib/active_record/log_subscriber.rb +149 -0
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +87 -0
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +406 -0
- data/lib/active_record/migration/compatibility.rb +490 -0
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +16 -0
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +1626 -0
- data/lib/active_record/model_schema.rb +635 -0
- data/lib/active_record/nested_attributes.rb +633 -0
- data/lib/active_record/no_touching.rb +65 -0
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +968 -0
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +56 -0
- data/lib/active_record/query_logs.rb +247 -0
- data/lib/active_record/query_logs_formatter.rb +30 -0
- data/lib/active_record/querying.rb +122 -0
- data/lib/active_record/railtie.rb +440 -0
- data/lib/active_record/railties/console_sandbox.rb +5 -0
- data/lib/active_record/railties/controller_runtime.rb +65 -0
- data/lib/active_record/railties/databases.rake +641 -0
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +66 -0
- data/lib/active_record/reflection.rb +1287 -0
- data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
- data/lib/active_record/relation/batches.rb +491 -0
- data/lib/active_record/relation/calculations.rb +679 -0
- data/lib/active_record/relation/delegation.rb +154 -0
- data/lib/active_record/relation/finder_methods.rb +661 -0
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +192 -0
- data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
- data/lib/active_record/relation/predicate_builder.rb +181 -0
- data/lib/active_record/relation/query_attribute.rb +68 -0
- data/lib/active_record/relation/query_methods.rb +2235 -0
- data/lib/active_record/relation/record_fetch_warning.rb +52 -0
- data/lib/active_record/relation/spawn_methods.rb +78 -0
- data/lib/active_record/relation/where_clause.rb +218 -0
- data/lib/active_record/relation.rb +1495 -0
- data/lib/active_record/result.rb +249 -0
- data/lib/active_record/runtime_registry.rb +82 -0
- data/lib/active_record/sanitization.rb +254 -0
- data/lib/active_record/schema.rb +77 -0
- data/lib/active_record/schema_dumper.rb +364 -0
- data/lib/active_record/schema_migration.rb +106 -0
- data/lib/active_record/scoping/default.rb +205 -0
- data/lib/active_record/scoping/named.rb +202 -0
- data/lib/active_record/scoping.rb +136 -0
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +66 -0
- data/lib/active_record/serialization.rb +29 -0
- data/lib/active_record/signed_id.rb +137 -0
- data/lib/active_record/statement_cache.rb +164 -0
- data/lib/active_record/store.rb +299 -0
- data/lib/active_record/suppressor.rb +59 -0
- data/lib/active_record/table_metadata.rb +85 -0
- data/lib/active_record/tasks/database_tasks.rb +681 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +321 -0
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +177 -0
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +70 -0
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +523 -0
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/type/adapter_specific_registry.rb +144 -0
- data/lib/active_record/type/date.rb +9 -0
- data/lib/active_record/type/date_time.rb +9 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
- data/lib/active_record/type/internal/timezone.rb +22 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +76 -0
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +35 -0
- data/lib/active_record/type/type_map.rb +58 -0
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +83 -0
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +65 -0
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/numericality.rb +36 -0
- data/lib/active_record/validations/presence.rb +45 -0
- data/lib/active_record/validations/uniqueness.rb +295 -0
- data/lib/active_record/validations.rb +101 -0
- data/lib/active_record/version.rb +10 -0
- data/lib/active_record.rb +616 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +33 -0
- data/lib/arel/collectors/bind.rb +31 -0
- data/lib/arel/collectors/composite.rb +46 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +48 -0
- data/lib/arel/delete_manager.rb +32 -0
- data/lib/arel/errors.rb +19 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +53 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +48 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +125 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +44 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +45 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +68 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/nary.rb +39 -0
- data/lib/arel/nodes/node.rb +161 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +32 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +35 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +46 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +75 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +260 -0
- data/lib/arel/select_manager.rb +276 -0
- data/lib/arel/table.rb +121 -0
- data/lib/arel/tree_manager.rb +65 -0
- data/lib/arel/update_manager.rb +49 -0
- data/lib/arel/visitors/dot.rb +299 -0
- data/lib/arel/visitors/mysql.rb +111 -0
- data/lib/arel/visitors/postgresql.rb +99 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +1033 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +73 -0
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
- data/lib/rails/generators/active_record/migration.rb +54 -0
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- data/lib/rails/generators/active_record.rb +19 -0
- metadata +505 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
module PostgreSQL
|
|
6
|
+
module Quoting
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
|
10
|
+
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
|
11
|
+
|
|
12
|
+
module ClassMethods # :nodoc:
|
|
13
|
+
def column_name_matcher
|
|
14
|
+
/
|
|
15
|
+
\A
|
|
16
|
+
(
|
|
17
|
+
(?:
|
|
18
|
+
# "schema_name"."table_name"."column_name"::type_name | function(one or no argument)::type_name
|
|
19
|
+
((?:\w+\.|"\w+"\.){,2}(?:\w+|"\w+")(?:::\w+)? | \w+\((?:|\g<2>)\)(?:::\w+)?)
|
|
20
|
+
)
|
|
21
|
+
(?:(?:\s+AS)?\s+(?:\w+|"\w+"))?
|
|
22
|
+
)
|
|
23
|
+
(?:\s*,\s*\g<1>)*
|
|
24
|
+
\z
|
|
25
|
+
/ix
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def column_name_with_order_matcher
|
|
29
|
+
/
|
|
30
|
+
\A
|
|
31
|
+
(
|
|
32
|
+
(?:
|
|
33
|
+
# "schema_name"."table_name"."column_name"::type_name | function(one or no argument)::type_name
|
|
34
|
+
((?:\w+\.|"\w+"\.){,2}(?:\w+|"\w+")(?:::\w+)? | \w+\((?:|\g<2>)\)(?:::\w+)?)
|
|
35
|
+
)
|
|
36
|
+
(?:\s+COLLATE\s+"\w+")?
|
|
37
|
+
(?:\s+ASC|\s+DESC)?
|
|
38
|
+
(?:\s+NULLS\s+(?:FIRST|LAST))?
|
|
39
|
+
)
|
|
40
|
+
(?:\s*,\s*\g<1>)*
|
|
41
|
+
\z
|
|
42
|
+
/ix
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Quotes column names for use in SQL queries.
|
|
46
|
+
def quote_column_name(name) # :nodoc:
|
|
47
|
+
QUOTED_COLUMN_NAMES[name] ||= PG::Connection.quote_ident(name.to_s).freeze
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Checks the following cases:
|
|
51
|
+
#
|
|
52
|
+
# - table_name
|
|
53
|
+
# - "table.name"
|
|
54
|
+
# - schema_name.table_name
|
|
55
|
+
# - schema_name."table.name"
|
|
56
|
+
# - "schema.name".table_name
|
|
57
|
+
# - "schema.name"."table.name"
|
|
58
|
+
def quote_table_name(name) # :nodoc:
|
|
59
|
+
QUOTED_TABLE_NAMES[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted.freeze
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class IntegerOutOf64BitRange < StandardError
|
|
64
|
+
def initialize(msg)
|
|
65
|
+
super(msg)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Escapes binary strings for bytea input to the database.
|
|
70
|
+
def escape_bytea(value)
|
|
71
|
+
valid_raw_connection.escape_bytea(value) if value
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Unescapes bytea output from a database to the binary string it represents.
|
|
75
|
+
# NOTE: This is NOT an inverse of escape_bytea! This is only to be used
|
|
76
|
+
# on escaped binary output from database drive.
|
|
77
|
+
def unescape_bytea(value)
|
|
78
|
+
valid_raw_connection.unescape_bytea(value) if value
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def check_int_in_range(value)
|
|
82
|
+
if value.to_int > 9223372036854775807 || value.to_int < -9223372036854775808
|
|
83
|
+
exception = <<~ERROR
|
|
84
|
+
Provided value outside of the range of a signed 64bit integer.
|
|
85
|
+
|
|
86
|
+
PostgreSQL will treat the column type in question as a numeric.
|
|
87
|
+
This may result in a slow sequential scan due to a comparison
|
|
88
|
+
being performed between an integer or bigint value and a numeric value.
|
|
89
|
+
|
|
90
|
+
To allow for this potentially unwanted behavior, set
|
|
91
|
+
ActiveRecord.raise_int_wider_than_64bit to false.
|
|
92
|
+
ERROR
|
|
93
|
+
raise IntegerOutOf64BitRange.new exception
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def quote(value) # :nodoc:
|
|
98
|
+
if ActiveRecord.raise_int_wider_than_64bit && value.is_a?(Integer)
|
|
99
|
+
check_int_in_range(value)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
case value
|
|
103
|
+
when OID::Xml::Data
|
|
104
|
+
"xml '#{quote_string(value.to_s)}'"
|
|
105
|
+
when OID::Bit::Data
|
|
106
|
+
if value.binary?
|
|
107
|
+
"B'#{value}'"
|
|
108
|
+
elsif value.hex?
|
|
109
|
+
"X'#{value}'"
|
|
110
|
+
end
|
|
111
|
+
when Numeric
|
|
112
|
+
if value.finite?
|
|
113
|
+
super
|
|
114
|
+
else
|
|
115
|
+
"'#{value}'"
|
|
116
|
+
end
|
|
117
|
+
when OID::Array::Data
|
|
118
|
+
quote(encode_array(value))
|
|
119
|
+
when Range
|
|
120
|
+
quote(encode_range(value))
|
|
121
|
+
else
|
|
122
|
+
super
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Quotes strings for use in SQL input.
|
|
127
|
+
def quote_string(s) # :nodoc:
|
|
128
|
+
with_raw_connection(allow_retry: true, materialize_transactions: false) do |connection|
|
|
129
|
+
connection.escape(s)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def quote_table_name_for_assignment(table, attr)
|
|
134
|
+
quote_column_name(attr)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Quotes schema names for use in SQL queries.
|
|
138
|
+
def quote_schema_name(schema_name)
|
|
139
|
+
quote_column_name(schema_name)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Quote date/time values for use in SQL input.
|
|
143
|
+
def quoted_date(value) # :nodoc:
|
|
144
|
+
if value.year <= 0
|
|
145
|
+
bce_year = format("%04d", -value.year + 1)
|
|
146
|
+
super.sub(/^-?\d+/, bce_year) + " BC"
|
|
147
|
+
else
|
|
148
|
+
super
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def quoted_binary(value) # :nodoc:
|
|
153
|
+
"'#{escape_bytea(value.to_s)}'"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def quote_default_expression(value, column) # :nodoc:
|
|
157
|
+
if value.is_a?(Proc)
|
|
158
|
+
value.call
|
|
159
|
+
elsif column.type == :uuid && value.is_a?(String) && value.include?("()")
|
|
160
|
+
value # Does not quote function default values for UUID columns
|
|
161
|
+
elsif column.respond_to?(:array?)
|
|
162
|
+
type = lookup_cast_type_from_column(column)
|
|
163
|
+
quote(type.serialize(value))
|
|
164
|
+
else
|
|
165
|
+
super
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def type_cast(value) # :nodoc:
|
|
170
|
+
case value
|
|
171
|
+
when Type::Binary::Data
|
|
172
|
+
# Return a bind param hash with format as binary.
|
|
173
|
+
# See https://deveiate.org/code/pg/PG/Connection.html#method-i-exec_prepared-doc
|
|
174
|
+
# for more information
|
|
175
|
+
{ value: value.to_s, format: 1 }
|
|
176
|
+
when OID::Xml::Data, OID::Bit::Data
|
|
177
|
+
value.to_s
|
|
178
|
+
when OID::Array::Data
|
|
179
|
+
encode_array(value)
|
|
180
|
+
when Range
|
|
181
|
+
encode_range(value)
|
|
182
|
+
when Rational
|
|
183
|
+
value.to_f
|
|
184
|
+
else
|
|
185
|
+
super
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def lookup_cast_type_from_column(column) # :nodoc:
|
|
190
|
+
verify! if type_map.nil?
|
|
191
|
+
type_map.lookup(column.oid, column.fmod, column.sql_type)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
private
|
|
195
|
+
def lookup_cast_type(sql_type)
|
|
196
|
+
super(query_value("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA").to_i)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def encode_array(array_data)
|
|
200
|
+
encoder = array_data.encoder
|
|
201
|
+
values = type_cast_array(array_data.values)
|
|
202
|
+
|
|
203
|
+
result = encoder.encode(values)
|
|
204
|
+
if encoding = determine_encoding_of_strings_in_array(values)
|
|
205
|
+
result.force_encoding(encoding)
|
|
206
|
+
end
|
|
207
|
+
result
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def encode_range(range)
|
|
211
|
+
"[#{type_cast_range_value(range.begin)},#{type_cast_range_value(range.end)}#{range.exclude_end? ? ')' : ']'}"
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def determine_encoding_of_strings_in_array(value)
|
|
215
|
+
case value
|
|
216
|
+
when ::Array then determine_encoding_of_strings_in_array(value.first)
|
|
217
|
+
when ::String then value.encoding
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def type_cast_array(values)
|
|
222
|
+
case values
|
|
223
|
+
when ::Array then values.map { |item| type_cast_array(item) }
|
|
224
|
+
else type_cast(values)
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def type_cast_range_value(value)
|
|
229
|
+
infinity?(value) ? "" : type_cast(value)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def infinity?(value)
|
|
233
|
+
value.respond_to?(:infinite?) && value.infinite?
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
module PostgreSQL
|
|
6
|
+
module ReferentialIntegrity # :nodoc:
|
|
7
|
+
def disable_referential_integrity # :nodoc:
|
|
8
|
+
original_exception = nil
|
|
9
|
+
|
|
10
|
+
begin
|
|
11
|
+
transaction(requires_new: true) do
|
|
12
|
+
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} DISABLE TRIGGER ALL" }.join(";"))
|
|
13
|
+
end
|
|
14
|
+
rescue ActiveRecord::ActiveRecordError => e
|
|
15
|
+
original_exception = e
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
yield
|
|
20
|
+
rescue ActiveRecord::InvalidForeignKey => e
|
|
21
|
+
warn <<-WARNING
|
|
22
|
+
WARNING: Rails was not able to disable referential integrity.
|
|
23
|
+
|
|
24
|
+
This is most likely caused due to missing permissions.
|
|
25
|
+
Rails needs superuser privileges to disable referential integrity.
|
|
26
|
+
|
|
27
|
+
cause: #{original_exception&.message}
|
|
28
|
+
|
|
29
|
+
WARNING
|
|
30
|
+
raise e
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
begin
|
|
34
|
+
transaction(requires_new: true) do
|
|
35
|
+
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} ENABLE TRIGGER ALL" }.join(";"))
|
|
36
|
+
end
|
|
37
|
+
rescue ActiveRecord::ActiveRecordError
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def check_all_foreign_keys_valid! # :nodoc:
|
|
42
|
+
sql = <<~SQL
|
|
43
|
+
do $$
|
|
44
|
+
declare r record;
|
|
45
|
+
BEGIN
|
|
46
|
+
FOR r IN (
|
|
47
|
+
SELECT FORMAT(
|
|
48
|
+
'UPDATE pg_constraint SET convalidated=false WHERE conname = ''%I'' AND connamespace::regnamespace = ''%I''::regnamespace; ALTER TABLE %I.%I VALIDATE CONSTRAINT %I;',
|
|
49
|
+
constraint_name,
|
|
50
|
+
table_schema,
|
|
51
|
+
table_schema,
|
|
52
|
+
table_name,
|
|
53
|
+
constraint_name
|
|
54
|
+
) AS constraint_check
|
|
55
|
+
FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY'
|
|
56
|
+
)
|
|
57
|
+
LOOP
|
|
58
|
+
EXECUTE (r.constraint_check);
|
|
59
|
+
END LOOP;
|
|
60
|
+
END;
|
|
61
|
+
$$;
|
|
62
|
+
SQL
|
|
63
|
+
|
|
64
|
+
transaction(requires_new: true) do
|
|
65
|
+
execute(sql)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
module PostgreSQL
|
|
6
|
+
class SchemaCreation < SchemaCreation # :nodoc:
|
|
7
|
+
private
|
|
8
|
+
delegate :quoted_include_columns_for_index, to: :@conn
|
|
9
|
+
|
|
10
|
+
def visit_AlterTable(o)
|
|
11
|
+
sql = super
|
|
12
|
+
sql << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
|
|
13
|
+
sql << o.exclusion_constraint_adds.map { |con| visit_AddExclusionConstraint con }.join(" ")
|
|
14
|
+
sql << o.exclusion_constraint_drops.map { |con| visit_DropExclusionConstraint con }.join(" ")
|
|
15
|
+
sql << o.unique_constraint_adds.map { |con| visit_AddUniqueConstraint con }.join(" ")
|
|
16
|
+
sql << o.unique_constraint_drops.map { |con| visit_DropUniqueConstraint con }.join(" ")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def visit_AddForeignKey(o)
|
|
20
|
+
super.dup.tap do |sql|
|
|
21
|
+
sql << " NOT VALID" unless o.validate?
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def visit_ForeignKeyDefinition(o)
|
|
26
|
+
super.dup.tap do |sql|
|
|
27
|
+
sql << " DEFERRABLE INITIALLY #{o.deferrable.to_s.upcase}" if o.deferrable
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def visit_CheckConstraintDefinition(o)
|
|
32
|
+
super.dup.tap { |sql| sql << " NOT VALID" unless o.validate? }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def visit_ValidateConstraint(name)
|
|
36
|
+
"VALIDATE CONSTRAINT #{quote_column_name(name)}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def visit_ExclusionConstraintDefinition(o)
|
|
40
|
+
sql = ["CONSTRAINT"]
|
|
41
|
+
sql << quote_column_name(o.name)
|
|
42
|
+
sql << "EXCLUDE"
|
|
43
|
+
sql << "USING #{o.using}" if o.using
|
|
44
|
+
sql << "(#{o.expression})"
|
|
45
|
+
sql << "WHERE (#{o.where})" if o.where
|
|
46
|
+
sql << "DEFERRABLE INITIALLY #{o.deferrable.to_s.upcase}" if o.deferrable
|
|
47
|
+
|
|
48
|
+
sql.join(" ")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def visit_UniqueConstraintDefinition(o)
|
|
52
|
+
column_name = Array(o.column).map { |column| quote_column_name(column) }.join(", ")
|
|
53
|
+
|
|
54
|
+
sql = ["CONSTRAINT"]
|
|
55
|
+
sql << quote_column_name(o.name)
|
|
56
|
+
sql << "UNIQUE"
|
|
57
|
+
|
|
58
|
+
if o.using_index
|
|
59
|
+
sql << "USING INDEX #{quote_column_name(o.using_index)}"
|
|
60
|
+
else
|
|
61
|
+
sql << "(#{column_name})"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if o.deferrable
|
|
65
|
+
sql << "DEFERRABLE INITIALLY #{o.deferrable.to_s.upcase}"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
sql.join(" ")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def visit_AddExclusionConstraint(o)
|
|
72
|
+
"ADD #{accept(o)}"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def visit_DropExclusionConstraint(name)
|
|
76
|
+
"DROP CONSTRAINT #{quote_column_name(name)}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def visit_AddUniqueConstraint(o)
|
|
80
|
+
"ADD #{accept(o)}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def visit_DropUniqueConstraint(name)
|
|
84
|
+
"DROP CONSTRAINT #{quote_column_name(name)}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def visit_ChangeColumnDefinition(o)
|
|
88
|
+
column = o.column
|
|
89
|
+
column.sql_type = type_to_sql(column.type, **column.options)
|
|
90
|
+
quoted_column_name = quote_column_name(o.name)
|
|
91
|
+
|
|
92
|
+
change_column_sql = +"ALTER COLUMN #{quoted_column_name} TYPE #{column.sql_type}"
|
|
93
|
+
|
|
94
|
+
options = column_options(column)
|
|
95
|
+
|
|
96
|
+
if options[:collation]
|
|
97
|
+
change_column_sql << " COLLATE \"#{options[:collation]}\""
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if options[:using]
|
|
101
|
+
change_column_sql << " USING #{options[:using]}"
|
|
102
|
+
elsif options[:cast_as]
|
|
103
|
+
cast_as_type = type_to_sql(options[:cast_as], **options)
|
|
104
|
+
change_column_sql << " USING CAST(#{quoted_column_name} AS #{cast_as_type})"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
if options.key?(:default)
|
|
108
|
+
if options[:default].nil?
|
|
109
|
+
change_column_sql << ", ALTER COLUMN #{quoted_column_name} DROP DEFAULT"
|
|
110
|
+
else
|
|
111
|
+
quoted_default = quote_default_expression(options[:default], column)
|
|
112
|
+
change_column_sql << ", ALTER COLUMN #{quoted_column_name} SET DEFAULT #{quoted_default}"
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if options.key?(:null)
|
|
117
|
+
change_column_sql << ", ALTER COLUMN #{quoted_column_name} #{options[:null] ? 'DROP' : 'SET'} NOT NULL"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
change_column_sql
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def visit_ChangeColumnDefaultDefinition(o)
|
|
124
|
+
sql = +"ALTER COLUMN #{quote_column_name(o.column.name)} "
|
|
125
|
+
if o.default.nil?
|
|
126
|
+
sql << "DROP DEFAULT"
|
|
127
|
+
else
|
|
128
|
+
sql << "SET DEFAULT #{quote_default_expression(o.default, o.column)}"
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def add_column_options!(sql, options)
|
|
133
|
+
if options[:collation]
|
|
134
|
+
sql << " COLLATE \"#{options[:collation]}\""
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
if as = options[:as]
|
|
138
|
+
sql << " GENERATED ALWAYS AS (#{as})"
|
|
139
|
+
|
|
140
|
+
if options[:stored]
|
|
141
|
+
sql << " STORED"
|
|
142
|
+
else
|
|
143
|
+
raise ArgumentError, <<~MSG
|
|
144
|
+
PostgreSQL currently does not support VIRTUAL (not persisted) generated columns.
|
|
145
|
+
Specify 'stored: true' option for '#{options[:column].name}'
|
|
146
|
+
MSG
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
super
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def quoted_include_columns(o)
|
|
153
|
+
String === o ? o : quoted_include_columns_for_index(o)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Returns any SQL string to go between CREATE and TABLE. May be nil.
|
|
157
|
+
def table_modifier_in_create(o)
|
|
158
|
+
# A table cannot be both TEMPORARY and UNLOGGED, since all TEMPORARY
|
|
159
|
+
# tables are already UNLOGGED.
|
|
160
|
+
if o.temporary
|
|
161
|
+
" TEMPORARY"
|
|
162
|
+
elsif o.unlogged
|
|
163
|
+
" UNLOGGED"
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|