sequel 3.27.0 → 3.28.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.
- data/CHANGELOG +96 -0
- data/README.rdoc +2 -2
- data/Rakefile +1 -1
- data/doc/association_basics.rdoc +48 -0
- data/doc/opening_databases.rdoc +29 -5
- data/doc/prepared_statements.rdoc +1 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/testing.rdoc +42 -0
- data/doc/transactions.rdoc +97 -0
- data/lib/sequel/adapters/db2.rb +95 -65
- data/lib/sequel/adapters/firebird.rb +25 -219
- data/lib/sequel/adapters/ibmdb.rb +440 -0
- data/lib/sequel/adapters/jdbc.rb +12 -0
- data/lib/sequel/adapters/jdbc/as400.rb +0 -7
- data/lib/sequel/adapters/jdbc/db2.rb +49 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +34 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +2 -27
- data/lib/sequel/adapters/jdbc/transactions.rb +34 -0
- data/lib/sequel/adapters/mysql.rb +10 -15
- data/lib/sequel/adapters/odbc.rb +1 -2
- data/lib/sequel/adapters/odbc/db2.rb +5 -5
- data/lib/sequel/adapters/postgres.rb +71 -11
- data/lib/sequel/adapters/shared/db2.rb +290 -0
- data/lib/sequel/adapters/shared/firebird.rb +214 -0
- data/lib/sequel/adapters/shared/mssql.rb +18 -75
- data/lib/sequel/adapters/shared/mysql.rb +13 -0
- data/lib/sequel/adapters/shared/postgres.rb +52 -36
- data/lib/sequel/adapters/shared/sqlite.rb +32 -36
- data/lib/sequel/adapters/sqlite.rb +4 -8
- data/lib/sequel/adapters/tinytds.rb +7 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +55 -0
- data/lib/sequel/core.rb +1 -1
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/misc.rb +6 -5
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/database/schema_generator.rb +2 -1
- data/lib/sequel/dataset/actions.rb +149 -33
- data/lib/sequel/dataset/features.rb +44 -7
- data/lib/sequel/dataset/misc.rb +9 -1
- data/lib/sequel/dataset/prepared_statements.rb +2 -2
- data/lib/sequel/dataset/query.rb +63 -10
- data/lib/sequel/dataset/sql.rb +22 -5
- data/lib/sequel/model.rb +3 -3
- data/lib/sequel/model/associations.rb +250 -27
- data/lib/sequel/model/base.rb +10 -16
- data/lib/sequel/plugins/many_through_many.rb +34 -2
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/sql.rb +94 -51
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/postgres_spec.rb +74 -6
- data/spec/adapters/spec_helper.rb +1 -0
- data/spec/adapters/sqlite_spec.rb +11 -0
- data/spec/core/database_spec.rb +7 -0
- data/spec/core/dataset_spec.rb +180 -17
- data/spec/core/expression_filters_spec.rb +107 -41
- data/spec/core/spec_helper.rb +11 -0
- data/spec/extensions/many_through_many_spec.rb +115 -1
- data/spec/extensions/prepared_statements_with_pk_spec.rb +3 -3
- data/spec/integration/associations_test.rb +193 -15
- data/spec/integration/database_test.rb +4 -2
- data/spec/integration/dataset_test.rb +215 -19
- data/spec/integration/plugin_test.rb +8 -5
- data/spec/integration/prepared_statement_test.rb +91 -98
- data/spec/integration/schema_test.rb +27 -11
- data/spec/integration/spec_helper.rb +10 -0
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +91 -0
- data/spec/model/associations_spec.rb +13 -0
- data/spec/model/base_spec.rb +8 -21
- data/spec/model/eager_loading_spec.rb +243 -9
- data/spec/model/model_spec.rb +15 -2
- metadata +16 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,99 @@
|
|
1
|
+
=== 3.28.0 (2011-10-03)
|
2
|
+
|
3
|
+
* Add firebird jdbc subadapter (jeremyevans)
|
4
|
+
|
5
|
+
* Add SQLTime.create method for easier creation of SQLTime instances (jeremyevans)
|
6
|
+
|
7
|
+
* Make Dataset#with_pk use a qualified primary key, so it works correctly on joined datasets (jeremyevans)
|
8
|
+
|
9
|
+
* Support the :limit association option when using eager_graph (jeremyevans)
|
10
|
+
|
11
|
+
* Fix eager loading via eager_graph of one_to_one associations that match multiple associated objects and use order to pick the first one (jeremyevans)
|
12
|
+
|
13
|
+
* Make after_load association hooks apply when using eager_graph (jeremyevans)
|
14
|
+
|
15
|
+
* Make Dataset#with_sql treat a symbol as a first argument as a method name to call to get the SQL (jeremyevans)
|
16
|
+
|
17
|
+
* Make Dataset #delete, #insert, #update return array of plain hashes if block not given and Dataset#returning is used (jeremyevans)
|
18
|
+
|
19
|
+
* Allow Dataset #map, #to_hash, #select_map, #select_order_map, and #select_hash to take arrays of columns instead of single columns (jeremyevans)
|
20
|
+
|
21
|
+
* Make Dataset #delete, #insert, #update yield plain hashes to a block if Dataset#returning is used (jeremyevans)
|
22
|
+
|
23
|
+
* Add Dataset#returning for setting the columns to return in INSERT/UPDATE/DELETE statements, used by PostgreSQL 9.1 (jeremyevans)
|
24
|
+
|
25
|
+
* Support WITH clause in INSERT/UPDATE/DELETE on PostgreSQL 9.1+ (jeremyevans)
|
26
|
+
|
27
|
+
* Add Database#copy_table for PostgreSQL COPY support when using the postgres adapter with pg (jeremyevans)
|
28
|
+
|
29
|
+
* Support CREATE TABLE IF NOT EXISTS on PostgreSQL 9.1+ (jeremyevans)
|
30
|
+
|
31
|
+
* Add support for Sequel::Model.default_eager_limit_strategy to set the default :eager_limit_strategy for *_many associations (jeremyevans)
|
32
|
+
|
33
|
+
* Add support for an :eager_limit_strategy => :correlated_subquery value for limiting using correlated subqueries (jeremyevans)
|
34
|
+
|
35
|
+
* Allow use of a dataset that uses the emulated offset support on MSSQL and DB2 in an IN subquery by using a nested subquery (jeremyevans)
|
36
|
+
|
37
|
+
* Allow use of a dataset that uses LIMIT in an IN subquery on MySQL by using a nested subquery (jeremyevans)
|
38
|
+
|
39
|
+
* Work around serious ActiveSupport bug in Time.=== that breaks literalization of Time values (jeremyevans)
|
40
|
+
|
41
|
+
* Speed up SQL operator methods by using module_eval instead of define_method (jeremyevans)
|
42
|
+
|
43
|
+
* Support sql_(boolean,number,string) methods on ComplexExpressions, allowing you do to (x + 1).sql_string + 'a' for (x + 1) || 'a' (jeremyevans)
|
44
|
+
|
45
|
+
* Don't disallow SQL expression creation based on types, leave that to the database server (jeremyevans)
|
46
|
+
|
47
|
+
* Make :column [&|] 1 use an SQL bitwise [&|] expression instead of a logical (AND|OR) expression (jeremyevans)
|
48
|
+
|
49
|
+
* Make :column + 'a' use an SQL string concatenation expression instead of an addition expression (jeremyevans)
|
50
|
+
|
51
|
+
* Fix :time typecasting from Time to SQLTime for fractional seconds on ruby 1.9 (jeremyevans)
|
52
|
+
|
53
|
+
* Have Dataset#select_append check supports_select_all_and_column? and select all from all FROM and JOIN tables if no columns selected (jeremyevans)
|
54
|
+
|
55
|
+
* Add Dataset#supports_select_all_and_column? for checking if you can do SELECT *, column (jeremyevans)
|
56
|
+
|
57
|
+
* Add support for an :eager_limit_strategy => :window_function value for limiting using window functions (jeremyevans)
|
58
|
+
|
59
|
+
* Add support for an :eager_limit_strategy => :distinct_on value for one_to_one associations for using DISTINCT ON (jeremyevans)
|
60
|
+
|
61
|
+
* Add support for an :eager_limit_strategy association option, for manual control over how limiting is done (jeremyevans)
|
62
|
+
|
63
|
+
* Add Dataset#supports_ordered_distinct_on? for checking if the dataset can use distinct on while respecting order (jeremyevans)
|
64
|
+
|
65
|
+
* Add support for the association :limit option when eager loading via .eager for *_many associations (jeremyevans)
|
66
|
+
|
67
|
+
* Add db2 jdbc subadapter (jeremyevans)
|
68
|
+
|
69
|
+
* Fix the db2 adapter so it actually works (jeremyevans)
|
70
|
+
|
71
|
+
* Add ibmdb adapter for accessing DB2 (roylez, jeremyevans)
|
72
|
+
|
73
|
+
* Add much better support for DB2 databases (roylez, jeremyevans)
|
74
|
+
|
75
|
+
* Handle SQL::AliasedExpressions and SQL::JoinClauses in Dataset#select_all (jeremyevans)
|
76
|
+
|
77
|
+
* Speed up type translation slightly in mysql, postgres, and sqlite adapters (jeremyevans)
|
78
|
+
|
79
|
+
* Add Dataset#supports_cte_in_subqueries? for checking whether database supports WITH in subqueries (jeremyevans)
|
80
|
+
|
81
|
+
* Allow Model.set_dataset to accept Sequel::LiteralString arguments as table names (jeremyevans)
|
82
|
+
|
83
|
+
* Association :after_load hooks in lazy loading are now called after the associated objects have been cached (jeremyevans)
|
84
|
+
|
85
|
+
* Emulate handling of extract on MSSQL, using datepart (jeremyevans)
|
86
|
+
|
87
|
+
* Emulate handling of extract on SQLite, but you need to set Database#use_timestamp_timezones = false (jeremyevans)
|
88
|
+
|
89
|
+
* Abstract handling of ComplexExpressionMethods#extract so that it can work on databases that don't implement extract (jeremyevans)
|
90
|
+
|
91
|
+
* Emulate xor operator on SQLite (jeremyevans)
|
92
|
+
|
93
|
+
* Add Dataset#supports_where_true? for checking if the database supports WHERE true (or WHERE 1 if 1 is true) (jeremyevans)
|
94
|
+
|
95
|
+
* Fix eager loading via eager of one_to_one associations that match multiple associated objects and use order to pick the first one (jeremyevans)
|
96
|
+
|
1
97
|
=== 3.27.0 (2011-09-01)
|
2
98
|
|
3
99
|
* Add support for native prepared statements to the tinytds adapter (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -12,8 +12,8 @@ toolkit for Ruby.
|
|
12
12
|
two-phase commit, transaction isolation, master/slave
|
13
13
|
configurations, and database sharding.
|
14
14
|
* Sequel currently has adapters for ADO, Amalgalite, DataObjects,
|
15
|
-
DB2, DBI, Firebird, Informix, JDBC, MySQL, Mysql2, ODBC,
|
16
|
-
Oracle, PostgreSQL, SQLite3, Swift, and TinyTDS.
|
15
|
+
DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC,
|
16
|
+
OpenBase, Oracle, PostgreSQL, SQLite3, Swift, and TinyTDS.
|
17
17
|
|
18
18
|
== Resources
|
19
19
|
|
data/Rakefile
CHANGED
@@ -128,7 +128,7 @@ begin
|
|
128
128
|
spec_with_cov.call("spec_plugin", Dir["spec/extensions/*_spec.rb"], "Run extension/plugin specs")
|
129
129
|
spec_with_cov.call("spec_integration", Dir["spec/integration/*_test.rb"], "Run integration tests")
|
130
130
|
|
131
|
-
%w'postgres sqlite mysql informix oracle firebird mssql'.each do |adapter|
|
131
|
+
%w'postgres sqlite mysql informix oracle firebird mssql db2'.each do |adapter|
|
132
132
|
spec_with_cov.call("spec_#{adapter}", ["spec/adapters/#{adapter}_spec.rb"] + Dir["spec/integration/*_test.rb"], "Run #{adapter} specs")
|
133
133
|
end
|
134
134
|
rescue LoadError
|
data/doc/association_basics.rdoc
CHANGED
@@ -1518,3 +1518,51 @@ associations depends on another plugin that defines instance methods of
|
|
1518
1518
|
the same name. In that case, the instance methods of the dependent
|
1519
1519
|
plugin would override the association methods created by the main
|
1520
1520
|
plugin.
|
1521
|
+
|
1522
|
+
==== :eager_limit_strategy
|
1523
|
+
|
1524
|
+
This setting determines what strategy to use for loading the associations
|
1525
|
+
that use the :limit setting to limit the number of returned records. You
|
1526
|
+
can't use LIMIT directly, since you want a limit for each associated
|
1527
|
+
record, not a LIMIT on the number of records returned by the dataset.
|
1528
|
+
|
1529
|
+
By default, no strategy is used for one_to_one associations, and
|
1530
|
+
the :ruby strategy is used for *_many associations, which does a simple
|
1531
|
+
array slice after loading the associated records. That doesn't provide
|
1532
|
+
a performance advantage, since all records are still loaded from the
|
1533
|
+
database, but it at least makes sure the cached records are accurately
|
1534
|
+
limited as they would be in the lazy load case.
|
1535
|
+
|
1536
|
+
The reason no strategy is used by default for one_to_one associations
|
1537
|
+
is that none is needed for a true one_to_one association (since there
|
1538
|
+
is only one associated record per current record). However, if you are
|
1539
|
+
using a one_to_one association where the relationship is really one_to_many,
|
1540
|
+
and using an order to pick the first matching row, then if you don't
|
1541
|
+
specify an :eager_limit_strategy option, you'll be loading all related
|
1542
|
+
rows just to have Sequel ignore all rows after the first. By using a
|
1543
|
+
strategy to change the query to only return one associated record per
|
1544
|
+
current record, you can get much better database performance.
|
1545
|
+
|
1546
|
+
You can set a value of +true+ for this option to have Sequel select what
|
1547
|
+
it thinks is the best way of limiting the records for your database. You
|
1548
|
+
can also specify a symbol to manually choose a strategy. The available
|
1549
|
+
strategies are:
|
1550
|
+
|
1551
|
+
:distinct_on :: Uses DISTINCT ON to ensure only the first matching record
|
1552
|
+
is loaded (one_to_one associations only). This is used by
|
1553
|
+
default on PostgreSQL.
|
1554
|
+
:window_function :: Uses window functions if the database supports it.
|
1555
|
+
This is used by default on databases that support window
|
1556
|
+
functions.
|
1557
|
+
:correlated_subquery :: Uses a correlated subquery to get the information.
|
1558
|
+
This is never used by default as if you aren't careful,
|
1559
|
+
it can result in pathologically long running times
|
1560
|
+
This will not work correctly for association where
|
1561
|
+
the associated table has a composite primary key if
|
1562
|
+
the database doesn't support using IN
|
1563
|
+
with multiple columns. This will also not work on MySQL
|
1564
|
+
because MySQL has problems using IN with a correlated
|
1565
|
+
subquery that contains a limit.
|
1566
|
+
:ruby :: Uses ruby array slicing to emulate database limiting (*_many
|
1567
|
+
associations only). This is the default if the database doesn't
|
1568
|
+
support window functions.
|
data/doc/opening_databases.rdoc
CHANGED
@@ -46,6 +46,13 @@ unless the first argument is a hash. So the following statements are equivalent
|
|
46
46
|
DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
|
47
47
|
DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
|
48
48
|
|
49
|
+
Note that using an adapter method forces the use of the specified adapter, not a database type, even
|
50
|
+
though some adapters have the same name as the database type. So if you
|
51
|
+
want to connect to SQLite, for example, you can do so using the sqlite, do, dbi, jdbc, odbc, and swift adapters.
|
52
|
+
If you want to connect to SQLite on JRuby using the jdbc adapter, you should not use <tt>Sequel.sqlite</tt>
|
53
|
+
for example, as that uses the C-based sqlite3 gem. Instead, the <tt>Sequel.jdbc</tt> would be appropriate (though
|
54
|
+
as mentioned below, using <tt>Sequel.connect</tt> is recommended instead of <tt>Sequel.jdbc</tt>).
|
55
|
+
|
49
56
|
== Passing a block to either method
|
50
57
|
|
51
58
|
Both the Sequel.connect method and the specialized adapter methods take a block. If you
|
@@ -145,10 +152,8 @@ the sqlite section below for details.
|
|
145
152
|
|
146
153
|
Requires: db2/db2cli
|
147
154
|
|
148
|
-
|
149
|
-
|
150
|
-
get a handle, and respects the :database, :user, and :password options. It doesn't
|
151
|
-
appear to respect the :host or :port options.
|
155
|
+
This is the older DB2 adapter. It's recommended you try the ibmdb adapter
|
156
|
+
instead for new DB2 work, as it is better supported.
|
152
157
|
|
153
158
|
=== dbi
|
154
159
|
|
@@ -201,6 +206,13 @@ Requires: fb (using code at http://github.com/wishdev/fb)
|
|
201
206
|
|
202
207
|
Does not support the :port option.
|
203
208
|
|
209
|
+
=== ibmdb
|
210
|
+
|
211
|
+
requires 'ibm_db'
|
212
|
+
|
213
|
+
This connects to DB2 using IBM_DB. This is the recommended adapter if you are
|
214
|
+
using a C-based ruby to connect to DB2.
|
215
|
+
|
204
216
|
=== informix
|
205
217
|
|
206
218
|
Does not support the :host or :port options. Depending on the configuration of your server
|
@@ -221,7 +233,7 @@ Requires: java
|
|
221
233
|
Houses Sequel's JDBC support when running on JRuby.
|
222
234
|
Support for individual database types is done using sub adapters.
|
223
235
|
There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
|
224
|
-
Oracle, MSSQL, JTDS, and
|
236
|
+
Oracle, MSSQL, JTDS, AS400, and DB2. All except Oracle, MSSQL, AS400, and DB2 can load the
|
225
237
|
jdbc-* gem, for those you need to have the .jar in your CLASSPATH
|
226
238
|
or load the Java class manually before calling Sequel.connect.
|
227
239
|
|
@@ -262,6 +274,8 @@ The following additional options are supported:
|
|
262
274
|
|
263
275
|
=== mysql
|
264
276
|
|
277
|
+
Requires: mysqlplus (or mysql if mysqlplus is not available)
|
278
|
+
|
265
279
|
The MySQL adapter does not support the pure-ruby MySQL adapter that used to ship with
|
266
280
|
ActiveRecord, it requires the native adapter.
|
267
281
|
|
@@ -278,6 +292,12 @@ The following additional options are supported:
|
|
278
292
|
* :read_timeout - Set the timeout in seconds for reading back results to a query.
|
279
293
|
* :connect_timeout - Set the timeout in seconds before a connection attempt is abandoned.
|
280
294
|
|
295
|
+
=== mysql2
|
296
|
+
|
297
|
+
This is a newer MySQL adapter that does typecasting in C, so it is often faster than the
|
298
|
+
mysql adapter. Supports the same additional options as the mysql adapter, except for :compress, and uses
|
299
|
+
:timeout instead of :read_timeout and :connect_timeout.
|
300
|
+
|
281
301
|
=== odbc
|
282
302
|
|
283
303
|
The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
|
@@ -316,6 +336,8 @@ The following additional options are supported:
|
|
316
336
|
|
317
337
|
=== sqlite
|
318
338
|
|
339
|
+
Requires: sqlite3
|
340
|
+
|
319
341
|
As SQLite is a file-based database, the :host and :port options are ignored, and
|
320
342
|
the :database option should be a path to the file.
|
321
343
|
|
@@ -353,6 +375,8 @@ Examples:
|
|
353
375
|
|
354
376
|
=== tinytds
|
355
377
|
|
378
|
+
Requires: tiny_tds
|
379
|
+
|
356
380
|
Because the underscore is not a valid character in a URI schema, the adapter
|
357
381
|
is named tinytds instead of tiny_tds. The connection options are passed directly
|
358
382
|
to tiny_tds, except that the tiny_tds :username option is set to
|
@@ -5,6 +5,7 @@ database you are using, the Sequel prepared statement/bound variable API remains
|
|
5
5
|
the same. There is native support for prepared statements/bound variables on
|
6
6
|
the following adapters:
|
7
7
|
|
8
|
+
* ibmdb (prepared statements only)
|
8
9
|
* jdbc
|
9
10
|
* mysql (prepared statements only)
|
10
11
|
* mysql2 (prepared statements only)
|
@@ -0,0 +1,304 @@
|
|
1
|
+
= New Adapter Support
|
2
|
+
|
3
|
+
* Sequel now has much better support for the DB2 database.
|
4
|
+
|
5
|
+
* An ibmdb adapter has been added, and is the recommended adapter to
|
6
|
+
to use if you want to connect to DB2 from MRI.
|
7
|
+
|
8
|
+
* A jdbc db2 subadapter has been added, allowing good DB2 support on
|
9
|
+
JRuby.
|
10
|
+
|
11
|
+
* The db2 adapter has been cleaned up substantially, and now works
|
12
|
+
well, but it is still recommended that you switch to ibmdb if you
|
13
|
+
are using the db2 adapter.
|
14
|
+
|
15
|
+
* The firebird adapter has been split into shared and specific parts,
|
16
|
+
and quite a few fixes were made to it.
|
17
|
+
|
18
|
+
* A jdbc firebird subadapter has been added, allowing connection to
|
19
|
+
firebird databases from JRuby.
|
20
|
+
|
21
|
+
= New PostgreSQL 9.1 Features
|
22
|
+
|
23
|
+
* Dataset#returning has been added for using the RETURNING clause on
|
24
|
+
INSERT/UPDATE/DELETE queries. RETURNING allows such queries to
|
25
|
+
return results in much the same way as a SELECT query works.
|
26
|
+
When Dataset#returning is used, Dataset #insert, #update, and
|
27
|
+
#delete now accept a block that is passed to Dataset #fetch_rows
|
28
|
+
which is yielded plain ruby hashes for each row inserted, updated,
|
29
|
+
or deleted. If Dataset#returning is used and a block is not given
|
30
|
+
to those methods, those methods will return an array of plain hashes
|
31
|
+
for all rows inserted, updated, and deleted.
|
32
|
+
|
33
|
+
* Dataset#with_sql now treats a symbol as a first argument as a method
|
34
|
+
name to call to get the SQL. The expected use case for this is with
|
35
|
+
Dataset#returning and insert/update/delete:
|
36
|
+
|
37
|
+
DB[:items].
|
38
|
+
returning(:id).
|
39
|
+
with_sql(:update_sql, :b => :b + 1).
|
40
|
+
map(:id)
|
41
|
+
|
42
|
+
Basically, it makes it more easily to statically set the
|
43
|
+
insert/update/delete SQL, and then be able to use the full
|
44
|
+
dataset API for returning results. As mentioned above, using
|
45
|
+
Dataset#returning with #insert, #update, and #delete yields plain
|
46
|
+
hashes, so if you want to have the row_proc applied (e.g. you are
|
47
|
+
using models), you need to use this method instead, since you can
|
48
|
+
then call #each or #all to make sure the row_proc is called on all
|
49
|
+
returned rows.
|
50
|
+
|
51
|
+
* Dataset#with (common table expressions) now affects
|
52
|
+
INSERT/UPDATE/DELETE queries.
|
53
|
+
|
54
|
+
* Database#create_table? now uses CREATE TABLE IF NOT EXISTS on
|
55
|
+
PostgreSQL 9.1.
|
56
|
+
|
57
|
+
= Other New Features
|
58
|
+
|
59
|
+
* The :limit option is now respected when eager loading via either
|
60
|
+
eager or eager_graph. By default, Sequel will just do an array
|
61
|
+
slice of the resulting ruby array, which gets the correct answer,
|
62
|
+
but does not offer any performance improvements. Sequel also
|
63
|
+
offers a new :eager_limit_strategy option for using more advanced
|
64
|
+
query types that only load the related records from the database.
|
65
|
+
The available values for the :eager_limit_strategy option are:
|
66
|
+
|
67
|
+
:window_function: This uses the row_number window function
|
68
|
+
partitioned by the related key fields. It can only be used
|
69
|
+
on databases that support window functions (PostgreSQL 8.4+,
|
70
|
+
Microsoft SQL Server 2005+, DB2).
|
71
|
+
:correlated_subquery: This uses a correlated subquery that is
|
72
|
+
limited. It works on most databases except MySQL and DB2.
|
73
|
+
|
74
|
+
You can provide a value of true as the option to have Sequel
|
75
|
+
pick a strategy to use. Sequel will never use a correlated
|
76
|
+
subquery for true, since in some cases it can perform worse than
|
77
|
+
loading all related records and doing the array slice in ruby.
|
78
|
+
|
79
|
+
If you want to enable an eager_limit_strategy globally, you can
|
80
|
+
set Sequel::Model.default_eager_limit_strategy to a value, and
|
81
|
+
all associations that use :limit will default to using that
|
82
|
+
strategy.
|
83
|
+
|
84
|
+
* one_to_one associations that do not represent true one-to-one
|
85
|
+
database relationships, but represent one-to-many relationships
|
86
|
+
where you are only returning the first object based on a given
|
87
|
+
order are also now handled correctly when eager loading.
|
88
|
+
Previously, eager loading such associations resulted in the last
|
89
|
+
matching object being associated instead of the first matching
|
90
|
+
object being associated.
|
91
|
+
|
92
|
+
You can also use an :eager_limit_strategy for one_to_one
|
93
|
+
associations. In addition to the :window_function and
|
94
|
+
:correlated_subquery values, there is also a :distinct_on value
|
95
|
+
that is available on PostgreSQL for using DISTINCT ON, which is
|
96
|
+
the fastest strategy if you are using PostgreSQL.
|
97
|
+
|
98
|
+
* Dataset#map, #to_hash, #select_map, #select_order_map, and
|
99
|
+
#select_hash now accept arrays of symbols, and if given arrays
|
100
|
+
of symbols, use arrays of results. For example:
|
101
|
+
|
102
|
+
DB[:items].map([:id, :name])
|
103
|
+
# => [[1, 'foo'], [2, 'bar'], ...]
|
104
|
+
DB[:items].to_hash([:id, :foo_id], [:name, :bar_id])
|
105
|
+
# => {[1, 3]=>['foo', 5], [2, 4]=>['bar', 6], ...}
|
106
|
+
|
107
|
+
* For SQL expression objects where Sequel cannot deduce the type
|
108
|
+
of the object, it now will consider the type of the argument
|
109
|
+
when a &, |, or + operator is used. For example:
|
110
|
+
|
111
|
+
:x & 1
|
112
|
+
|
113
|
+
Previously, this did "x AND 1", now it does "x & 1". Using a
|
114
|
+
logical operator on an integer doesn't make sense, but it's
|
115
|
+
possible people did so if the database uses 1/0 for true/false.
|
116
|
+
Likewise:
|
117
|
+
|
118
|
+
:x + 'foo'
|
119
|
+
|
120
|
+
Previously, this did "x + 'foo'" (addition), now it does
|
121
|
+
"x || 'foo'" (string concatenation).
|
122
|
+
|
123
|
+
* The sql_string, sql_number, and sql_boolean methods are now
|
124
|
+
available on SQL::ComplexExpressions, so you can do:
|
125
|
+
|
126
|
+
(:x + 1).sql_string + ' foos'
|
127
|
+
# (x + 1) || ' foos'
|
128
|
+
|
129
|
+
Previously, there was not an easy way to generate such SQL
|
130
|
+
expressions.
|
131
|
+
|
132
|
+
* :after_load association hooks are now applied when using
|
133
|
+
eager_graph. Previously, they were only applied when using
|
134
|
+
eager, not when using eager_graph.
|
135
|
+
|
136
|
+
* Database#copy_table has been added to the postgres adapter if pg
|
137
|
+
is used as the underlying driver. It allows you to get very
|
138
|
+
fast exports of table data in text or CSV format. It also
|
139
|
+
accepts datasets, allowing fast exports of arbitrary queries
|
140
|
+
in text or CSV format.
|
141
|
+
|
142
|
+
* SQL extract support (:timestamp.extract(:year)) is now emulated
|
143
|
+
on the databases that don't natively support it, such as SQLite,
|
144
|
+
Microsoft SQL Server, and DB2. At least the following values are
|
145
|
+
supported for extraction: :year, :month, :day, :hour, :minute,
|
146
|
+
and :second.
|
147
|
+
|
148
|
+
* The bitwise XOR operator is now emulated on SQLite. Previously,
|
149
|
+
attempting to use it would cause the database to raise an error.
|
150
|
+
|
151
|
+
* A Database#use_timestamp_timezones accessor has been added on
|
152
|
+
SQLite. This allows you to turn off the use of timezones in
|
153
|
+
timestamps by setting the value to false. This is necessary if you
|
154
|
+
want you want to use the SQLite datetime functions, or the new
|
155
|
+
ability to emulate extract.
|
156
|
+
|
157
|
+
Note that this setting does not affect the current database
|
158
|
+
content. To convert old databases to the new format, you'll
|
159
|
+
have to resave all rows that have timestamps.
|
160
|
+
|
161
|
+
At some point in the future, Sequel may default to not using
|
162
|
+
timezones in timestamps by default on SQLite, so if you would
|
163
|
+
like to rely on the current behavior, you should set this
|
164
|
+
accessor to true now.
|
165
|
+
|
166
|
+
* Sequel now works around bugs in MySQL when using a subselect with
|
167
|
+
a LIMIT by using a nested subselect.
|
168
|
+
|
169
|
+
* Sequel now works around issues in Microsoft SQL Server and DB2 when
|
170
|
+
using a subselect with IN/NOT IN that uses the emulated offset
|
171
|
+
support.
|
172
|
+
|
173
|
+
* The jdbc adapter now returns java.sql.Clob objects as
|
174
|
+
Sequel::SQL::Blobs.
|
175
|
+
|
176
|
+
* Sequel now considers database clob types as the :blob schema type.
|
177
|
+
|
178
|
+
* Sequel::SQLTime.create has been added for more easily creating
|
179
|
+
instances:
|
180
|
+
|
181
|
+
Sequel::SQLTime.create(hour, minute, second, usec)
|
182
|
+
|
183
|
+
* Dataset#select_all now accepts SQL::AliasedExpression and
|
184
|
+
SQL::JoinClause arguments and returns the appropriate
|
185
|
+
SQL::ColumnAll value that selects all columns from the related
|
186
|
+
table.
|
187
|
+
|
188
|
+
* Model.set_dataset now accepts Sequel::LiteralString objects that
|
189
|
+
represent table names. This usage is not encouraged except in
|
190
|
+
rare cases such as using a set returning function in PostgreSQL.
|
191
|
+
|
192
|
+
* Dataset#supports_cte? now takes an optional argument specifying the
|
193
|
+
type of query (:insert, :update, :delete, :select). It defaults to
|
194
|
+
:select.
|
195
|
+
|
196
|
+
* Dataset#supports_returning? has been added. It requires an
|
197
|
+
argument specifying the type of query (:insert, :update, or
|
198
|
+
:delete).
|
199
|
+
|
200
|
+
* Dataset#supports_cte_in_subqueries? has been added for checking
|
201
|
+
for support for this ability. Apparently, only PostgreSQL
|
202
|
+
currently supports this. For other adapters that support CTEs but
|
203
|
+
not in subqueries, if a subquery with a CTE is used in a JOIN, the
|
204
|
+
CTE is moved from the subquery to the main query.
|
205
|
+
|
206
|
+
* Dataset#supports_select_all_and_column has been added for seeing
|
207
|
+
if "SELECT *, foo ..." style queries are supported. This is false
|
208
|
+
on DB2, which doesn't allow such queries. When it is false, using
|
209
|
+
select_append on a dataset that doesn't specifically select columns
|
210
|
+
will now change the query to do "SELECT table.*, foo ..." instead,
|
211
|
+
working around the limitation on DB2.
|
212
|
+
|
213
|
+
* Dataset#supports_ordered_distinct_on? has been added. Currently,
|
214
|
+
this is only true on PostgreSQL. MySQL can emulate DISTINCT ON
|
215
|
+
using GROUP BY, but it doesn't respect ORDER BY, so it some
|
216
|
+
cases it cannot be used equivalently.
|
217
|
+
|
218
|
+
* Dataset#supports_where_true? has been added for checking for support
|
219
|
+
of WHERE TRUE (or WHERE 1 if 1 is true). Not all databases support
|
220
|
+
using such a construct, and on the databases that do not, you have
|
221
|
+
to use WHERE (1 = 1) or something similar.
|
222
|
+
|
223
|
+
= Other Improvements
|
224
|
+
|
225
|
+
* Sequel 3.27.0 was negatively affected by a serious bug in
|
226
|
+
ActiveSupport's Time.=== that has still not been fixed, which
|
227
|
+
broke the literalization of Time objects. In spite of the bad
|
228
|
+
precedent it sets, Sequel now avoids using Time.=== on a
|
229
|
+
subclass of Time to work around this ActiveSupport bug.
|
230
|
+
|
231
|
+
* Dataset#with_pk now uses a qualified primary key instead of an
|
232
|
+
unqualified primary key, which means it can now be used correctly
|
233
|
+
after joining to a separate table.
|
234
|
+
|
235
|
+
* Association after_load hooks when lazy loading are now called
|
236
|
+
after the association has been loaded, which allows them to change
|
237
|
+
which records are cached. This makes the lazy load case more
|
238
|
+
similar to the eager load case.
|
239
|
+
|
240
|
+
* The metaprogrammatically created methods that implement Sequel's
|
241
|
+
DSL support have been made significantly faster by using
|
242
|
+
module_eval instead of define_method.
|
243
|
+
|
244
|
+
* The type translation in the postgres, mysql, and sqlite adapters
|
245
|
+
has been made faster by using Method objects that result in more
|
246
|
+
direct processing.
|
247
|
+
|
248
|
+
* Typecasting values for time columns from Time values to
|
249
|
+
Sequel::SQLTime values now correctly handles fractional seconds on
|
250
|
+
ruby 1.9.
|
251
|
+
|
252
|
+
= Backwards Compatibility
|
253
|
+
|
254
|
+
* Dataset#insert_returning_sql has been changed to a private method
|
255
|
+
in the PostgreSQL and Firebird adapters, and it operates
|
256
|
+
differently than it did previously. The private
|
257
|
+
#insert_returning_pk_sql and #insert_returning_select_sql methods
|
258
|
+
have been removed.
|
259
|
+
|
260
|
+
* Dataset#with_pk no longer does some defensive checking for misuse of
|
261
|
+
primary keys (e.g. providing a composite key when the model uses
|
262
|
+
a single key). Previously, Sequel would raise an Error
|
263
|
+
immediately, now such behavior is undefined, with the most likely
|
264
|
+
behavior being the database raising an Error.
|
265
|
+
|
266
|
+
* The :alias_association_type_map and :alias_association_name_map
|
267
|
+
settings have been removed from the :eager_graph dataset option,
|
268
|
+
in favor of just storing the related association reflection.
|
269
|
+
|
270
|
+
* The internals of the db2 adapter have changed substantially, if you
|
271
|
+
were relying on some of the private methods defined in it, you will
|
272
|
+
probably have to modify your code.
|
273
|
+
|
274
|
+
* The firebird adapter was substanially modified, specifically parts
|
275
|
+
related to insert returning autogenerated primary key values, so if
|
276
|
+
you were previously using the adapter you should probably take more
|
277
|
+
care than usual when testing your upgrade.
|
278
|
+
|
279
|
+
* The Dataset::WITH_SUPPORTED constant has been removed.
|
280
|
+
|
281
|
+
* The Dataset#supports_cte? method now accepts an optional argument.
|
282
|
+
If you overrode this method, your overridden method now must
|
283
|
+
accept an optional argument.
|
284
|
+
|
285
|
+
* If you were previously doing:
|
286
|
+
|
287
|
+
:x & 1
|
288
|
+
|
289
|
+
and wanting "x AND 1", you have to switch to:
|
290
|
+
|
291
|
+
:x.sql_boolean & 1
|
292
|
+
|
293
|
+
Likewise, if you were previously doing:
|
294
|
+
|
295
|
+
:x + 'foo'
|
296
|
+
|
297
|
+
and wanting "x + 'foo'", you need to switch to:
|
298
|
+
|
299
|
+
:x.sql_number + 'foo'
|
300
|
+
|
301
|
+
* Sequel no longer does defensive type checking in the SQL expression
|
302
|
+
support, as it was often more strict than the database and would
|
303
|
+
not allow the creation of expressions that were valid for the
|
304
|
+
database.
|