sequel 5.45.0 → 5.77.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +434 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +59 -27
- data/bin/sequel +11 -3
- data/doc/advanced_associations.rdoc +16 -14
- data/doc/association_basics.rdoc +119 -24
- data/doc/cheat_sheet.rdoc +11 -3
- data/doc/mass_assignment.rdoc +1 -1
- data/doc/migration.rdoc +27 -6
- data/doc/model_hooks.rdoc +1 -1
- data/doc/object_model.rdoc +8 -8
- data/doc/opening_databases.rdoc +28 -12
- data/doc/postgresql.rdoc +16 -8
- data/doc/querying.rdoc +5 -3
- 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.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.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.62.0.txt +132 -0
- data/doc/release_notes/5.63.0.txt +33 -0
- data/doc/release_notes/5.64.0.txt +50 -0
- data/doc/release_notes/5.65.0.txt +21 -0
- data/doc/release_notes/5.66.0.txt +24 -0
- data/doc/release_notes/5.67.0.txt +32 -0
- data/doc/release_notes/5.68.0.txt +61 -0
- data/doc/release_notes/5.69.0.txt +26 -0
- data/doc/release_notes/5.70.0.txt +35 -0
- data/doc/release_notes/5.71.0.txt +21 -0
- data/doc/release_notes/5.72.0.txt +33 -0
- data/doc/release_notes/5.73.0.txt +66 -0
- data/doc/release_notes/5.74.0.txt +45 -0
- data/doc/release_notes/5.75.0.txt +35 -0
- data/doc/release_notes/5.76.0.txt +86 -0
- data/doc/release_notes/5.77.0.txt +63 -0
- data/doc/schema_modification.rdoc +1 -1
- data/doc/security.rdoc +9 -9
- data/doc/sharding.rdoc +3 -1
- data/doc/sql.rdoc +27 -15
- data/doc/testing.rdoc +23 -13
- data/doc/transactions.rdoc +6 -6
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +1 -1
- data/lib/sequel/adapters/amalgalite.rb +3 -5
- data/lib/sequel/adapters/ibmdb.rb +3 -3
- data/lib/sequel/adapters/jdbc/derby.rb +8 -0
- data/lib/sequel/adapters/jdbc/h2.rb +63 -10
- data/lib/sequel/adapters/jdbc/hsqldb.rb +8 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +7 -4
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +15 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -0
- data/lib/sequel/adapters/jdbc.rb +24 -22
- data/lib/sequel/adapters/mysql.rb +92 -67
- data/lib/sequel/adapters/mysql2.rb +56 -51
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +4 -3
- data/lib/sequel/adapters/postgres.rb +89 -45
- data/lib/sequel/adapters/shared/access.rb +11 -1
- data/lib/sequel/adapters/shared/db2.rb +42 -0
- data/lib/sequel/adapters/shared/mssql.rb +91 -10
- data/lib/sequel/adapters/shared/mysql.rb +78 -3
- data/lib/sequel/adapters/shared/oracle.rb +86 -7
- data/lib/sequel/adapters/shared/postgres.rb +576 -171
- data/lib/sequel/adapters/shared/sqlanywhere.rb +21 -5
- data/lib/sequel/adapters/shared/sqlite.rb +92 -8
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +99 -18
- data/lib/sequel/adapters/tinytds.rb +1 -1
- data/lib/sequel/adapters/trilogy.rb +117 -0
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +5 -7
- data/lib/sequel/connection_pool/sharded_threaded.rb +16 -11
- data/lib/sequel/connection_pool/sharded_timed_queue.rb +374 -0
- data/lib/sequel/connection_pool/single.rb +6 -8
- data/lib/sequel/connection_pool/threaded.rb +14 -8
- data/lib/sequel/connection_pool/timed_queue.rb +270 -0
- data/lib/sequel/connection_pool.rb +57 -31
- data/lib/sequel/core.rb +17 -18
- data/lib/sequel/database/connecting.rb +27 -3
- data/lib/sequel/database/dataset.rb +16 -6
- data/lib/sequel/database/misc.rb +70 -14
- data/lib/sequel/database/query.rb +73 -2
- data/lib/sequel/database/schema_generator.rb +11 -6
- data/lib/sequel/database/schema_methods.rb +23 -4
- data/lib/sequel/database/transactions.rb +6 -0
- data/lib/sequel/dataset/actions.rb +111 -15
- data/lib/sequel/dataset/deprecated_singleton_class_methods.rb +42 -0
- data/lib/sequel/dataset/features.rb +20 -1
- data/lib/sequel/dataset/misc.rb +12 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +20 -9
- data/lib/sequel/dataset/query.rb +170 -41
- data/lib/sequel/dataset/sql.rb +190 -71
- data/lib/sequel/dataset.rb +4 -0
- data/lib/sequel/extensions/_model_pg_row.rb +0 -12
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/any_not_empty.rb +2 -2
- data/lib/sequel/extensions/async_thread_pool.rb +14 -13
- data/lib/sequel/extensions/auto_cast_date_and_time.rb +94 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/connection_expiration.rb +15 -9
- data/lib/sequel/extensions/connection_validator.rb +16 -11
- data/lib/sequel/extensions/constraint_validations.rb +1 -1
- data/lib/sequel/extensions/core_refinements.rb +36 -11
- data/lib/sequel/extensions/date_arithmetic.rb +36 -8
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +5 -1
- data/lib/sequel/extensions/duplicate_columns_handler.rb +11 -10
- data/lib/sequel/extensions/index_caching.rb +5 -1
- data/lib/sequel/extensions/inflector.rb +1 -1
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +3 -0
- data/lib/sequel/extensions/migration.rb +57 -15
- data/lib/sequel/extensions/named_timezones.rb +22 -6
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +33 -4
- data/lib/sequel/extensions/pg_array_ops.rb +2 -2
- data/lib/sequel/extensions/pg_auto_parameterize.rb +509 -0
- data/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +110 -0
- data/lib/sequel/extensions/pg_enum.rb +1 -2
- data/lib/sequel/extensions/pg_extended_date_support.rb +39 -28
- data/lib/sequel/extensions/pg_extended_integer_support.rb +116 -0
- data/lib/sequel/extensions/pg_hstore.rb +6 -1
- data/lib/sequel/extensions/pg_hstore_ops.rb +53 -3
- data/lib/sequel/extensions/pg_inet.rb +10 -11
- data/lib/sequel/extensions/pg_inet_ops.rb +1 -1
- data/lib/sequel/extensions/pg_interval.rb +11 -11
- data/lib/sequel/extensions/pg_json.rb +13 -15
- data/lib/sequel/extensions/pg_json_ops.rb +125 -2
- data/lib/sequel/extensions/pg_multirange.rb +367 -0
- data/lib/sequel/extensions/pg_range.rb +13 -26
- data/lib/sequel/extensions/pg_range_ops.rb +37 -9
- data/lib/sequel/extensions/pg_row.rb +20 -19
- data/lib/sequel/extensions/pg_row_ops.rb +1 -1
- data/lib/sequel/extensions/pg_timestamptz.rb +27 -3
- data/lib/sequel/extensions/round_timestamps.rb +1 -1
- data/lib/sequel/extensions/s.rb +2 -1
- data/lib/sequel/extensions/schema_caching.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +45 -11
- data/lib/sequel/extensions/server_block.rb +10 -13
- data/lib/sequel/extensions/set_literalizer.rb +58 -0
- data/lib/sequel/extensions/sql_comments.rb +110 -3
- 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 +1 -1
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +2 -0
- data/lib/sequel/extensions/transaction_connection_validator.rb +78 -0
- data/lib/sequel/model/associations.rb +286 -92
- data/lib/sequel/model/base.rb +53 -33
- data/lib/sequel/model/dataset_module.rb +3 -0
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/exceptions.rb +15 -3
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +74 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/column_encryption.rb +29 -8
- data/lib/sequel/plugins/composition.rb +3 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +4 -4
- data/lib/sequel/plugins/constraint_validations.rb +8 -5
- data/lib/sequel/plugins/defaults_setter.rb +16 -0
- data/lib/sequel/plugins/dirty.rb +1 -1
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/finder.rb +4 -2
- data/lib/sequel/plugins/insert_conflict.rb +4 -0
- data/lib/sequel/plugins/instance_specific_default.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +3 -0
- data/lib/sequel/plugins/list.rb +8 -3
- data/lib/sequel/plugins/many_through_many.rb +109 -10
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -38
- data/lib/sequel/plugins/nested_attributes.rb +4 -4
- data/lib/sequel/plugins/optimistic_locking.rb +9 -42
- data/lib/sequel/plugins/optimistic_locking_base.rb +55 -0
- data/lib/sequel/plugins/paged_operations.rb +181 -0
- data/lib/sequel/plugins/pg_array_associations.rb +46 -34
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +9 -3
- data/lib/sequel/plugins/pg_xmin_optimistic_locking.rb +109 -0
- data/lib/sequel/plugins/prepared_statements.rb +12 -2
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -1
- data/lib/sequel/plugins/primary_key_lookup_check_values.rb +154 -0
- data/lib/sequel/plugins/rcte_tree.rb +7 -4
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +1 -0
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +8 -0
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +39 -1
- data/lib/sequel/plugins/static_cache_cache.rb +5 -1
- data/lib/sequel/plugins/subclasses.rb +28 -11
- data/lib/sequel/plugins/tactical_eager_loading.rb +23 -10
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validate_associated.rb +22 -12
- data/lib/sequel/plugins/validation_helpers.rb +41 -11
- data/lib/sequel/plugins/validation_helpers_generic_type_messages.rb +73 -0
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/timezones.rb +12 -14
- data/lib/sequel/version.rb +1 -1
- metadata +109 -19
@@ -0,0 +1,27 @@
|
|
1
|
+
= New Feature
|
2
|
+
|
3
|
+
* An enum plugin has been added. This plugin allows you to create
|
4
|
+
model-level enums, giving names to underlying values of a column.
|
5
|
+
For example:
|
6
|
+
|
7
|
+
Album.plugin :enum
|
8
|
+
Album.enum :status_id, good: 1, bad: 2
|
9
|
+
|
10
|
+
Adds Album#good! and Album#bad! for changing the status_id to 1 or
|
11
|
+
2 respectively. It adds Album#good? and Album#bad? for checking
|
12
|
+
whether the status_id is 1 or 2 respectively. It overrides
|
13
|
+
Album#status_id to return :good or :bad instead of 1 or 2,
|
14
|
+
respectively, and overrides Album#status_id= to accept :good or
|
15
|
+
:bad instead of 1 or 2 respectively.
|
16
|
+
|
17
|
+
Additionally, it adds good and bad dataset methods for filtering
|
18
|
+
the model's dataset to records where status_id is 1 or 2
|
19
|
+
respectively. It also adds not_good and not_bad dataset methods
|
20
|
+
for filtering the model's dataset to records where status_id is not
|
21
|
+
1 or not 2 respectively.
|
22
|
+
|
23
|
+
You can use :prefix and :suffix options when calling enum to
|
24
|
+
add a prefix or suffix to the method names created. You can
|
25
|
+
set the :override_accessors option to false to not override
|
26
|
+
the accessor methods for the column, and set the :dataset_methods
|
27
|
+
option to false to not add dataset methods.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* An auto_restrict_eager_graph plugin has been added for automatically
|
4
|
+
disallowing the use of eager_graph with associations using blocks but
|
5
|
+
lacking graph_* options. This can prevent potentionally invalid usage,
|
6
|
+
as the restrictions added by the block are not used by eager_graph.
|
7
|
+
|
8
|
+
* The sqlite adapter now supports the :setup_regexp_function
|
9
|
+
Database option. This option will define a REGEXP function in the
|
10
|
+
database that will allow regexp support in queries, such as:
|
11
|
+
|
12
|
+
DB[:table].where(column: /(some|pattern)/)
|
13
|
+
|
14
|
+
Note that this creates a Ruby Regexp object per column value tested,
|
15
|
+
so it isn't the most optimal approach.
|
16
|
+
|
17
|
+
= Other Improvements
|
18
|
+
|
19
|
+
* Calling dataset aggregate methods such as #max on a model dataset now
|
20
|
+
works correctly. Previously, it could fail if called enough times to
|
21
|
+
optimize using a placeholder literalizer.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On SQLite, Database#create_table now supports a :strict option to
|
4
|
+
use the STRICT keyword when creating the table. When this option
|
5
|
+
is used, SQLite will enforce the types for each column. When using
|
6
|
+
this option, you are limited to using the following column types:
|
7
|
+
int, integer, real, text, blob, and any (any allows for dynamic
|
8
|
+
types).
|
9
|
+
|
10
|
+
* An sqlite_json_ops extension has been added, providing DSL support
|
11
|
+
for JSON functions and operators supported in SQLite 3.38.0. Usage
|
12
|
+
is similar to the pg_json_ops extension. First, you create an
|
13
|
+
appropriate object:
|
14
|
+
|
15
|
+
j = Sequel.sqlite_json_op(:json_column)
|
16
|
+
# or:
|
17
|
+
j = Sequel[:json_column].sqlite_json_op
|
18
|
+
|
19
|
+
Then, you call methods on that object to create expressions for the
|
20
|
+
JSON functions and operators:
|
21
|
+
|
22
|
+
j[1] # (json_column ->> 1)
|
23
|
+
j.get_text(1) # (json_column -> 1)
|
24
|
+
j.extract('$.a') # json_extract(json_column, '$.a')
|
25
|
+
|
26
|
+
j.array_length # json_array_length(json_column)
|
27
|
+
j.type # json_type(json_column)
|
28
|
+
j.valid # json_valid(json_column)
|
29
|
+
j.json # json(json_column)
|
30
|
+
|
31
|
+
j.insert('$.a', 1) # json_insert(json_column, '$.a', 1)
|
32
|
+
j.set('$.a', 1) # json_set(json_column, '$.a', 1)
|
33
|
+
j.replace('$.a', 1) # json_replace(json_column, '$.a', 1)
|
34
|
+
j.remove('$.a') # json_remove(json_column, '$.a')
|
35
|
+
j.patch('{"a":2}') # json_patch(json_column, '{"a":2}')
|
36
|
+
|
37
|
+
j.each # json_each(json_column)
|
38
|
+
j.tree # json_tree(json_column)
|
39
|
+
|
40
|
+
= Other Improvements
|
41
|
+
|
42
|
+
* The alter_table add_column and add_foreign_key methods now support
|
43
|
+
the :index option to create an index on the added column, for
|
44
|
+
compatibility with the :index option on the create_table column and
|
45
|
+
foreign_key methods.
|
46
|
+
|
47
|
+
* The schema_dumper extension now treats the "INTEGER" type the same
|
48
|
+
as the "integer" type. This fixes some behavior when using SQLite
|
49
|
+
3.37.0+.
|
50
|
+
|
51
|
+
* Sequel's website has a much improved visual design.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* An is_distinct_from extension has been added with support for the
|
4
|
+
SQL IS DISTINCT FROM operator. This operator is similar to the
|
5
|
+
not equals operator, except in terms of NULL handling. It returns
|
6
|
+
true if only one side is NULL, and false if both sides are NULL.
|
7
|
+
You can call is_distinct_from on Sequel itself or on Sequel objects:
|
8
|
+
|
9
|
+
Sequel.is_distinct_from(:column_a, :column_b)
|
10
|
+
Sequel[:column_a].is_distinct_from(:column_b)
|
11
|
+
# (column_a IS DISTINCT FROM column_b)
|
12
|
+
|
13
|
+
On databases not supporting IS DISTINCT FROM, support is emulated
|
14
|
+
using a CASE statement.
|
15
|
+
|
16
|
+
* Column definitions on MySQL can use the :on_update_current_timestamp
|
17
|
+
option for ON UPDATE CURRENT_TIMESTAMP, which creates a column that
|
18
|
+
will automatically have its value set to CURRENT_TIMESTAMP on every
|
19
|
+
update.
|
20
|
+
|
21
|
+
* Database#create_function on PostgreSQL now supports a :parallel
|
22
|
+
option to set the thread safety of the funciton. The value should
|
23
|
+
be :safe, :unsafe, or :restricted.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Dataset#merge and related #merge_* methods have been added for the
|
4
|
+
MERGE statement. MERGE is supported on PostgreSQL 15+, Oracle,
|
5
|
+
Microsoft SQL Server, DB2, H2, HSQLDB, and Derby. You can use MERGE
|
6
|
+
to insert, update, and/or delete in a single query. You call
|
7
|
+
the #merge_* methods to setup the MERGE statement, and #merge to
|
8
|
+
execute it on the database:
|
9
|
+
|
10
|
+
ds = DB[:m1]
|
11
|
+
merge_using(:m2, i1: :i2).
|
12
|
+
merge_insert(i1: :i2, a: Sequel[:b]+11).
|
13
|
+
merge_delete{a > 30}.
|
14
|
+
merge_update(i1: Sequel[:i1]+:i2+10, a: Sequel[:a]+:b+20)
|
15
|
+
|
16
|
+
ds.merge
|
17
|
+
# MERGE INTO m1 USING m2 ON (i1 = i2)
|
18
|
+
# WHEN NOT MATCHED THEN INSERT (i1, a) VALUES (i2, (b + 11))
|
19
|
+
# WHEN MATCHED AND (a > 30) THEN DELETE
|
20
|
+
# WHEN MATCHED THEN UPDATE SET i1 = (i1 + i2 + 10), a = (a + b + 20)
|
21
|
+
|
22
|
+
On PostgreSQL, the following additional MERGE related methods are
|
23
|
+
available:
|
24
|
+
|
25
|
+
* #merge_do_nothing_when_matched
|
26
|
+
* #merge_do_nothing_when_not_matched
|
27
|
+
|
28
|
+
* A :disable_split_materialized Database option is now supported on
|
29
|
+
MySQL. This disables split_materialized support in the optimizer,
|
30
|
+
working around a bug in MariaDB 10.5+ that causes failures in
|
31
|
+
Sequel's association tests.
|
@@ -0,0 +1,73 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A require_valid_schema plugin has been added, for checking that
|
4
|
+
model classes have schema parsed as expected. By default, model
|
5
|
+
classes are not required to have valid schema, because it is
|
6
|
+
allowed to have model classes based on arbitrary datasets (such
|
7
|
+
as those using joins or set-returning functions), and it is not
|
8
|
+
possible to determine the schema for arbitary datasets.
|
9
|
+
|
10
|
+
Sequel swallows non-connection errors when trying to parse schema
|
11
|
+
for a model's dataset, but if schema parsing fails when you would
|
12
|
+
expect it to succeed, it results in a model where typecasting does
|
13
|
+
not work as expected.
|
14
|
+
|
15
|
+
The require_valid_schema plugin will raise an error when setting
|
16
|
+
the dataset for a model if schema parsing fails and the dataset
|
17
|
+
uses a simple table where you would expect schema parsing to
|
18
|
+
succeed. You can also provide an argument of :warn when loading
|
19
|
+
the plugin, to warn instead of raising an error.
|
20
|
+
|
21
|
+
This plugin may not work correctly in all cases for all adapters,
|
22
|
+
especially external adapters. Adapters are not required to support
|
23
|
+
schema parsing. Even if supported, adapters may not support
|
24
|
+
parsing schema for qualified tables, or parsing schema for views.
|
25
|
+
You should consider this plugin as a possible safety net. Users
|
26
|
+
are encouraged to try using it and report any unexpected breakage,
|
27
|
+
as that may help improve schema parsing in adapters that Sequel
|
28
|
+
ships.
|
29
|
+
|
30
|
+
* is_json and is_not_json methods have been added to the pg_json_ops
|
31
|
+
extension, for the IS [NOT] JSON operator supported in PostgreSQL
|
32
|
+
15+.
|
33
|
+
|
34
|
+
* Index creation methods on PostgreSQL 15+ now support a
|
35
|
+
:nulls_distinct option, for NULLS [NOT] DISTINCT. This allows you
|
36
|
+
to create unique indexes where NULL values are not considered
|
37
|
+
distinct.
|
38
|
+
|
39
|
+
* View creation methods on PostgreSQL 15+ now support a
|
40
|
+
:security_invoker option to create a view where access is
|
41
|
+
determined by the permissions of the role that is accessing the
|
42
|
+
view, instead of the role that created the view.
|
43
|
+
|
44
|
+
= Other Improvements
|
45
|
+
|
46
|
+
* The :allow_eager association option is now set to false by default
|
47
|
+
for associations explicitly marked as :instance_specific, if the
|
48
|
+
:eager_loader association is not given.
|
49
|
+
|
50
|
+
* The postgres adapter now supports the sequel-postgres-pr driver.
|
51
|
+
The sequel-postgres-pr driver is a slimmed down fork of the
|
52
|
+
postgres-pr driver designed specifically for use by Sequel.
|
53
|
+
|
54
|
+
* Model code that explicitly does not swallow connection errors
|
55
|
+
will also now not swallow disconnect errors. This can fix issues
|
56
|
+
where model classes are being loaded at runtime, and the query to
|
57
|
+
get the columns/schema for the model uses a connection that has
|
58
|
+
been disconnected.
|
59
|
+
|
60
|
+
* Model classes created from aliased expressions and literal
|
61
|
+
strings no longer use the simple_table optimization, as there
|
62
|
+
are cases where doing so is not safe.
|
63
|
+
|
64
|
+
= Backwards Compatibility
|
65
|
+
|
66
|
+
* The change to not swallow disconnect errors when not swallowing
|
67
|
+
connection errors can result in exceptions being raised which
|
68
|
+
weren't raised previously. In most cases, this will alert you
|
69
|
+
to issues in your application that should be fixed, but it
|
70
|
+
potentially it can result in regressions if you were OK with
|
71
|
+
the errors being swallowed. If this does result in regressions
|
72
|
+
in your application, please file an issue and we can probably
|
73
|
+
add a setting controlling this feature.
|
@@ -0,0 +1,22 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* The date_arithmetic extension now supports arbitrary expressions
|
4
|
+
as interval values on PostgreSQL 9.4+. Previously, only integers
|
5
|
+
were supported for the interval values.
|
6
|
+
|
7
|
+
= Other Improvements
|
8
|
+
|
9
|
+
* Most Kernel#respond_to? calls have been converted to equivalent
|
10
|
+
defined? calls for better performance. defined? is a keyword
|
11
|
+
and is about 50% faster for the same behavior.
|
12
|
+
|
13
|
+
* The is_distinct_from extension now supports the IS DISTINCT FROM
|
14
|
+
syntax natively on SQLite 3.39+, instead of emulating it.
|
15
|
+
|
16
|
+
* HAVING without GROUP BY is now supported on SQLite 3.39+.
|
17
|
+
|
18
|
+
* Coverage testing has been significantly expanded. Previously,
|
19
|
+
the core, model, plugin, and extension code had 100% line/branch
|
20
|
+
coverage. 100% line/branch coverage has been added for the
|
21
|
+
core extensions, bin/sequel, and the postgres adapter with the
|
22
|
+
pg driver.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* When typecasting strings to other types, Sequel::Database will now
|
4
|
+
by default not typecast strings that are much longer than expected
|
5
|
+
for the underlying type. Depending on the underlying type, there
|
6
|
+
is a limit of either 100 or 1000 bytes on the input string. This
|
7
|
+
avoids potential performance issues when trying to convert
|
8
|
+
arbitrary sized user input to specific types.
|
9
|
+
|
10
|
+
* The respond_to? to defined? change made in 5.60.0 was reverted in
|
11
|
+
5.60.1 as it broke cases on Ruby < 3 where the object had an unused
|
12
|
+
refinement that added the method.
|
13
|
+
|
14
|
+
* When typecasting strings to integer, strings such as -0xa are now
|
15
|
+
treated as negative hexidecimal strings, similar to how 0xa is
|
16
|
+
treated as a positive hexidecimal string.
|
17
|
+
|
18
|
+
* Database#foreign_key_list now returns results for partitioned
|
19
|
+
tables on PostgreSQL 11+.
|
20
|
+
|
21
|
+
* Timestamps before the date of calendar reform are now handled
|
22
|
+
correctly by the pg_extended_date_support extension when using
|
23
|
+
Ruby 3.2 preview 2+.
|
24
|
+
|
25
|
+
= Backwards Compatibility
|
26
|
+
|
27
|
+
* The change to not typecast strings that are too long can break
|
28
|
+
backwards compatibility for applications that expect typecasting
|
29
|
+
for input beyond Sequel's limits. You can disable the string
|
30
|
+
bytesize checking by setting:
|
31
|
+
|
32
|
+
DB.check_string_typecast_bytesize = false
|
33
|
+
|
34
|
+
or by passing the check_string_typecast_bytesize: false option when
|
35
|
+
creating the Database instance.
|
36
|
+
|
37
|
+
* Code to workaround a bug in JRuby 9.2.0.0 has been removed from the
|
38
|
+
pg_extended_date_support extension. Users of the extension should
|
39
|
+
upgrade to a newer JRuby version.
|
40
|
+
|
41
|
+
* The is_json and is_not_json methods have been removed from the
|
42
|
+
pg_json_ops extension, as the underlying support was removed in
|
43
|
+
PostgreSQL 15 beta 4.
|
@@ -0,0 +1,132 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* The pg_auto_parameterize extension for automatically using bound
|
4
|
+
variables when using postgres adapter with the pg driver has been
|
5
|
+
added back to Sequel. This extension was originally added in Sequel
|
6
|
+
3.34.0, but was removed in 4.0.0 due to the many corner cases it
|
7
|
+
had. Almost all of the corner cases have now been fixed, and
|
8
|
+
the extension is now recommended for production use. Compared
|
9
|
+
to the original version in Sequel 3, the reintroduced version
|
10
|
+
of the extension includes the following changes:
|
11
|
+
|
12
|
+
* Handles integers used in LIMIT/ORDER
|
13
|
+
* Respects explicit CASTs
|
14
|
+
* Tries to convert column IN (int, ...) into column = ANY($) with an
|
15
|
+
array parameter
|
16
|
+
* Uses the same parameter for the same object used more than once in
|
17
|
+
a query
|
18
|
+
* Uses parameters when inserting multiple rows via Dataset#import
|
19
|
+
* Supports automatically parameterizing all of the
|
20
|
+
PostgreSQL-specific types that Sequel ships support for in pg_*
|
21
|
+
extensions (though some values of those types may not support
|
22
|
+
automatic parameterization).
|
23
|
+
* Supports skipping auto parameterization for specific values.
|
24
|
+
|
25
|
+
Automatic parameterization is generally slower than Sequel's default
|
26
|
+
behavior, since some optimizations Sequel uses by default do not
|
27
|
+
currently support automatic parameterization.
|
28
|
+
|
29
|
+
Applications may need changes to work correctly with the
|
30
|
+
pg_auto_parameterize extension, such as the addition of explicit
|
31
|
+
casts. Please read the extension documentation for more details.
|
32
|
+
|
33
|
+
* Integer column schema entries now include :min_value and :max_value
|
34
|
+
entries on most databases, indicating the minimum and maximum values
|
35
|
+
supported for the column.
|
36
|
+
|
37
|
+
The validation_helpers plugin now has validates_max_value and
|
38
|
+
validates_min_value for testing the column value is not greater
|
39
|
+
than the given maximum value and not less than the given minimum
|
40
|
+
value, respectively.
|
41
|
+
|
42
|
+
The auto_validations plugin now automatically uses the :min_value
|
43
|
+
and :max_value column schema entries with the new validation_helpers
|
44
|
+
methods to validate that the column values for integer columns are
|
45
|
+
in the allowed range.
|
46
|
+
|
47
|
+
* A primary_key_lookup_check_values plugin has been added for
|
48
|
+
automatically typecasting and checking the primary key values are
|
49
|
+
in the allowed range (given by :min_value and :max_value column
|
50
|
+
schema entries) during lookup. If typecasting fails or the value
|
51
|
+
is outside the allowed range, the primary key lookup will return
|
52
|
+
nil without issuing a query (or will raise a NoMatchingRow error
|
53
|
+
if using with_pk!).
|
54
|
+
|
55
|
+
Note that this can change behavior in some cases if you are
|
56
|
+
passing filter conditions during lookup instead of passing primary
|
57
|
+
key values. The plugin tries to support most common filter
|
58
|
+
conditions, but there are still cases that will break.
|
59
|
+
|
60
|
+
* Sequel now supports shard-specific :after_connect and :connect_sqls
|
61
|
+
Database options, allowing you to customize behavior for specific
|
62
|
+
shards:
|
63
|
+
|
64
|
+
DB = Sequel.connect('url', servers: {
|
65
|
+
:shard1 => {host: '...', after_connect: proc{|conn|}},
|
66
|
+
:shard2 => {host: '...', connect_sqls: ['...']},
|
67
|
+
})
|
68
|
+
|
69
|
+
Note that these shard-specific options will not be respected if you
|
70
|
+
are calling after_connect= or connect_sqls= on the Database's
|
71
|
+
connection pool.
|
72
|
+
|
73
|
+
= Other Improvements
|
74
|
+
|
75
|
+
* A Sequel::Postgres::IntegerOutsideBigintRange exception will now be
|
76
|
+
raised if trying to literalize an integer outside PostgreSQL bigint
|
77
|
+
range, to avoid PostgreSQL treating the integer as a numeric type
|
78
|
+
and not respecting indexes on the related column.
|
79
|
+
|
80
|
+
A pg_extended_integer_support extension has been added for
|
81
|
+
customizing the behavior when literalizing an integer outside
|
82
|
+
PostgreSQL bigint range, either quoting it or getting the
|
83
|
+
historical behavior of using it directly in the query.
|
84
|
+
|
85
|
+
* Dataset#import and #multi_insert no longer use transactions when
|
86
|
+
they only run a single query.
|
87
|
+
|
88
|
+
* Fractional seconds in timestamps are now respected in the
|
89
|
+
named_timezones extension.
|
90
|
+
|
91
|
+
* Using hstore[] types as bound variables now works on PostgreSQL.
|
92
|
+
|
93
|
+
* Using BC dates and timestamps in bound variables now works on
|
94
|
+
PostgreSQL.
|
95
|
+
|
96
|
+
* A corner case has been fixed in eager loading where the window
|
97
|
+
function eager limit strategy would be used without removing the
|
98
|
+
row_number entries from the result.
|
99
|
+
|
100
|
+
* The shared postgres adapter now caches reflection datasets, speeding
|
101
|
+
up Database#indexes and similar methods.
|
102
|
+
|
103
|
+
* The mock postgres adapter now assumes PostgreSQL 15 instead of
|
104
|
+
PostgreSQL 14 by default.
|
105
|
+
|
106
|
+
= Backwards Compatibility
|
107
|
+
|
108
|
+
* If you are using Ruby integers outside PostgreSQL bigint range when
|
109
|
+
dealing with PostgreSQL numeric column values, this version may
|
110
|
+
not be compatible. It is recommended you explicitly convert the
|
111
|
+
Ruby integers to BigDecimal objects if you are using them for
|
112
|
+
numeric column values. You can also use the
|
113
|
+
pg_extended_integer_support extension introduced in this version.
|
114
|
+
|
115
|
+
= Workaround for Older Versions
|
116
|
+
|
117
|
+
* If you cannot upgrade to Sequel 5.62.0, but still want to avoid the
|
118
|
+
problems that come from using literal large integers on PostgreSQL,
|
119
|
+
you can use the following code, where DB is your Sequel::Database
|
120
|
+
object:
|
121
|
+
|
122
|
+
DB.extend_datasets do
|
123
|
+
def literal_integer(v)
|
124
|
+
if v > 9223372036854775807 || v < -9223372036854775808
|
125
|
+
raise Sequel::InvalidValue, "PostgreSQL int too large: #{v}"
|
126
|
+
end
|
127
|
+
super
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
This workaround should work all the way back to Sequel 3.29.0,
|
132
|
+
released in November 2011.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On Ruby 3.2, the pool_class: :timed_queue Database option can now
|
4
|
+
be used to use an alternative connection pool that stores
|
5
|
+
connections in a queue, and uses the new Queue#pop :timeout option
|
6
|
+
in Ruby 3.2 to implement the pool timeout. This new connection
|
7
|
+
pool is simpler than the default connection pool. It is not yet
|
8
|
+
the default connection pool on Ruby 3.2, but it may become the
|
9
|
+
default in a later version. Users of Ruby 3.2 are encouraged to
|
10
|
+
try out the pool_class: :timed_queue Database option and provide
|
11
|
+
feedback on how it works in their application.
|
12
|
+
|
13
|
+
= Other Improvements
|
14
|
+
|
15
|
+
* The tactical_eager_loading plugin now works in combination with the
|
16
|
+
single_table_inheritance and class_table_inheritance plugins, when
|
17
|
+
loading an association only defined in a specific subclass.
|
18
|
+
Previously, eager loading would be skipped in such a case. Now,
|
19
|
+
an eager load will be attempted for all instances supporting the
|
20
|
+
association.
|
21
|
+
|
22
|
+
* The validate_associated plugin now avoids database type errors for
|
23
|
+
non-integer association keys. In cases where the associated object
|
24
|
+
doesn't have a value for the associated key, and the current object
|
25
|
+
does not have a key value that can be set in the associated object,
|
26
|
+
validation errors in the associated object related to the associated
|
27
|
+
key will be ignored.
|
28
|
+
|
29
|
+
* Thread-keyed connection pool hashes now use compare_by_identity for
|
30
|
+
better performance.
|
31
|
+
|
32
|
+
* The JRuby workaround in the named_timezones extension is no longer
|
33
|
+
used on JRuby 9.3.9.0+, as JRuby fixed the related bug.
|
@@ -0,0 +1,50 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A :graph_use_association_block association option has been added,
|
4
|
+
which makes eager_graph use the association block (as eager does),
|
5
|
+
generally resulting in a JOIN to a subquery:
|
6
|
+
|
7
|
+
Artist.one_to_many :tracks, graph_use_association_block: true do |ds|
|
8
|
+
ds.where(foo: 3)
|
9
|
+
end
|
10
|
+
Artist.eager_graph(:tracks)
|
11
|
+
# SELECT albums.id, tracks.id AS tracks_id, tracks.album_id
|
12
|
+
# FROM albums
|
13
|
+
# LEFT OUTER JOIN (SELECT * FROM tracks WHERE (foo = 3)) AS tracks
|
14
|
+
# ON (tracks.album_id = albums.id)
|
15
|
+
|
16
|
+
Assuming that the database can optimize the query correctly, using
|
17
|
+
the :graph_use_association_block option is probably simpler than
|
18
|
+
than using other :graph_* options to duplicate the conditions added
|
19
|
+
by the association block.
|
20
|
+
|
21
|
+
* Numeric/Decimal column schema entries now include :min_value and
|
22
|
+
:max_value entries on most databases, indicating the minimum and
|
23
|
+
maximum values supported for the column. Similar to the support
|
24
|
+
for integer columns added in 5.62.0, this allows the
|
25
|
+
auto_validations plugin to automatically validate the values of
|
26
|
+
the columns are in the allowed range.
|
27
|
+
|
28
|
+
= Other Improvements
|
29
|
+
|
30
|
+
* many_through_{one,many} associations now support eager_graph
|
31
|
+
callbacks.
|
32
|
+
|
33
|
+
* The :db_type column schema entries on SQLAnywhere now include
|
34
|
+
precision/scale information, to work with the numeric/decimal
|
35
|
+
column min_value/max_value support.
|
36
|
+
|
37
|
+
* The oracle adapter now includes a :column_size column schema
|
38
|
+
entry containing the precision of the columns, to work with the
|
39
|
+
numeric/decimal column min_value/max_value support.
|
40
|
+
|
41
|
+
= Backwards Compatibility
|
42
|
+
|
43
|
+
* The private Database#column_schema_integer_min_max_values method
|
44
|
+
added in 5.62.0 now takes a column schema hash instead of a
|
45
|
+
database type string.
|
46
|
+
|
47
|
+
* Code that previously looked at the :db_type column schema entry on
|
48
|
+
SQLAnywhere should be updated to look at the :domain_name entry, and
|
49
|
+
code that looked at the :domain_name_with_size entry should be
|
50
|
+
updated to look at the :db_type entry.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* The pg_auto_parameterize extension now uses a modified placeholder
|
4
|
+
literalizer for speeding up the generation of SQL queries in the same
|
5
|
+
cases where a standard dataset would use a placeholder literalizer.
|
6
|
+
This can provide a 4% speedup for simple queries, with greater
|
7
|
+
speedups for more complex queries.
|
8
|
+
|
9
|
+
* Database#indexes now returns indexes for partitioned tables on
|
10
|
+
PostgreSQL 11+.
|
11
|
+
|
12
|
+
* MySQL versions not supporting CHECK constraints no longer include
|
13
|
+
:min_value/:max_value schema entries for decimal/numeric columns.
|
14
|
+
|
15
|
+
= Backwards Compatibility
|
16
|
+
|
17
|
+
* The Dataset::PlaceholderLiterlizer::Record.loader API has changed,
|
18
|
+
it now accepts the Dataset::PlaceholderLiterlizer class to use as
|
19
|
+
the first argument. This makes it easier to create
|
20
|
+
Dataset::PlaceholderLiterlizer subclasses, such as the one now used
|
21
|
+
by the pg_auto_parameterize extension.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* Dataset#empty? now correctly handles datasets using custom SQL or
|
4
|
+
Dataset#values where the first value in the first row is NULL.
|
5
|
+
|
6
|
+
* Dataset#count without an argument or block now works correctly on
|
7
|
+
Microsoft SQL Server when using custom SQL that uses ORDER BY.
|
8
|
+
|
9
|
+
* Dataset#count now works correctly for datasets using Dataset#values.
|
10
|
+
|
11
|
+
* Sequel now recognizes an additional SQLite constraint violation
|
12
|
+
error that occurs with recent versions of amalgalite.
|
13
|
+
|
14
|
+
* Dataset#values will now raise an exception when called with an empty
|
15
|
+
array. Previously, an exception would not be raised until the query
|
16
|
+
was sent to the database.
|
17
|
+
|
18
|
+
= Backwards Compatibility
|
19
|
+
|
20
|
+
* The changes to make Dataset#empty? and #count work with custom SQL
|
21
|
+
on Microsoft SQL Server now result in running the custom SQL, which
|
22
|
+
could result in worse performance than in previous versions. You can
|
23
|
+
wrap such datasets with Dataset#from_self manually to restore the
|
24
|
+
previous behavior.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A set_literalizer extension has been added, for treating Set
|
4
|
+
instances in datasets similar to Array instances:
|
5
|
+
|
6
|
+
DB.extension :set_literalizer
|
7
|
+
DB[:table].where(column: Set.new([1, 2, 3]))
|
8
|
+
# SELECT FROM table WHERE (column IN (1, 2, 3))
|
9
|
+
|
10
|
+
= Improvements
|
11
|
+
|
12
|
+
* Sequel now avoids the use of singleton classes for datasets on Ruby
|
13
|
+
2.4+, instead creating a regular subclass whenever a dataset would
|
14
|
+
be extended via #extension or #with_extend. This significantly
|
15
|
+
improves performance, up to 20-40% for common dataset usage,
|
16
|
+
because it avoids creating new singleton classes for every dataset
|
17
|
+
clone, and it allows for cached method lookup.
|
18
|
+
|
19
|
+
* Database#tables and #views now support a :qualify option on Microsoft
|
20
|
+
SQL Server to returned qualified identifiers.
|
21
|
+
|
22
|
+
* The schema_dumper extension can now dump tables in non-default schemas
|
23
|
+
when using Microsoft SQL Server.
|
24
|
+
|
25
|
+
* The schema_dumper extension now correctly dumps string column sizes
|
26
|
+
when using Microsoft SQL Server.
|
27
|
+
|
28
|
+
= Backwards Compatibility
|
29
|
+
|
30
|
+
* Calling Sequel::Dataset.register_extension where the second argument
|
31
|
+
is not a module now issues a deprecation warning. Support for this
|
32
|
+
will be removed in Sequel 6.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On PostgreSQL 9.6+, date, timestamp, and timestamptz columns now
|
4
|
+
have min_value and max_value column schema entries, allowing the
|
5
|
+
auto_validations plugin to automatically enforce minimum and
|
6
|
+
maximum values for these column types, raising a validation error
|
7
|
+
before saving, instead of database error when the query is sent
|
8
|
+
to the database.
|
9
|
+
|
10
|
+
* A validation_helpers_generic_type_messages plugin has been added,
|
11
|
+
which improves the default type validation error messages in
|
12
|
+
validation_helpers. This change was not made directly to
|
13
|
+
validation_helpers for backwards compatibility reasons, but will
|
14
|
+
probably become the default behavior in Sequel 6. Some examples
|
15
|
+
of the improvements:
|
16
|
+
|
17
|
+
# :blob type
|
18
|
+
# validation_helpers default: "value is not a valid sequel::sql::blob"
|
19
|
+
# with this plugin: "value is not a blob"
|
20
|
+
|
21
|
+
# :boolean type
|
22
|
+
# validation_helpers default: "value is not a valid trueclass or falseclass"
|
23
|
+
# with this plugin: "value is not true or false"
|
24
|
+
|
25
|
+
# :datetime type
|
26
|
+
# validation_helpers default: "value is not a valid time or datetime"
|
27
|
+
# with this plugin: "value is not a valid timestamp"
|
28
|
+
|
29
|
+
# custom/database-specific types
|
30
|
+
# validation_helpers default: "value is not a valid sequel::class_name"
|
31
|
+
# with this plugin: "value is not the expected type"
|
32
|
+
|
33
|
+
= Improvements
|
34
|
+
|
35
|
+
* The constraint_validations plugin no longer raises validation
|
36
|
+
errors for missing columns that have a default value. If a column
|
37
|
+
is missing but has a default value, we can assume the default
|
38
|
+
value is valid. Additionally, the constraint validations are now
|
39
|
+
based on the underlying column value and not any deserialized
|
40
|
+
value, so that the validation matches the constraint.
|
41
|
+
|
42
|
+
* On PostgreSQL, normal type name parsing is skipped for enum,
|
43
|
+
array, composite, range, and multirange types, ensuring that
|
44
|
+
such types will not be treated incorrectly based on their
|
45
|
+
type name.
|
46
|
+
|
47
|
+
* The pg_extended_date_support extension now works correctly with
|
48
|
+
the jdbc/postgresql adapter if there is already an entry in the
|
49
|
+
oid_convertor_map for the timestamp and timestamptz types.
|
50
|
+
|
51
|
+
= Backwards Compatibility
|
52
|
+
|
53
|
+
* Database#schema_column_type is no longer called for all columns
|
54
|
+
on PostgreSQL when parsing schema. Enum, array, composite, range,
|
55
|
+
and multirange types each have their own separate type parsing
|
56
|
+
method. So if you were overriding Database#schema_column_type to
|
57
|
+
implement custom column schema parsing, you may need to adjust
|
58
|
+
your code.
|
59
|
+
|
60
|
+
* The Sequel::Postgres::ExtendedDateSupport::DATE_YEAR_1 constant
|
61
|
+
has been removed.
|