sequel 4.26.0 → 5.37.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 +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- 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.2.0.txt +33 -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.3.0.txt +121 -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.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- 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 +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- 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.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- 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/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- 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 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- 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 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- 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 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- 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/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/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/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 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The dataset_source_alias extension changes Sequel's
|
|
2
4
|
# default behavior of automatically aliasing datasets
|
|
3
5
|
# from using t1, t2, etc. to using an alias based on
|
|
@@ -35,6 +37,8 @@
|
|
|
35
37
|
# is probably the desired behavior if you are using this extension:
|
|
36
38
|
#
|
|
37
39
|
# DB.extension(:dataset_source_alias)
|
|
40
|
+
#
|
|
41
|
+
# Related module: Sequel::Dataset::DatasetSourceAlias
|
|
38
42
|
|
|
39
43
|
#
|
|
40
44
|
module Sequel
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The date_arithmetic extension adds the ability to perform database-independent
|
|
2
4
|
# addition/substraction of intervals to/from dates and timestamps.
|
|
3
5
|
#
|
|
@@ -8,8 +10,8 @@
|
|
|
8
10
|
# Then you can use the Sequel.date_add and Sequel.date_sub methods
|
|
9
11
|
# to return Sequel expressions:
|
|
10
12
|
#
|
|
11
|
-
# add = Sequel.date_add(:date_column, :
|
|
12
|
-
# sub = Sequel.date_sub(:date_column, :
|
|
13
|
+
# add = Sequel.date_add(:date_column, years: 1, months: 2, days: 3)
|
|
14
|
+
# sub = Sequel.date_sub(:date_column, hours: 1, minutes: 2, seconds: 3)
|
|
13
15
|
#
|
|
14
16
|
# In addition to specifying the interval as a hash, there is also
|
|
15
17
|
# support for specifying the interval as an ActiveSupport::Duration
|
|
@@ -19,23 +21,34 @@
|
|
|
19
21
|
# add = Sequel.date_add(:date_column, 1.years + 2.months + 3.days)
|
|
20
22
|
# sub = Sequel.date_sub(:date_column, 1.hours + 2.minutes + 3.seconds)
|
|
21
23
|
#
|
|
24
|
+
# By default, values are casted to the generic timestamp type for the
|
|
25
|
+
# database. You can override the cast type using the :cast option:
|
|
26
|
+
#
|
|
27
|
+
# add = Sequel.date_add(:date_column, {years: 1, months: 2, days: 3}, :cast=>:timestamptz)
|
|
28
|
+
#
|
|
22
29
|
# These expressions can be used in your datasets, or anywhere else that
|
|
23
30
|
# Sequel expressions are allowed:
|
|
24
31
|
#
|
|
25
32
|
# DB[:table].select(add.as(:d)).where(sub > Sequel::CURRENT_TIMESTAMP)
|
|
33
|
+
#
|
|
34
|
+
# Related module: Sequel::SQL::DateAdd
|
|
26
35
|
|
|
27
36
|
#
|
|
28
37
|
module Sequel
|
|
29
38
|
module SQL
|
|
30
39
|
module Builders
|
|
31
40
|
# Return a DateAdd expression, adding an interval to the date/timestamp expr.
|
|
32
|
-
|
|
33
|
-
|
|
41
|
+
# Options:
|
|
42
|
+
# :cast :: Cast to the specified type instead of the default if casting
|
|
43
|
+
def date_add(expr, interval, opts=OPTS)
|
|
44
|
+
DateAdd.new(expr, interval, opts)
|
|
34
45
|
end
|
|
35
46
|
|
|
36
47
|
# Return a DateAdd expression, adding the negative of the interval to
|
|
37
48
|
# the date/timestamp expr.
|
|
38
|
-
|
|
49
|
+
# Options:
|
|
50
|
+
# :cast :: Cast to the specified type instead of the default if casting
|
|
51
|
+
def date_sub(expr, interval, opts=OPTS)
|
|
39
52
|
interval = if interval.is_a?(Hash)
|
|
40
53
|
h = {}
|
|
41
54
|
interval.each{|k,v| h[k] = -v unless v.nil?}
|
|
@@ -43,7 +56,7 @@ module Sequel
|
|
|
43
56
|
else
|
|
44
57
|
-interval
|
|
45
58
|
end
|
|
46
|
-
DateAdd.new(expr, interval)
|
|
59
|
+
DateAdd.new(expr, interval, opts)
|
|
47
60
|
end
|
|
48
61
|
end
|
|
49
62
|
|
|
@@ -62,22 +75,27 @@ module Sequel
|
|
|
62
75
|
DERBY_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit("SQL_TSI_#{s.to_s.upcase[0...-1]}").freeze}).freeze
|
|
63
76
|
ACCESS_DURATION_UNITS = DURATION_UNITS.zip(%w'yyyy m d h n s'.map(&:freeze)).freeze
|
|
64
77
|
DB2_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s).freeze}).freeze
|
|
65
|
-
FDBSQL_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s.chop).freeze}).freeze
|
|
66
78
|
|
|
67
79
|
# Append the SQL fragment for the DateAdd expression to the SQL query.
|
|
68
80
|
def date_add_sql_append(sql, da)
|
|
81
|
+
if defined?(super)
|
|
82
|
+
return super
|
|
83
|
+
end
|
|
84
|
+
|
|
69
85
|
h = da.interval
|
|
70
86
|
expr = da.expr
|
|
87
|
+
cast_type = da.cast_type || Time
|
|
88
|
+
|
|
71
89
|
cast = case db_type = db.database_type
|
|
72
90
|
when :postgres
|
|
73
|
-
interval =
|
|
91
|
+
interval = String.new
|
|
74
92
|
each_valid_interval_unit(h, DEF_DURATION_UNITS) do |value, sql_unit|
|
|
75
93
|
interval << "#{value} #{sql_unit} "
|
|
76
94
|
end
|
|
77
95
|
if interval.empty?
|
|
78
|
-
return literal_append(sql, Sequel.cast(expr,
|
|
96
|
+
return literal_append(sql, Sequel.cast(expr, cast_type))
|
|
79
97
|
else
|
|
80
|
-
return complex_expression_sql_append(sql, :+, [Sequel.cast(expr,
|
|
98
|
+
return complex_expression_sql_append(sql, :+, [Sequel.cast(expr, cast_type), Sequel.cast(interval, :interval)])
|
|
81
99
|
end
|
|
82
100
|
when :sqlite
|
|
83
101
|
args = [expr]
|
|
@@ -85,10 +103,10 @@ module Sequel
|
|
|
85
103
|
args << "#{value} #{sql_unit}"
|
|
86
104
|
end
|
|
87
105
|
return function_sql_append(sql, Sequel.function(:datetime, *args))
|
|
88
|
-
when :mysql, :hsqldb
|
|
106
|
+
when :mysql, :hsqldb
|
|
89
107
|
if db_type == :hsqldb
|
|
90
108
|
# HSQLDB requires 2.2.9+ for the DATE_ADD function
|
|
91
|
-
expr = Sequel.cast(expr,
|
|
109
|
+
expr = Sequel.cast(expr, cast_type)
|
|
92
110
|
end
|
|
93
111
|
each_valid_interval_unit(h, MYSQL_DURATION_UNITS) do |value, sql_unit|
|
|
94
112
|
expr = Sequel.function(:DATE_ADD, expr, Sequel.lit(["INTERVAL ", " "], value, sql_unit))
|
|
@@ -118,7 +136,7 @@ module Sequel
|
|
|
118
136
|
expr = Sequel.+(expr, Sequel.lit(["INTERVAL ", " "], value.to_s, sql_unit))
|
|
119
137
|
end
|
|
120
138
|
when :db2
|
|
121
|
-
expr = Sequel.cast(expr,
|
|
139
|
+
expr = Sequel.cast(expr, cast_type)
|
|
122
140
|
each_valid_interval_unit(h, DB2_DURATION_UNITS) do |value, sql_unit|
|
|
123
141
|
expr = Sequel.+(expr, Sequel.lit(["", " "], value, sql_unit))
|
|
124
142
|
end
|
|
@@ -128,7 +146,7 @@ module Sequel
|
|
|
128
146
|
end
|
|
129
147
|
|
|
130
148
|
if cast
|
|
131
|
-
expr = Sequel.cast(expr,
|
|
149
|
+
expr = Sequel.cast(expr, cast_type)
|
|
132
150
|
end
|
|
133
151
|
|
|
134
152
|
literal_append(sql, expr)
|
|
@@ -159,10 +177,14 @@ module Sequel
|
|
|
159
177
|
# symbol keys.
|
|
160
178
|
attr_reader :interval
|
|
161
179
|
|
|
180
|
+
# The type to cast the expression to. nil if not overridden, in which cast
|
|
181
|
+
# the generic timestamp type for the database will be used.
|
|
182
|
+
attr_reader :cast_type
|
|
183
|
+
|
|
162
184
|
# Supports two types of intervals:
|
|
163
185
|
# Hash :: Used directly, but values cannot be plain strings.
|
|
164
186
|
# ActiveSupport::Duration :: Converted to a hash using the interval's parts.
|
|
165
|
-
def initialize(expr, interval)
|
|
187
|
+
def initialize(expr, interval, opts=OPTS)
|
|
166
188
|
@expr = expr
|
|
167
189
|
@interval = if interval.is_a?(Hash)
|
|
168
190
|
interval.each_value do |v|
|
|
@@ -172,12 +194,16 @@ module Sequel
|
|
|
172
194
|
raise Sequel::InvalidValue, "cannot provide String value as interval part: #{v.inspect}"
|
|
173
195
|
end
|
|
174
196
|
end
|
|
175
|
-
interval
|
|
197
|
+
Hash[interval]
|
|
176
198
|
else
|
|
177
199
|
h = Hash.new(0)
|
|
178
200
|
interval.parts.each{|unit, value| h[unit] += value}
|
|
179
201
|
Hash[h]
|
|
180
202
|
end
|
|
203
|
+
|
|
204
|
+
@interval.freeze
|
|
205
|
+
@cast_type = opts[:cast] if opts[:cast]
|
|
206
|
+
freeze
|
|
181
207
|
end
|
|
182
208
|
|
|
183
209
|
to_s_method :date_add_sql
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# This switches the default parsing of strings into Time values
|
|
4
|
+
# from using Time.parse to using DateTime.parse.to_time. This
|
|
5
|
+
# fixes issues when the times being parsed have no timezone
|
|
6
|
+
# information, the implicit timezone for the Database instance
|
|
7
|
+
# is set to +:utc+, and the timestamps being used include values
|
|
8
|
+
# not valid in the local timezone, such as during a daylight
|
|
9
|
+
# savings time switch.
|
|
10
|
+
#
|
|
11
|
+
# To load the extension:
|
|
12
|
+
#
|
|
13
|
+
# Sequel.extension :datetime_parse_to_time
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
module Sequel::DateTimeParseToTime
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
# Use DateTime.parse.to_time to do the conversion if the input a string and is assumed to
|
|
20
|
+
# be in UTC and there is no offset information in the string.
|
|
21
|
+
def convert_input_timestamp(v, input_timezone)
|
|
22
|
+
if v.is_a?(String) && datetime_class == Time && input_timezone == :utc && !Date._parse(v).has_key?(:offset)
|
|
23
|
+
t = DateTime.parse(v).to_time
|
|
24
|
+
case application_timezone
|
|
25
|
+
when nil, :local
|
|
26
|
+
t = t.localtime
|
|
27
|
+
end
|
|
28
|
+
t
|
|
29
|
+
else
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
rescue => e
|
|
33
|
+
raise convert_exception_class(e, Sequel::InvalidValue)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Sequel.extend(Sequel::DateTimeParseToTime)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The duplicate_columns_handler extension allows you to customize handling of
|
|
4
|
+
# duplicate column names in your queries on a per-database or per-dataset level.
|
|
5
|
+
#
|
|
6
|
+
# For example, you may want to raise an exception if you join 2 tables together
|
|
7
|
+
# which contains a column that will override another columns.
|
|
8
|
+
#
|
|
9
|
+
# To use the extension, you need to load the extension into the database:
|
|
10
|
+
#
|
|
11
|
+
# DB.extension :duplicate_columns_handler
|
|
12
|
+
#
|
|
13
|
+
# or into individual datasets:
|
|
14
|
+
#
|
|
15
|
+
# ds = DB[:items].extension(:duplicate_columns_handler)
|
|
16
|
+
#
|
|
17
|
+
# A database option is introduced: :on_duplicate_columns. It accepts a Symbol
|
|
18
|
+
# or any object that responds to :call.
|
|
19
|
+
#
|
|
20
|
+
# on_duplicate_columns: :raise
|
|
21
|
+
# on_duplicate_columns: :warn
|
|
22
|
+
# on_duplicate_columns: :ignore
|
|
23
|
+
# on_duplicate_columns: lambda{|columns| arbitrary_condition? ? :raise : :warn}
|
|
24
|
+
#
|
|
25
|
+
# You may also configure duplicate columns handling for a specific dataset:
|
|
26
|
+
#
|
|
27
|
+
# ds.on_duplicate_columns(:warn)
|
|
28
|
+
# ds.on_duplicate_columns(:raise)
|
|
29
|
+
# ds.on_duplicate_columns(:ignore)
|
|
30
|
+
# ds.on_duplicate_columns{|columns| arbitrary_condition? ? :raise : :warn}
|
|
31
|
+
# ds.on_duplicate_columns(lambda{|columns| arbitrary_condition? ? :raise : :warn})
|
|
32
|
+
#
|
|
33
|
+
# If :raise is specified, a Sequel::DuplicateColumnError is raised.
|
|
34
|
+
# If :warn is specified, you will receive a warning via +warn+.
|
|
35
|
+
# If a callable is specified, it will be called.
|
|
36
|
+
# If no on_duplicate_columns is specified, the default is :warn.
|
|
37
|
+
#
|
|
38
|
+
# Related module: Sequel::DuplicateColumnsHandler
|
|
39
|
+
|
|
40
|
+
module Sequel
|
|
41
|
+
module DuplicateColumnsHandler
|
|
42
|
+
# :nocov:
|
|
43
|
+
CALLER_ARGS = (RUBY_VERSION >= '2.0' ? [0,1] : [0]).freeze
|
|
44
|
+
# :nocov:
|
|
45
|
+
|
|
46
|
+
# Customize handling of duplicate columns for this dataset.
|
|
47
|
+
def on_duplicate_columns(handler = (raise Error, "Must provide either an argument or a block to on_duplicate_columns" unless block_given?; nil), &block)
|
|
48
|
+
raise Error, "Cannot provide both an argument and a block to on_duplicate_columns" if handler && block
|
|
49
|
+
clone(:on_duplicate_columns=>handler||block)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
# Call handle_duplicate_columns if there are duplicate columns.
|
|
55
|
+
def columns=(cols)
|
|
56
|
+
if cols && cols.uniq.size != cols.size
|
|
57
|
+
handle_duplicate_columns(cols)
|
|
58
|
+
end
|
|
59
|
+
super
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Invoke the appropriate behavior when duplicate columns are present.
|
|
63
|
+
def handle_duplicate_columns(cols)
|
|
64
|
+
message = "#{caller(*CALLER_ARGS).first}: One or more duplicate columns present in #{cols.inspect}"
|
|
65
|
+
|
|
66
|
+
case duplicate_columns_handler_type(cols)
|
|
67
|
+
when :raise
|
|
68
|
+
raise DuplicateColumnError, message
|
|
69
|
+
when :warn
|
|
70
|
+
warn message
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Try to find dataset option for on_duplicate_columns. If not present on the dataset,
|
|
75
|
+
# use the on_duplicate_columns option on the database. If not present on the database,
|
|
76
|
+
# default to :warn.
|
|
77
|
+
def duplicate_columns_handler_type(cols)
|
|
78
|
+
handler = opts.fetch(:on_duplicate_columns){db.opts.fetch(:on_duplicate_columns, :warn)}
|
|
79
|
+
|
|
80
|
+
if handler.respond_to?(:call)
|
|
81
|
+
handler.call(cols)
|
|
82
|
+
else
|
|
83
|
+
handler
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Error which is raised when duplicate columns are present in a dataset which is configured
|
|
89
|
+
# to :raise on_duplicate_columns.
|
|
90
|
+
class DuplicateColumnError < Error
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
Dataset.register_extension(:duplicate_columns_handler, Sequel::DuplicateColumnsHandler)
|
|
94
|
+
end
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# This changes Sequel's literalization of IN/NOT IN with an empty
|
|
2
4
|
# array value to consider NULL values if one of the referenced
|
|
3
5
|
# columns is NULL:
|
|
4
6
|
#
|
|
5
|
-
# DB[:test].where(:
|
|
7
|
+
# DB[:test].where(name: [])
|
|
6
8
|
# # SELECT * FROM test WHERE (name != name)
|
|
7
|
-
# DB[:test].exclude(:
|
|
9
|
+
# DB[:test].exclude(name: [])
|
|
8
10
|
# # SELECT * FROM test WHERE (name = name)
|
|
9
11
|
#
|
|
10
12
|
# The default Sequel behavior is to ignore NULLs, as the above
|
|
@@ -19,11 +21,13 @@
|
|
|
19
21
|
# is probably the desired behavior if you are using this extension:
|
|
20
22
|
#
|
|
21
23
|
# DB.extension(:empty_array_consider_nulls)
|
|
24
|
+
#
|
|
25
|
+
# Related module: Sequel::EmptyArrayConsiderNulls
|
|
22
26
|
|
|
23
27
|
#
|
|
24
28
|
module Sequel
|
|
25
29
|
module EmptyArrayConsiderNulls
|
|
26
|
-
# Use
|
|
30
|
+
# Use an expression that returns NULL if the column value is NULL.
|
|
27
31
|
def empty_array_value(op, cols)
|
|
28
32
|
c = Array(cols)
|
|
29
33
|
SQL::BooleanExpression.from_value_pairs(c.zip(c), :AND, op == :IN)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
1
3
|
# The error_sql extension adds a DatabaseError#sql method
|
|
2
4
|
# that you can use to get the sql that caused the error
|
|
3
5
|
# to be raised.
|
|
@@ -18,7 +20,7 @@
|
|
|
18
20
|
#
|
|
19
21
|
# This extension may not work correctly in the following cases:
|
|
20
22
|
#
|
|
21
|
-
# *
|
|
23
|
+
# * log_connection_yield is not used when executing the query.
|
|
22
24
|
# * The underlying exception is frozen or reused.
|
|
23
25
|
# * The underlying exception doesn't correctly record instance
|
|
24
26
|
# variables set on it (seems to happen on JRuby when underlying
|
|
@@ -27,6 +29,8 @@
|
|
|
27
29
|
# To load the extension into the database:
|
|
28
30
|
#
|
|
29
31
|
# DB.extension :error_sql
|
|
32
|
+
#
|
|
33
|
+
# Related module: Sequel::ErrorSQL
|
|
30
34
|
|
|
31
35
|
#
|
|
32
36
|
module Sequel
|
|
@@ -53,12 +57,12 @@ module Sequel
|
|
|
53
57
|
# If there are no loggers for this database and an exception is raised
|
|
54
58
|
# store the SQL related to the exception with the exception, so it
|
|
55
59
|
# is available for DatabaseError#sql later.
|
|
56
|
-
def
|
|
60
|
+
def log_connection_yield(sql, conn, args=nil)
|
|
57
61
|
if @loggers.empty?
|
|
58
62
|
begin
|
|
59
63
|
yield
|
|
60
64
|
rescue => e
|
|
61
|
-
sql = "#{sql}; #{args.inspect}" if args
|
|
65
|
+
sql = "#{connection_info(conn) if conn && log_connection_info}#{sql}#{"; #{args.inspect}" if args}"
|
|
62
66
|
e.instance_variable_set(:@sequel_error_sql, sql)
|
|
63
67
|
raise
|
|
64
68
|
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
#
|
|
3
|
+
# The escaped_like extension adds +escaped_like+ and +escaped_ilike+
|
|
4
|
+
# methods to Sequel::SQL::StringMethods, which allow them to be easily
|
|
5
|
+
# used with most of Sequel's expression objects. Example:
|
|
6
|
+
#
|
|
7
|
+
# DB[:table].where{string_column.escaped_like('?%', user_input)}
|
|
8
|
+
# # user_input is 'foo':
|
|
9
|
+
# # SELECT * FROM table WHERE string_column LIKE 'foo%' ESCAPE '\'
|
|
10
|
+
# # user_input is '%foo':
|
|
11
|
+
# # SELECT * FROM table WHERE string_column LIKE '\%foo%' ESCAPE '\'
|
|
12
|
+
#
|
|
13
|
+
# To load the extension:
|
|
14
|
+
#
|
|
15
|
+
# Sequel.extension :escaped_like
|
|
16
|
+
#
|
|
17
|
+
# Related modules: Sequel::SQL::StringMethods, Sequel::SQL::EscapedLikeExpression
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
module Sequel
|
|
21
|
+
module SQL
|
|
22
|
+
# Represents an pattern match SQL expression, where the pattern can depend
|
|
23
|
+
# upon interpolated values in a database-dependent manner.
|
|
24
|
+
class EscapedLikeExpression < Expression
|
|
25
|
+
include AliasMethods
|
|
26
|
+
include BooleanMethods
|
|
27
|
+
include CastMethods
|
|
28
|
+
include OrderMethods
|
|
29
|
+
|
|
30
|
+
# Initialize the expression. Arguments:
|
|
31
|
+
# expr :: Right hand site of LIKE/ILIKE operator, what you are matching against the pattern
|
|
32
|
+
# case_insensitive :: Whether the match is case sensitive
|
|
33
|
+
# placeholder_pattern :: The pattern to match against, with +?+ for the placeholders
|
|
34
|
+
# placeholder_values :: The string values for each +?+ in the placeholder pattern. Should be an
|
|
35
|
+
# array of strings, though it can be a single string if there is only
|
|
36
|
+
# a single placeholder.
|
|
37
|
+
def initialize(expr, case_sensitive, placeholder_pattern, placeholder_values)
|
|
38
|
+
@expr = expr
|
|
39
|
+
@method = case_sensitive ? :like : :ilike
|
|
40
|
+
@pattern = placeholder_pattern
|
|
41
|
+
unless placeholder_values.is_a?(Array)
|
|
42
|
+
placeholder_values = [placeholder_values].freeze
|
|
43
|
+
end
|
|
44
|
+
@values = placeholder_values
|
|
45
|
+
freeze
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Interpolate the pattern values into the placeholder pattern to get the final pattern,
|
|
49
|
+
# now that we have access to the dataset. Use the expression and final pattern and
|
|
50
|
+
# add an appropriate LIKE/ILIKE expression to the SQL being built.
|
|
51
|
+
def to_s_append(ds, sql)
|
|
52
|
+
i = -1
|
|
53
|
+
match_len = @values.length - 1
|
|
54
|
+
like_pattern = String.new
|
|
55
|
+
pattern = @pattern
|
|
56
|
+
while true
|
|
57
|
+
previous, q, pattern = pattern.partition('?')
|
|
58
|
+
like_pattern << previous
|
|
59
|
+
|
|
60
|
+
unless q.empty?
|
|
61
|
+
if i == match_len
|
|
62
|
+
raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
|
|
63
|
+
end
|
|
64
|
+
like_pattern << ds.escape_like(@values.at(i+=1))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if pattern.empty?
|
|
68
|
+
unless i == match_len
|
|
69
|
+
raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
|
|
70
|
+
end
|
|
71
|
+
break
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
ds.literal_append(sql, Sequel.send(@method, @expr, like_pattern))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
module StringMethods
|
|
79
|
+
# Create a +EscapedLikeExpression+ case insensitive pattern match of the receiver
|
|
80
|
+
# with the patterns, interpolated escaped values for each +?+ placeholder in the
|
|
81
|
+
# pattern.
|
|
82
|
+
#
|
|
83
|
+
# Sequel[:a].escaped_ilike('?%', 'A') # "a" ILIKE 'A%' ESCAPE '\'
|
|
84
|
+
# Sequel[:a].escaped_ilike('?%', '%A') # "a" ILIKE '\%A%' ESCAPE '\'
|
|
85
|
+
def escaped_ilike(placeholder_pattern, placeholder_values)
|
|
86
|
+
EscapedLikeExpression.new(self, false, placeholder_pattern, placeholder_values)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Create a +EscapedLikeExpression+ case sensitive pattern match of the receiver
|
|
90
|
+
# with the patterns, interpolated escaped values for each +?+ placeholder in the
|
|
91
|
+
# pattern.
|
|
92
|
+
#
|
|
93
|
+
# Sequel[:a].escaped_like('?%', 'A') # "a" LIKE 'A%' ESCAPE '\'
|
|
94
|
+
# Sequel[:a].escaped_like('?%', '%A') # "a" LIKE '\%A%' ESCAPE '\'
|
|
95
|
+
def escaped_like(placeholder_pattern, placeholder_values)
|
|
96
|
+
EscapedLikeExpression.new(self, true, placeholder_pattern, placeholder_values)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|