sequel 4.36.0 → 5.61.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 +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- 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/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- 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 +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- 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.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -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 +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- 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 +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -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 +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -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 +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- 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 +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -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/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -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 +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -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/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -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 +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- 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.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.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 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- 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 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- 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 -203
- data/spec/core/schema_spec.rb +0 -1676
- 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/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- 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 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- 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/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- 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_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- 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 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- 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 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- 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 -728
- 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/no_auto_literal_strings_spec.rb +0 -65
- 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 -390
- 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 -275
- 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 -473
- 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 -814
- 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/server_logging_spec.rb +0 -45
- 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_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- 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/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- 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/uuid_spec.rb +0 -106
- 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 -554
- 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/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 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- 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/spec_config.rb +0 -10
data/doc/postgresql.rdoc
CHANGED
@@ -19,10 +19,10 @@ rarely used PostgreSQL features that Sequel supports which are not mentioned her
|
|
19
19
|
|
20
20
|
Some of this this support depends on the specific adapter or underlying driver in use.
|
21
21
|
<tt>postgres only</tt> will denote support specific to the postgres adapter (i.e.
|
22
|
-
not available when connecting to PostgreSQL via the jdbc
|
22
|
+
not available when connecting to PostgreSQL via the jdbc adapter).
|
23
23
|
<tt>postgres/pg only</tt> will denote support specific to the postgres adapter when
|
24
|
-
pg is used as the underlying driver (i.e. not available when using the postgres-pr
|
25
|
-
|
24
|
+
pg is used as the underlying driver (i.e. not available when using the postgres-pr
|
25
|
+
driver).
|
26
26
|
|
27
27
|
== PostgreSQL-specific Database Type Support
|
28
28
|
|
@@ -44,7 +44,7 @@ pg_range :: ranges (for any scalar type), as a ruby Range-like object
|
|
44
44
|
pg_row :: row-valued/composite types, as a ruby Hash-like or Sequel::Model object
|
45
45
|
|
46
46
|
In general, these extensions just add support for Database objects to return retrieved
|
47
|
-
column values as the appropriate type
|
47
|
+
column values as the appropriate type and support for literalizing
|
48
48
|
the objects correctly for use in an SQL string, or using them as bound variable values (<tt>postgres/pg and jdbc/postgres only</tt>).
|
49
49
|
|
50
50
|
There are also type-specific extensions that make it easy to use database functions
|
@@ -56,6 +56,21 @@ pg_json_ops :: json-related functions and operators
|
|
56
56
|
pg_range_ops :: range-related functions and operators
|
57
57
|
pg_row_ops :: row-valued/composite type syntax support
|
58
58
|
|
59
|
+
These extensions aren't Database specific, they are global extensions, so you should
|
60
|
+
load them via <tt>Sequel.extension</tt>, after loading support for the specific types
|
61
|
+
into the Database instance:
|
62
|
+
|
63
|
+
DB.extension :pg_array
|
64
|
+
Sequel.extension :pg_array_ops
|
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
|
+
|
59
74
|
== PostgreSQL-specific DDL Support
|
60
75
|
|
61
76
|
=== Exclusion Constraints
|
@@ -64,7 +79,7 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
64
79
|
|
65
80
|
DB.create_table(:table) do
|
66
81
|
daterange :during
|
67
|
-
exclude([[:during, '&&']], :
|
82
|
+
exclude([[:during, '&&']], name: :table_during_excl)
|
68
83
|
end
|
69
84
|
# CREATE TABLE "table" ("during" daterange,
|
70
85
|
# CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&))
|
@@ -72,20 +87,20 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
72
87
|
You can also add exclusion constraints in +alter_table+ blocks using add_exclusion_constraint:
|
73
88
|
|
74
89
|
DB.alter_table(:table) do
|
75
|
-
add_exclusion_constraint([[:during, '&&']], :
|
90
|
+
add_exclusion_constraint([[:during, '&&']], name: :table_during_excl)
|
76
91
|
end
|
77
92
|
# ALTER TABLE "table" ADD CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&)
|
78
93
|
|
79
94
|
=== Adding Foreign Key and Check Constraints Without Initial Validation
|
80
95
|
|
81
|
-
You can add a <tt
|
96
|
+
You can add a <tt>not_valid: true</tt> option when adding constraints to existing tables so
|
82
97
|
that it doesn't check if all current rows are valid:
|
83
98
|
|
84
99
|
DB.alter_table(:table) do
|
85
100
|
# Assumes t_id column already exists
|
86
|
-
add_foreign_key([:t_id], :table, :
|
101
|
+
add_foreign_key([:t_id], :table, not_valid: true, name: :table_fk)
|
87
102
|
|
88
|
-
constraint({:
|
103
|
+
constraint({name: :col_123, not_valid: true}, col: [1,2,3])
|
89
104
|
end
|
90
105
|
# ALTER TABLE "table" ADD CONSTRAINT "table_fk" FOREIGN KEY ("t_id") REFERENCES "table" NOT VALID
|
91
106
|
# ALTER TABLE "table" ADD CONSTRAINT "col_123" CHECK (col IN (1, 2, 3)) NOT VALID
|
@@ -102,14 +117,14 @@ all existing rows have been fixed, you can validate the constraint:
|
|
102
117
|
|
103
118
|
=== Creating Indexes Concurrently
|
104
119
|
|
105
|
-
You can create indexes concurrently using the <tt
|
120
|
+
You can create indexes concurrently using the <tt>concurrently: true</tt> option:
|
106
121
|
|
107
|
-
DB.add_index(:table, :t_id, :
|
122
|
+
DB.add_index(:table, :t_id, concurrently: true)
|
108
123
|
# CREATE INDEX CONCURRENTLY "table_t_id_index" ON "table" ("t_id")
|
109
124
|
|
110
125
|
Similarly, you can drop indexes concurrently as well:
|
111
126
|
|
112
|
-
DB.drop_index(:table, :t_id, :
|
127
|
+
DB.drop_index(:table, :t_id, concurrently: true)
|
113
128
|
# DROP INDEX CONCURRENTLY "table_t_id_index"
|
114
129
|
|
115
130
|
=== Specific Conversions When Altering Column Types
|
@@ -119,19 +134,105 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
|
|
119
134
|
|
120
135
|
DB.alter_table(:table) do
|
121
136
|
# Assume unix_time column is stored as an integer, and you want to change it to timestamp
|
122
|
-
set_column_type :unix_time, Time, :
|
137
|
+
set_column_type :unix_time, Time, using: (Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
|
123
138
|
end
|
124
139
|
# ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
|
125
140
|
# USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
|
126
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
|
+
|
127
213
|
=== Creating Unlogged Tables
|
128
214
|
|
129
215
|
PostgreSQL allows users to create unlogged tables, which are faster but not crash safe. Sequel
|
130
|
-
allows you
|
216
|
+
allows you to create an unlogged table by specifying the <tt>unlogged: true</tt> option to +create_table+:
|
131
217
|
|
132
|
-
DB.create_table(:table, :
|
218
|
+
DB.create_table(:table, unlogged: true){Integer :i}
|
133
219
|
# CREATE UNLOGGED TABLE "table" ("i" integer)
|
134
220
|
|
221
|
+
=== Creating Identity Columns
|
222
|
+
|
223
|
+
You can use the +:identity+ option when creating columns to mark them as identity columns.
|
224
|
+
Identity columns are tied to a sequence for the default value. You can still override the
|
225
|
+
default value for the column when inserting:
|
226
|
+
|
227
|
+
DB.create_table(:table){Integer :id, identity: true}
|
228
|
+
# CREATE TABLE "table" ("id" integer GENERATED BY DEFAULT AS IDENTITY)
|
229
|
+
|
230
|
+
If you want to disallow using a user provided value when inserting, you can mark the
|
231
|
+
identity column using <tt>identity: :always</tt>:
|
232
|
+
|
233
|
+
DB.create_table(:table){Integer :id, identity: :always}
|
234
|
+
# CREATE TABLE "table" ("id" integer GENERATED ALWAYS AS IDENTITY)
|
235
|
+
|
135
236
|
=== Creating/Dropping Schemas, Languages, Functions, and Triggers
|
136
237
|
|
137
238
|
Sequel has built in support for creating and dropping PostgreSQL schemas, procedural languages, functions, and triggers:
|
@@ -146,7 +247,7 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
146
247
|
DB.drop_language(:plperl)
|
147
248
|
# DROP LANGUAGE plperl
|
148
249
|
|
149
|
-
DB.create_function(:set_updated_at, <<-SQL, :
|
250
|
+
DB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger)
|
150
251
|
BEGIN
|
151
252
|
NEW.updated_at := CURRENT_TIMESTAMP;
|
152
253
|
RETURN NEW;
|
@@ -160,11 +261,56 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
160
261
|
DB.drop_function(:set_updated_at)
|
161
262
|
# DROP FUNCTION set_updated_at()
|
162
263
|
|
163
|
-
DB.create_trigger(:table, :trg_updated_at, :set_updated_at, :
|
264
|
+
DB.create_trigger(:table, :trg_updated_at, :set_updated_at, events: :update, each_row: true, when: {Sequel[:new][:updated_at] => Sequel[:old][:updated_at]})
|
164
265
|
# CREATE TRIGGER trg_updated_at BEFORE UPDATE ON "table" FOR EACH ROW WHEN ("new"."updated_at" = "old"."updated_at") EXECUTE PROCEDURE set_updated_at()
|
165
266
|
DB.drop_trigger(:table, :trg_updated_at)
|
166
267
|
# DROP TRIGGER trg_updated_at ON "table"
|
167
268
|
|
269
|
+
However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
|
270
|
+
|
271
|
+
=== Parsing Check Constraints
|
272
|
+
|
273
|
+
Sequel has support for parsing CHECK constraints on PostgreSQL using <tt>Sequel::Database#check_constraints</tt>:
|
274
|
+
|
275
|
+
DB.create_table(:foo) do
|
276
|
+
Integer :i
|
277
|
+
Integer :j
|
278
|
+
constraint(:ic, Sequel[:i] > 2)
|
279
|
+
constraint(:jc, Sequel[:j] > 2)
|
280
|
+
constraint(:ijc, Sequel[:i] - Sequel[:j] > 2)
|
281
|
+
end
|
282
|
+
DB.check_constraints(:foo)
|
283
|
+
# => {
|
284
|
+
# :ic=>{:definition=>"CHECK ((i > 2))", :columns=>[:i]},
|
285
|
+
# :jc=>{:definition=>"CHECK ((j > 2))", :columns=>[:j]},
|
286
|
+
# :ijc=>{:definition=>"CHECK (((i - j) > 2))", :columns=>[:i, :j]}
|
287
|
+
# }
|
288
|
+
|
289
|
+
=== Parsing Foreign Key Constraints Referencing A Given Table
|
290
|
+
|
291
|
+
Sequel has support for parsing FOREIGN KEY constraints that reference a given table, using the +:reverse+
|
292
|
+
option to +foreign_key_list+:
|
293
|
+
|
294
|
+
DB.create_table!(:a) do
|
295
|
+
primary_key :id
|
296
|
+
Integer :i
|
297
|
+
Integer :j
|
298
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
299
|
+
unique [:i, :j]
|
300
|
+
end
|
301
|
+
DB.create_table!(:b) do
|
302
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
303
|
+
Integer :c
|
304
|
+
Integer :d
|
305
|
+
foreign_key [:c, :d], :a, :key=>[:j, :i], :name=>:a_c_d
|
306
|
+
end
|
307
|
+
DB.foreign_key_list(:a, :reverse=>true)
|
308
|
+
# => [
|
309
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
|
310
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
|
311
|
+
# {:name=>:a_c_d, :columns=>[:c, :d], :key=>[:j, :i], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public}
|
312
|
+
# ]
|
313
|
+
|
168
314
|
== PostgreSQL-specific DML Support
|
169
315
|
|
170
316
|
=== Returning Rows From Insert, Update, and Delete Statements
|
@@ -178,12 +324,12 @@ Sequel supports the ability to return rows from insert, update, and delete state
|
|
178
324
|
DB[:table].returning(:id).delete
|
179
325
|
# DELETE FROM "table" RETURNING "id"
|
180
326
|
|
181
|
-
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(:
|
327
|
+
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(id: 2)
|
182
328
|
# UPDATE "table" SET "id" = 2 RETURNING "id", ("id" * "id") AS "idsq"
|
183
329
|
|
184
330
|
When returning is used, instead of returning the number of rows affected (for updated/delete)
|
185
331
|
or the serial primary key value (for insert), it will return an array of hashes with the
|
186
|
-
|
332
|
+
returning results.
|
187
333
|
|
188
334
|
=== VALUES Support
|
189
335
|
|
@@ -203,27 +349,27 @@ Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
|
|
203
349
|
Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
|
204
350
|
violations when inserting using <tt>Dataset#insert_conflict</tt>:
|
205
351
|
|
206
|
-
DB[:table].insert_conflict.insert(:
|
352
|
+
DB[:table].insert_conflict.insert(a: 1, b: 2)
|
207
353
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
208
354
|
# ON CONFLICT DO NOTHING
|
209
355
|
|
210
356
|
For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
|
211
357
|
|
212
|
-
DB[:table].insert_ignore.insert(:
|
358
|
+
DB[:table].insert_ignore.insert(a: 1, b: 2)
|
213
359
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
214
360
|
# ON CONFLICT DO NOTHING
|
215
361
|
|
216
362
|
You can pass a specific constraint name using +:constraint+, to only ignore a specific
|
217
363
|
constraint violation:
|
218
364
|
|
219
|
-
DB[:table].insert_conflict(:
|
365
|
+
DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
|
220
366
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
221
367
|
# ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
|
222
368
|
|
223
369
|
If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
|
224
370
|
index), then you can just specify the column using the +:target+ option:
|
225
371
|
|
226
|
-
DB[:table].insert_conflict(:
|
372
|
+
DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
227
373
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
228
374
|
# ON CONFLICT (a) DO NOTHING
|
229
375
|
|
@@ -231,20 +377,49 @@ If you want to update the existing row instead of ignoring the constraint violat
|
|
231
377
|
can pass an +:update+ option with a hash of values to update. You must pass either the
|
232
378
|
+:target+ or +:constraint+ options when passing the +:update+ option:
|
233
379
|
|
234
|
-
DB[:table].insert_conflict(:
|
380
|
+
DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
235
381
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
236
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)
|
237
395
|
|
238
396
|
Additionally, if you only want to do the update in certain cases, you can specify an
|
239
397
|
+:update_where+ option, which will be used as a filter. If the row doesn't match the
|
240
398
|
conditions, the constraint violation will be ignored, but the row will not be updated:
|
241
399
|
|
242
|
-
DB[:table].insert_conflict(
|
243
|
-
:
|
400
|
+
DB[:table].insert_conflict(constraint::table_a_uidx,
|
401
|
+
update: {b: Sequel[:excluded][:b]},
|
402
|
+
update_where: {Sequel[:table][:status_id]=>1}).insert(a: 1, b: 2)
|
244
403
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
245
404
|
# ON CONFLICT ON CONSTRAINT table_a_uidx
|
246
405
|
# DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
247
406
|
|
407
|
+
=== INSERT OVERRIDING SYSTEM|USER VALUE Support
|
408
|
+
|
409
|
+
PostgreSQL 10+ supports identity columns, which are designed to replace the serial
|
410
|
+
columns previously used for autoincrementing primary keys. You can use
|
411
|
+
Dataset#overriding_system_value and Dataset#overriding_user_value to use this new
|
412
|
+
syntax:
|
413
|
+
|
414
|
+
DB.create_table(:table){primary_key :id}
|
415
|
+
# Ignore the given value for id, using the identity's sequence value.
|
416
|
+
DB[:table].overriding_user_value.insert(:id=>1)
|
417
|
+
|
418
|
+
DB.create_table(:table){primary_key :id, :identity=>:always}
|
419
|
+
# Force the use of the given value for id, because otherwise the insert will
|
420
|
+
# raise an error, since GENERATED ALWAYS was used when creating the column.
|
421
|
+
DB[:table].overriding_system_value.insert(:id=>1)
|
422
|
+
|
248
423
|
=== Distinct On Specific Columns
|
249
424
|
|
250
425
|
Sequel allows passing columns to <tt>Dataset#distinct</tt>, which will make the dataset return
|
@@ -253,6 +428,28 @@ rows that are distinct on just those columns:
|
|
253
428
|
DB[:table].distinct(:id).all
|
254
429
|
# SELECT DISTINCT ON ("id") * FROM "table"
|
255
430
|
|
431
|
+
=== JOIN USING table alias
|
432
|
+
|
433
|
+
Sequel allows passing an SQL::AliasedExpression to join table methods to use a USING
|
434
|
+
join with a table alias for the USING columns:
|
435
|
+
|
436
|
+
DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
|
437
|
+
# SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"
|
438
|
+
|
439
|
+
=== Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
|
440
|
+
|
441
|
+
PostgreSQL 11+ added support for procedures, which are different from the user defined
|
442
|
+
functions that PostgreSQL has historically supported. These procedures are
|
443
|
+
called via a special +CALL+ syntax, and Sequel supports them via
|
444
|
+
<tt>Database#call_procedure</tt>:
|
445
|
+
|
446
|
+
DB.call_procedure(:foo, 1, "bar")
|
447
|
+
# CALL foo(1, 'bar')
|
448
|
+
|
449
|
+
<tt>Database#call_procedure</tt> will return a hash of return values if
|
450
|
+
the procedure returns a result, or +nil+ if the procedure does not return
|
451
|
+
a result.
|
452
|
+
|
256
453
|
=== Using a Cursor to Process Large Datasets <tt>postgres only</tt>
|
257
454
|
|
258
455
|
The postgres adapter offers a <tt>Dataset#use_cursor</tt> method to process large result sets
|
@@ -271,19 +468,19 @@ without keeping all rows in memory:
|
|
271
468
|
This support is used by default when using <tt>Dataset#paged_each</tt>.
|
272
469
|
|
273
470
|
Using cursors, it is possible to update individual rows of a large dataset
|
274
|
-
easily using the <tt
|
471
|
+
easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
|
275
472
|
<tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
|
276
473
|
update the rows exists in the application and not in the database:
|
277
474
|
|
278
|
-
ds.use_cursor(:
|
279
|
-
ds.where_current_of.update(:
|
475
|
+
ds.use_cursor(rows_per_fetch: 1).each do |row|
|
476
|
+
ds.where_current_of.update(col: new_col_value(row))
|
280
477
|
end
|
281
478
|
|
282
479
|
=== Truncate Modifiers
|
283
480
|
|
284
481
|
Sequel supports PostgreSQL-specific truncate options:
|
285
482
|
|
286
|
-
DB[:table].truncate(:
|
483
|
+
DB[:table].truncate(cascade: true, only: true, restart: true)
|
287
484
|
# TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
|
288
485
|
|
289
486
|
=== COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
|
@@ -292,14 +489,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
|
|
292
489
|
Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
|
293
490
|
a specific table or for an arbitrary dataset:
|
294
491
|
|
295
|
-
DB.copy_table(:table, :
|
492
|
+
DB.copy_table(:table, format: :csv)
|
296
493
|
# COPY "table" TO STDOUT (FORMAT csv)
|
297
|
-
DB.copy_table(DB[:table], :
|
494
|
+
DB.copy_table(DB[:table], format: :csv)
|
298
495
|
# COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
|
299
496
|
|
300
497
|
It supports putting data into the database via <tt>Database#copy_into</tt>:
|
301
498
|
|
302
|
-
DB.copy_into(:table, :
|
499
|
+
DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
|
303
500
|
# COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
|
304
501
|
|
305
502
|
=== Anonymous Function Execution
|
@@ -336,7 +533,7 @@ this blocks until the listening thread is notified:
|
|
336
533
|
Note that +listen+ by default only listens for a single notification. If you want to loop and process
|
337
534
|
notifications:
|
338
535
|
|
339
|
-
DB.listen(:channel, :
|
536
|
+
DB.listen(:channel, loop: true){|channel| p channel}
|
340
537
|
|
341
538
|
The +pg_static_cache_updater+ extension uses this support to automatically update
|
342
539
|
the caches for models using the +static_cache+ plugin. Look at the documentation of that
|
@@ -348,7 +545,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
|
|
348
545
|
handle locking:
|
349
546
|
|
350
547
|
DB[:table].lock('EXCLUSIVE') do
|
351
|
-
DB[:table].insert(:
|
548
|
+
DB[:table].insert(id: DB[:table].max(:id)+1)
|
352
549
|
end
|
353
550
|
# BEGIN;
|
354
551
|
# LOCK TABLE "table" IN EXCLUSIVE MODE;
|
@@ -356,18 +553,46 @@ handle locking:
|
|
356
553
|
# INSERT INTO "table" ("id") VALUES (2) RETURNING NULL;
|
357
554
|
# COMMIT;
|
358
555
|
|
556
|
+
== Extended Error Info (<tt>postgres/pg only</tt>)
|
557
|
+
|
558
|
+
If you run a query that raises a Sequel::DatabaseError, you can pass the exception object to
|
559
|
+
<tt>Database#error_info</tt>, and that will return a hash with metadata regarding the error,
|
560
|
+
such as the related table and column or constraint.
|
561
|
+
|
562
|
+
DB.create_table(:test1){primary_key :id}
|
563
|
+
DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
|
564
|
+
DB[:test2].insert(:test1_id=>1) rescue DB.error_info($!)
|
565
|
+
# => {
|
566
|
+
# :schema=>"public",
|
567
|
+
# :table=>"test2",
|
568
|
+
# :column=>nil,
|
569
|
+
# :constraint=>"test2_test1_id_fkey",
|
570
|
+
# :type=>nil,
|
571
|
+
# :severity=>"ERROR",
|
572
|
+
# :sql_state=>"23503",
|
573
|
+
# :message_primary=>"insert or update on table \"test2\" violates foreign key constraint \"test2_test1_id_fkey\"",
|
574
|
+
# :message_detail=>"Key (test1_id)=(1) is not present in table \"test1\"."
|
575
|
+
# :message_hint=>nil,
|
576
|
+
# :statement_position=>nil,
|
577
|
+
# :internal_position=>nil,
|
578
|
+
# :internal_query=>nil,
|
579
|
+
# :source_file=>"ri_triggers.c",
|
580
|
+
# :source_line=>"3321",
|
581
|
+
# :source_function=>"ri_ReportViolation"
|
582
|
+
# }
|
583
|
+
|
359
584
|
== sequel_pg (<tt>postgres/pg only</tt>)
|
360
585
|
|
361
586
|
When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
|
362
587
|
loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
|
363
|
-
resulting in a
|
588
|
+
resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
|
364
589
|
postgres adapter with pg.
|
365
590
|
|
366
|
-
sequel_pg has additional optimizations when using the Dataset +map+, +
|
591
|
+
sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
|
367
592
|
+to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
|
368
593
|
which avoids creating intermediate hashes and can add further speedups.
|
369
594
|
|
370
|
-
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2
|
595
|
+
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
|
371
596
|
support is similar to using a cursor, but it is faster and more transparent.
|
372
597
|
|
373
598
|
You can enable the streaming support:
|
@@ -7,14 +7,14 @@ the following adapters:
|
|
7
7
|
|
8
8
|
* ibmdb (prepared statements only)
|
9
9
|
* jdbc
|
10
|
-
* mysql (prepared statements
|
11
|
-
* mysql2 (prepared statements
|
10
|
+
* mysql (server prepared statements using literalized connection variables)
|
11
|
+
* mysql2 (full support on 0.4+, otherwise server prepared statements using literalized connection variables)
|
12
12
|
* oracle (requires type specifiers for nil/NULL values)
|
13
13
|
* postgres (when using the pg driver)
|
14
14
|
* sqlite
|
15
15
|
* tinytds
|
16
16
|
|
17
|
-
Support on other adapters is emulated
|
17
|
+
Support on other adapters is emulated.
|
18
18
|
|
19
19
|
You can use the prepared_statements model plugin to automatically use prepared
|
20
20
|
statements for some common model actions such as saving or deleting a model
|
@@ -29,7 +29,7 @@ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
|
|
29
29
|
that and allows you to specify placeholders by using the :$name format for
|
30
30
|
placeholders, e.g.:
|
31
31
|
|
32
|
-
ds = DB[:items].where(:
|
32
|
+
ds = DB[:items].where(name: :$n)
|
33
33
|
|
34
34
|
You can use these placeholders in most places where you can use the value
|
35
35
|
directly. For example, if you want to use placeholders while also using
|
@@ -41,45 +41,49 @@ raw SQL, you can do:
|
|
41
41
|
|
42
42
|
Using bound variables for this query is simple:
|
43
43
|
|
44
|
-
ds.call(:select, :
|
44
|
+
ds.call(:select, n: 'Jim')
|
45
45
|
|
46
46
|
This will do the equivalent of selecting records that have the name 'Jim'. It
|
47
47
|
returns all records, and can take a block that is passed to <tt>Dataset#all</tt>.
|
48
48
|
|
49
49
|
Deleting or returning the first record works similarly:
|
50
50
|
|
51
|
-
ds.call(:first, :
|
52
|
-
ds.call(:delete, :
|
51
|
+
ds.call(:first, n: 'Jim') # First record with name 'Jim'
|
52
|
+
ds.call(:delete, n: 'Jim') # Delete records with name 'Jim'
|
53
53
|
|
54
54
|
For inserting/updating records, you should also specify a value hash, which
|
55
55
|
may itself contain placeholders:
|
56
56
|
|
57
57
|
# Insert record with 'Jim', note that the previous filter is ignored
|
58
|
-
ds.call(:insert, {:
|
58
|
+
ds.call(:insert, {n: 'Jim'}, name: :$n)
|
59
59
|
# Change name to 'Bob' for all records with name of 'Jim'
|
60
|
-
ds.call(:update, {:
|
60
|
+
ds.call(:update, {n: 'Jim', new_n: 'Bob'}, name: :$new_n)
|
61
61
|
|
62
62
|
== Prepared Statements
|
63
63
|
|
64
64
|
Prepared statement support is similar to bound variable support, but you
|
65
65
|
use <tt>Dataset#prepare</tt> with a name, and <tt>Dataset#call</tt> or <tt>Database#call</tt> later with the values:
|
66
66
|
|
67
|
-
ds = DB[:items].
|
67
|
+
ds = DB[:items].where(name: :$n)
|
68
68
|
ps = ds.prepare(:select, :select_by_name)
|
69
|
-
|
70
|
-
|
69
|
+
|
70
|
+
ps.call(n: 'Jim')
|
71
|
+
DB.call(:select_by_name, n: 'Jim') # same
|
71
72
|
|
72
73
|
The <tt>Dataset#prepare</tt> method returns a prepared statement, and also stores a
|
73
74
|
copy of the prepared statement in the database for later use. For insert
|
74
75
|
and update queries, the hash to insert/update is passed to +prepare+:
|
75
76
|
|
76
|
-
ps1 = DB[:items].prepare(:insert, :insert_with_name, :
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
ps1 = DB[:items].prepare(:insert, :insert_with_name, name: :$n)
|
78
|
+
|
79
|
+
ps1.call(n: 'Jim')
|
80
|
+
DB.call(:insert_with_name, n: 'Jim') # same
|
81
|
+
|
82
|
+
ds = DB[:items].where(name: :$n)
|
83
|
+
ps2 = ds.prepare(:update, :update_name, name: :$new_n)
|
84
|
+
|
85
|
+
ps2.call(n: 'Jim', new_n: 'Bob')
|
86
|
+
DB.call(:update_name, n: 'Jim', new_n: 'Bob') # same
|
83
87
|
|
84
88
|
== Implementation Issues
|
85
89
|
|
@@ -92,7 +96,7 @@ to create prepared statements dynamically at runtime.
|
|
92
96
|
|
93
97
|
=== PostgreSQL
|
94
98
|
|
95
|
-
If you are using the
|
99
|
+
If you are using the postgres-pr driver, PostgreSQL uses the
|
96
100
|
default emulated support. If you are using ruby-pg, there is native support
|
97
101
|
for both prepared statements and bound variables. Prepared statements are
|
98
102
|
always server side.
|
@@ -103,9 +107,10 @@ SQLite supports both prepared statements and bound variables.
|
|
103
107
|
|
104
108
|
=== MySQL/Mysql2
|
105
109
|
|
106
|
-
The MySQL
|
107
|
-
variable methods
|
108
|
-
|
110
|
+
The MySQL and Mysql2 <0.4 ruby drivers do not support bound variables, so the bound
|
111
|
+
variable methods are emulated. It uses server side prepared statements.
|
112
|
+
|
113
|
+
Mysql2 0.4+ supports both prepared statements and bound variables.
|
109
114
|
|
110
115
|
=== JDBC
|
111
116
|
|
@@ -136,4 +141,4 @@ not currently supported.
|
|
136
141
|
|
137
142
|
=== All Others
|
138
143
|
|
139
|
-
Support is emulated
|
144
|
+
Support is emulated.
|