sequel 5.8.0 → 5.38.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.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
data/doc/postgresql.rdoc
CHANGED
|
@@ -63,6 +63,14 @@ into the Database instance:
|
|
|
63
63
|
DB.extension :pg_array
|
|
64
64
|
Sequel.extension :pg_array_ops
|
|
65
65
|
|
|
66
|
+
With regard to common database types, please note that the generic String type
|
|
67
|
+
is +text+ on PostgreSQL and not <tt>varchar(255)</tt> as it is on some other
|
|
68
|
+
databases. +text+ is PostgreSQL's recommended type for storage of text data,
|
|
69
|
+
and is more similar to Ruby's String type as it allows for unlimited length.
|
|
70
|
+
If you want to set a maximum size for a text column, you must specify a
|
|
71
|
+
<tt>:size</tt> option. This will use a <tt>varchar($size)</tt> type and
|
|
72
|
+
impose a maximum size for the column.
|
|
73
|
+
|
|
66
74
|
== PostgreSQL-specific DDL Support
|
|
67
75
|
|
|
68
76
|
=== Exclusion Constraints
|
|
@@ -131,6 +139,77 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
|
|
|
131
139
|
# ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
|
|
132
140
|
# USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
|
|
133
141
|
|
|
142
|
+
=== Creating Partitioned Tables
|
|
143
|
+
|
|
144
|
+
PostgreSQL allows marking tables as partitioned tables, and adding partitions to such tables. Sequel
|
|
145
|
+
offers support for this. You can create a partitioned table using the +:partition_by+ option and
|
|
146
|
+
+:partition_type+ options (the default partition type is range partitioning):
|
|
147
|
+
|
|
148
|
+
DB.create_table(:table1, partition_by: :column, partition_type: :range) do
|
|
149
|
+
Integer :id
|
|
150
|
+
Date :column
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
DB.create_table(:table2, partition_by: :column, partition_type: :list) do
|
|
154
|
+
Integer :id
|
|
155
|
+
String :column
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
DB.create_table(:table3, partition_by: :column, partition_type: :hash) do
|
|
159
|
+
Integer :id
|
|
160
|
+
Integer :column
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
To add partitions of other tables, you use the +:partition_of+ option. This option will use
|
|
164
|
+
a custom DSL specific to partitioning other tables. For range partitioning, you can use the
|
|
165
|
+
+from+ and +to+ methods to specify the inclusive beginning and exclusive ending of the
|
|
166
|
+
range of the partition. You can call the +minvalue+ and +maxvalue+ methods to get the minimum
|
|
167
|
+
and maximum values for the column(s) in the range, useful as arguments to +from+ and +to+:
|
|
168
|
+
|
|
169
|
+
DB.create_table(:table1a, partition_of: :table1) do
|
|
170
|
+
from minvalue
|
|
171
|
+
to 0
|
|
172
|
+
end
|
|
173
|
+
DB.create_table(:table1b, partition_of: :table1) do
|
|
174
|
+
from 0
|
|
175
|
+
to 100
|
|
176
|
+
end
|
|
177
|
+
DB.create_table(:table1c, partition_of: :table1) do
|
|
178
|
+
from 100
|
|
179
|
+
to maxvalue
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
For list partitioning, you use the +values_in+ method. You can also use the +default+ method
|
|
183
|
+
to mark a partition as the default partition:
|
|
184
|
+
|
|
185
|
+
DB.create_table(:table2a, partition_of: :table2) do
|
|
186
|
+
values_in 1, 2, 3
|
|
187
|
+
end
|
|
188
|
+
DB.create_table(:table2b, partition_of: :table2) do
|
|
189
|
+
values_in 4, 5, 6
|
|
190
|
+
end
|
|
191
|
+
DB.create_table(:table2c, partition_of: :table2) do
|
|
192
|
+
default
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
For hash partitioning, you use the +modulus+ and +remainder+ methods:
|
|
196
|
+
|
|
197
|
+
DB.create_table(:table3a, partition_of: :table3) do
|
|
198
|
+
modulus 3
|
|
199
|
+
remainder 0
|
|
200
|
+
end
|
|
201
|
+
DB.create_table(:table3b, partition_of: :table3) do
|
|
202
|
+
modulus 3
|
|
203
|
+
remainder 1
|
|
204
|
+
end
|
|
205
|
+
DB.create_table(:table3c, partition_of: :table3) do
|
|
206
|
+
modulus 3
|
|
207
|
+
remainder 2
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
There is currently no support for using custom column or table constraints in partitions of
|
|
211
|
+
other tables. Support may be added in the future.
|
|
212
|
+
|
|
134
213
|
=== Creating Unlogged Tables
|
|
135
214
|
|
|
136
215
|
PostgreSQL allows users to create unlogged tables, which are faster but not crash safe. Sequel
|
|
@@ -301,6 +380,18 @@ can pass an +:update+ option with a hash of values to update. You must pass eit
|
|
|
301
380
|
DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
302
381
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
303
382
|
# ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
383
|
+
|
|
384
|
+
If you want to update existing rows but using the current value of the column, you can build
|
|
385
|
+
the desired calculation using <tt>Sequel[]</tt>
|
|
386
|
+
|
|
387
|
+
DB[:table]
|
|
388
|
+
.insert_conflict(
|
|
389
|
+
target: :a,
|
|
390
|
+
update: {b: Sequel[:excluded][:b] + Sequel[:table][:a]}
|
|
391
|
+
)
|
|
392
|
+
.import([:a, :b], [ [1, 2] ])
|
|
393
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
394
|
+
# ON CONFLICT (a) DO UPDATE SET b = (excluded.b + table.a)
|
|
304
395
|
|
|
305
396
|
Additionally, if you only want to do the update in certain cases, you can specify an
|
|
306
397
|
+:update_where+ option, which will be used as a filter. If the row doesn't match the
|
|
@@ -321,12 +412,12 @@ Dataset#overriding_system_value and Dataset#overriding_user_value to use this ne
|
|
|
321
412
|
syntax:
|
|
322
413
|
|
|
323
414
|
DB.create_table(:table){primary_key :id}
|
|
324
|
-
# Ignore the given value for id, using the identity's sequence value
|
|
415
|
+
# Ignore the given value for id, using the identity's sequence value.
|
|
325
416
|
DB[:table].overriding_user_value.insert(:id=>1)
|
|
326
417
|
|
|
327
418
|
DB.create_table(:table){primary_key :id, :identity=>:always}
|
|
328
419
|
# Force the use of the given value for id, because otherwise the insert will
|
|
329
|
-
# raise an error, since GENERATED ALWAYS was
|
|
420
|
+
# raise an error, since GENERATED ALWAYS was used when creating the column.
|
|
330
421
|
DB[:table].overriding_system_value.insert(:id=>1)
|
|
331
422
|
|
|
332
423
|
=== Distinct On Specific Columns
|
|
@@ -337,6 +428,20 @@ rows that are distinct on just those columns:
|
|
|
337
428
|
DB[:table].distinct(:id).all
|
|
338
429
|
# SELECT DISTINCT ON ("id") * FROM "table"
|
|
339
430
|
|
|
431
|
+
=== Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
|
|
432
|
+
|
|
433
|
+
PostgreSQL 11+ added support for procedures, which are different from the user defined
|
|
434
|
+
functions that PostgreSQL has historically supported. These procedures are
|
|
435
|
+
called via a special +CALL+ syntax, and Sequel supports them via
|
|
436
|
+
<tt>Database#call_procedure</tt>:
|
|
437
|
+
|
|
438
|
+
DB.call_procedure(:foo, 1, "bar")
|
|
439
|
+
# CALL foo(1, 'bar')
|
|
440
|
+
|
|
441
|
+
<tt>Database#call_procedure</tt> will return a hash of return values if
|
|
442
|
+
the procedure returns a result, or +nil+ if the procedure does not return
|
|
443
|
+
a result.
|
|
444
|
+
|
|
340
445
|
=== Using a Cursor to Process Large Datasets <tt>postgres only</tt>
|
|
341
446
|
|
|
342
447
|
The postgres adapter offers a <tt>Dataset#use_cursor</tt> method to process large result sets
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* Ruby 2.6+ endless ranges are now supported as condition specifier
|
|
4
|
+
values, using a >= operator for them:
|
|
5
|
+
|
|
6
|
+
DB[:t].where(c: 1...)
|
|
7
|
+
# SELECT * FROM t WHERE (c >= 1)
|
|
8
|
+
|
|
9
|
+
* Ruby 2.6+ endless ranges are now supported in the pg_range
|
|
10
|
+
extension:
|
|
11
|
+
|
|
12
|
+
DB[:t].where(id: 1).update(r: 1...)
|
|
13
|
+
# UPDATE t SET r = '[1,)' WHERE (id = 1)
|
|
14
|
+
|
|
15
|
+
* The :include option when creating indexes is now supported on
|
|
16
|
+
PostgreSQL 11, specifying additional columns to include in the index
|
|
17
|
+
without indexing them. This is useful to allow index only scans in
|
|
18
|
+
additional cases.
|
|
19
|
+
|
|
20
|
+
* The :tablespace option is now supported when creating tables,
|
|
21
|
+
indexes, and materialized views on PostgreSQL.
|
|
22
|
+
|
|
23
|
+
* The list plugin now supports a :top option, which can be used to
|
|
24
|
+
specify the top of the list. The default value for the top of the
|
|
25
|
+
list is 1, but using this option you can make the top of the list be
|
|
26
|
+
0.
|
|
27
|
+
|
|
28
|
+
= Other Improvements
|
|
29
|
+
|
|
30
|
+
* In the pg_array_associations plugin, filtering by associations for
|
|
31
|
+
many_to_pg_array associations now works correctly on PostgreSQL 11.
|
|
32
|
+
Previously it did not work on PostgreSQL 11 due to new restrictions
|
|
33
|
+
on using set returning functions in the the SELECT list.
|
|
34
|
+
|
|
35
|
+
* When setting the value of a column to the same value the column
|
|
36
|
+
already has, for a new model object that has not yet been persisted,
|
|
37
|
+
where the column is used as the foreign key for at least one
|
|
38
|
+
many_to_one association, do not clear any related associations from
|
|
39
|
+
the associations cache.
|
|
40
|
+
|
|
41
|
+
* In the pg_array extension, if there are separate conversion procs for
|
|
42
|
+
timetz and time types, the conversion proc for the timetz[] type now
|
|
43
|
+
correctly uses the conversion proc for the timetz type to convert
|
|
44
|
+
scalar values, instead of the conversion proc for the time type.
|
|
45
|
+
|
|
46
|
+
* Empty arrays and hashes are now correctly handled in
|
|
47
|
+
Dataset#{first,where_all,where_each,where_single_value} when a
|
|
48
|
+
cached placeholder literalizer is used.
|
|
49
|
+
|
|
50
|
+
* In the tree plugin, Model#{ancestors,descendants,self_and_siblings}
|
|
51
|
+
now work correctly when custom parent/children association names
|
|
52
|
+
are used.
|
|
53
|
+
|
|
54
|
+
* The inner loop of the postgres adapter row fetching code is now
|
|
55
|
+
2-3% faster.
|
|
56
|
+
|
|
57
|
+
* When using the postgres adapter with pg-0.18+, set a
|
|
58
|
+
type_map_for_queries for the connection to allow it to handle input
|
|
59
|
+
type casts for Integer, Float, TrueClass, and FalseClass values
|
|
60
|
+
without allocating strings.
|
|
61
|
+
|
|
62
|
+
* SQLTime.parse (and therefore Sequel.string_to_time) now respects the
|
|
63
|
+
SQLTime.date and Sequel.application_timezone settings.
|
|
64
|
+
|
|
65
|
+
* The jdbc/postgresql adapter now correctly parses timetz types.
|
|
66
|
+
|
|
67
|
+
* On JRuby 9.2.0.0, when handling BC timestamps without timezones in
|
|
68
|
+
the pg_extended_date_support extension, assume local time and not
|
|
69
|
+
UTC time if the database timezone is not specified and
|
|
70
|
+
Sequel.datetime_class is Time.
|
|
71
|
+
|
|
72
|
+
* Errors indicating that a MySQL database is in read-only mode are
|
|
73
|
+
now treated as disconnect errors in the mysql and mysql2 adapters,
|
|
74
|
+
for better behavior in failover scenarios.
|
|
75
|
+
|
|
76
|
+
* Sequel::Model datasets now support the use of IN/NOT IN operators
|
|
77
|
+
where the second argument for the operator (the right hand side) is
|
|
78
|
+
a set returning function. Previously, the Sequel::Model code
|
|
79
|
+
assumed the right hand side of an IN/NOT IN operator was a datasets
|
|
80
|
+
or array, since those are the only values where Sequel will
|
|
81
|
+
automatically create such an operator.
|
|
82
|
+
|
|
83
|
+
* Sequel no longer loads the strscan library in the pg_array extension
|
|
84
|
+
if it is not necessary because the parser from sequel_pg is used.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* Sequel now supports more window frame specification types when
|
|
4
|
+
using window functions. You can now provide the window frame
|
|
5
|
+
specification as a hash, and Sequel will format the correct
|
|
6
|
+
SQL. Specifically, this adds support for RANGE and GROUPS,
|
|
7
|
+
numeric offsets, and EXCLUDE on a database that supports it
|
|
8
|
+
(e.g. PostgreSQL 11+). Examples:
|
|
9
|
+
|
|
10
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
|
11
|
+
:frame=>{:type=>:range, :start=>1, :end=>1})}
|
|
12
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
|
13
|
+
# RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
|
|
14
|
+
|
|
15
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
|
16
|
+
:frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
|
|
17
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
|
18
|
+
# GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
|
|
19
|
+
|
|
20
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
|
21
|
+
:frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
|
|
22
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
|
23
|
+
# RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
|
|
24
|
+
|
|
25
|
+
* The SQLite 3.24+ ON CONFLICT clause to INSERT is now supported.
|
|
26
|
+
This support is very similar to the PostgreSQL support for the
|
|
27
|
+
same feature, also known as UPSERT (UPDATE if the row already
|
|
28
|
+
exists, INSERT if it does not). This support is different than
|
|
29
|
+
the previous support for INSERT ON CONFLICT REPLACE (also known as
|
|
30
|
+
INSERT OR REPLACE), but it uses the same method name in order to
|
|
31
|
+
be compatible with the PostgreSQL support. The new syntax requires
|
|
32
|
+
passing a hash to Dataset#insert_conflict. Examples:
|
|
33
|
+
|
|
34
|
+
DB[:table].insert_conflict({}).insert(a: 1, b: 2)
|
|
35
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
36
|
+
# ON CONFLICT DO NOTHING
|
|
37
|
+
|
|
38
|
+
DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
|
39
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
40
|
+
# ON CONFLICT (a) DO NOTHING
|
|
41
|
+
|
|
42
|
+
DB[:table].insert_conflict(target: :a,
|
|
43
|
+
conflict_where: {c: true}).insert(a: 1, b: 2)
|
|
44
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
45
|
+
# ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
|
|
46
|
+
|
|
47
|
+
DB[:table].insert_conflict(target: :a,
|
|
48
|
+
update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
49
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
50
|
+
# ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
51
|
+
|
|
52
|
+
DB[:table].insert_conflict(target: :a,
|
|
53
|
+
update: {b: Sequel[:excluded][:b]},
|
|
54
|
+
update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
|
|
55
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2) ON CONFLICT (a)
|
|
56
|
+
# DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
|
57
|
+
|
|
58
|
+
* Dataset#window for the WINDOW clause has been moved from the
|
|
59
|
+
PostgreSQL-specific support to core, and has been enabled on
|
|
60
|
+
MySQL 8+ and SQLAnywhere. This allows you to specify a shared
|
|
61
|
+
window specification in a query, which can be used by multiple
|
|
62
|
+
window functions.
|
|
63
|
+
|
|
64
|
+
= Other Improvements
|
|
65
|
+
|
|
66
|
+
* When using the static_cache plugin, Model.first when called without
|
|
67
|
+
a block and without arguments or with a single Integer argument now
|
|
68
|
+
uses the cached values instead of issuing a query.
|
|
69
|
+
|
|
70
|
+
* Using set_column_default with a nil value now correctly removes an
|
|
71
|
+
existing default value on MySQL when the column is NOT NULL.
|
|
72
|
+
|
|
73
|
+
* Window function support has been enabled on SQLAnywhere, since it
|
|
74
|
+
works correctly.
|
|
75
|
+
|
|
76
|
+
* Dumping schema for numeric/decimal columns with default values
|
|
77
|
+
now works correctly. This was broken starting in Sequel 5.9.0
|
|
78
|
+
due to changes to use BigDecimal() instead of BigDecimal.new().
|
|
79
|
+
|
|
80
|
+
* The jdbc/sqlserver adapter now works correctly on JRuby 9.2+.
|
|
81
|
+
|
|
82
|
+
* An additional check constraint violation failure message is now
|
|
83
|
+
recognized on SQLite.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
= New Features
|
|
2
|
+
|
|
3
|
+
* An eager_graph_eager plugin has been added, which allows you to
|
|
4
|
+
chain eager loads using separate queries to an existing dataset that
|
|
5
|
+
uses eager_graph. Given the following model associations:
|
|
6
|
+
|
|
7
|
+
Band.one_to_many :albums
|
|
8
|
+
Album.one_to_many :tracks
|
|
9
|
+
|
|
10
|
+
Let's say you wanted to return bands ordered by album name, and
|
|
11
|
+
eagerly load those albums, you can do that using:
|
|
12
|
+
|
|
13
|
+
Band.eager_graph(:albums).order{albums[:name]}
|
|
14
|
+
|
|
15
|
+
Let's say you also wanted to eagerly load the tracks for each album.
|
|
16
|
+
You could just add them to the eager_graph call:
|
|
17
|
+
|
|
18
|
+
Band.eager_graph(albums: :tracks).order{albums[:name]}
|
|
19
|
+
|
|
20
|
+
However, the bloats the result set, and you aren't ordering by the
|
|
21
|
+
track information, so a join is not required. The eager_graph_eager
|
|
22
|
+
plugin allows you to specify that the tracks be eagerly loaded in a
|
|
23
|
+
separate query after the eager_graph load of albums:
|
|
24
|
+
|
|
25
|
+
Band.eager_graph(:albums).
|
|
26
|
+
eager_graph_eager([:albums], :tracks).
|
|
27
|
+
order{albums[:name]}
|
|
28
|
+
|
|
29
|
+
eager_graph_eager's first argument is a dependency chain, specified
|
|
30
|
+
as an array of symbols. This specifies the point at which to
|
|
31
|
+
perform the eager load. The remaining arguments are arguments that
|
|
32
|
+
could be passed to Dataset#eager to specify what dependent
|
|
33
|
+
associations should be loaded at that point.
|
|
34
|
+
|
|
35
|
+
* A caller_logging Database extension has been added, which logs
|
|
36
|
+
caller information before queries, filtering out the internal
|
|
37
|
+
Sequel callers. Example:
|
|
38
|
+
|
|
39
|
+
DB.extension :caller_logging
|
|
40
|
+
DB[:table].first
|
|
41
|
+
# Logger:
|
|
42
|
+
# (0.000041s) (source: /path/to/app/foo/t.rb:12 in `get_first`)
|
|
43
|
+
# SELECT * FROM table LIMIT 1
|
|
44
|
+
|
|
45
|
+
You can further filter the caller lines by setting
|
|
46
|
+
Database#caller_logging_ignore to a regexp of additional caller
|
|
47
|
+
lines to ignore. This is useful if you have specific methods or
|
|
48
|
+
internal extensions/plugins that you would also like to ignore as
|
|
49
|
+
they obscure the code actually making the request.
|
|
50
|
+
|
|
51
|
+
DB.caller_logging_ignore = %r{/path/to/app/lib/plugins}
|
|
52
|
+
|
|
53
|
+
You can also format the caller before it is placed in the logger,
|
|
54
|
+
using caller_logging_formatter:
|
|
55
|
+
|
|
56
|
+
DB.caller_logging_formatter = lambda do |caller|
|
|
57
|
+
"(#{caller.sub(/\A\/path\/to\/app\//, '')})"
|
|
58
|
+
end
|
|
59
|
+
DB[:table].first
|
|
60
|
+
# Logger:
|
|
61
|
+
# (0.000041s) (foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
|
62
|
+
|
|
63
|
+
* Database#call_procedure has been added to the postgres adapter, and
|
|
64
|
+
is usable on PostgreSQL 11+ for calling procedures created with
|
|
65
|
+
CREATE PROCEDURE.
|
|
66
|
+
|
|
67
|
+
DB.call_procedure(:foo, 1, "bar")
|
|
68
|
+
# CALL foo(1, 'bar')
|
|
69
|
+
|
|
70
|
+
This method will return a hash of results if the procedure returns
|
|
71
|
+
a result, or nil if it does not return a result.
|
|
72
|
+
|
|
73
|
+
= Other Improvements
|
|
74
|
+
|
|
75
|
+
* It is now possible to use Dataset#eager_graph in an eager load
|
|
76
|
+
callback for associations that use join tables. This allows you
|
|
77
|
+
to eager load some associations using separate queries and other
|
|
78
|
+
associations using joins. For example:
|
|
79
|
+
|
|
80
|
+
Band.eager(:albums=>proc{|ds| ds.eager_graph(:tracks)})
|
|
81
|
+
|
|
82
|
+
Will load the bands in one query, and load the albums and tracks
|
|
83
|
+
in a separate query using a join. Previously, this construction
|
|
84
|
+
worked only for associations that did not use join tables. It now
|
|
85
|
+
works for associations that use join tables, as long as existing
|
|
86
|
+
selected columns are not removed inside the callback.
|
|
87
|
+
|
|
88
|
+
* The tactical_eager_loading plugin now handles automatic eager
|
|
89
|
+
loading for associated objects that were created during the
|
|
90
|
+
load of dataset that uses eager_graph. When using the plugin,
|
|
91
|
+
the following code will now only execute 2 queries, instead of
|
|
92
|
+
issuing a separate query for each album to get the tracks for
|
|
93
|
+
the album.
|
|
94
|
+
|
|
95
|
+
artists = Artist.eager_graph(:albums).all
|
|
96
|
+
artists.each do |artist|
|
|
97
|
+
artist.albums.each do |album|
|
|
98
|
+
album.tracks
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
* Calling Dataset#graph with a dataset with existing selections where
|
|
103
|
+
the column aliases cannot be determined automatically now works
|
|
104
|
+
correctly by using a subselect. Previously, attempting to do this
|
|
105
|
+
would raise an exception. This allows the following code to work:
|
|
106
|
+
|
|
107
|
+
DB[:table].select_all(:table).select_append(expr).graph(...)
|
|
108
|
+
|
|
109
|
+
* Datasets now cache the EagerGraphLoader object that is generated to
|
|
110
|
+
convert arrays of hashes into an object graph, so that subsequent
|
|
111
|
+
eager loads on the same dataset do not need to recompute the same
|
|
112
|
+
information. Most EagerGraphLoader internal state is now frozen to
|
|
113
|
+
prevent unintentional modification.
|
|
114
|
+
|
|
115
|
+
* Sequel.extension now loads files from gems. Previously, it used
|
|
116
|
+
Kernel.require, which does not load files from gems.
|
|
117
|
+
|
|
118
|
+
* Adapters that emulate prepared statements using literalization now
|
|
119
|
+
use a placeholder literalizer and should execute significantly
|
|
120
|
+
faster. More prepared statement internal metadata is now frozen
|
|
121
|
+
to prevent unintentional modification.
|
|
122
|
+
|
|
123
|
+
* Dataset#intersect, #except, and #nowait are now supported on MariaDB
|
|
124
|
+
10.3+.
|
|
125
|
+
|
|
126
|
+
* The constraint_validations extension now respects the
|
|
127
|
+
constraint_validations_table setting when adding metadata for the
|
|
128
|
+
constraint validations.
|
|
129
|
+
|
|
130
|
+
* In the oracle adapter, the clob prepared statement argument type is
|
|
131
|
+
now mapped to the OCI8::CLOB class, allowing the use of Oracle
|
|
132
|
+
procedures with clob output parameters.
|
|
133
|
+
|
|
134
|
+
* The Model.load_cache method in the static_cache plugin is now public.
|
|
135
|
+
|
|
136
|
+
= Backwards Compatibility
|
|
137
|
+
|
|
138
|
+
* The private Dataset#prepared_arg? method has been removed. It is no
|
|
139
|
+
longer necessary after the refactoring to the prepared statement
|
|
140
|
+
code. External adapters that currently call the method should be
|
|
141
|
+
updated to no longer call the method.
|