sequel 4.1.1 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +32 -0
- data/doc/opening_databases.rdoc +4 -0
- data/doc/release_notes/4.2.0.txt +129 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +5 -0
- data/lib/sequel/adapters/mysql2.rb +2 -1
- data/lib/sequel/adapters/postgres.rb +8 -4
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +15 -4
- data/lib/sequel/adapters/shared/mysql.rb +1 -0
- data/lib/sequel/adapters/shared/oracle.rb +1 -1
- data/lib/sequel/adapters/shared/postgres.rb +10 -0
- data/lib/sequel/adapters/shared/sqlite.rb +5 -0
- data/lib/sequel/database/features.rb +6 -1
- data/lib/sequel/database/schema_methods.rb +3 -7
- data/lib/sequel/dataset/actions.rb +3 -4
- data/lib/sequel/dataset/features.rb +5 -0
- data/lib/sequel/dataset/misc.rb +28 -3
- data/lib/sequel/dataset/mutation.rb +37 -11
- data/lib/sequel/dataset/prepared_statements.rb +1 -3
- data/lib/sequel/dataset/query.rb +12 -3
- data/lib/sequel/dataset/sql.rb +12 -6
- data/lib/sequel/deprecated.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/core_extensions.rb +0 -2
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +1 -1
- data/lib/sequel/extensions/filter_having.rb +1 -1
- data/lib/sequel/extensions/from_block.rb +31 -0
- data/lib/sequel/extensions/graph_each.rb +1 -1
- data/lib/sequel/extensions/hash_aliases.rb +1 -1
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +78 -0
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_loose_count.rb +32 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +133 -0
- data/lib/sequel/extensions/pretty_table.rb +1 -1
- data/lib/sequel/extensions/query.rb +3 -1
- data/lib/sequel/extensions/query_literals.rb +1 -1
- data/lib/sequel/extensions/select_remove.rb +1 -1
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +1 -1
- data/lib/sequel/extensions/set_overrides.rb +1 -1
- data/lib/sequel/model.rb +1 -1
- data/lib/sequel/model/base.rb +20 -6
- data/lib/sequel/model/exceptions.rb +1 -1
- data/lib/sequel/plugins/composition.rb +9 -0
- data/lib/sequel/plugins/dirty.rb +19 -8
- data/lib/sequel/plugins/instance_filters.rb +9 -0
- data/lib/sequel/plugins/serialization.rb +9 -0
- data/lib/sequel/plugins/serialization_modification_detection.rb +9 -0
- data/lib/sequel/plugins/static_cache.rb +96 -28
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/mssql_spec.rb +1 -1
- data/spec/adapters/postgres_spec.rb +70 -0
- data/spec/core/dataset_spec.rb +58 -1
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/schema_spec.rb +18 -0
- data/spec/extensions/composition_spec.rb +7 -0
- data/spec/extensions/dirty_spec.rb +9 -0
- data/spec/extensions/from_block_spec.rb +21 -0
- data/spec/extensions/instance_filters_spec.rb +6 -0
- data/spec/extensions/pg_loose_count_spec.rb +17 -0
- data/spec/extensions/pg_static_cache_updater_spec.rb +80 -0
- data/spec/extensions/query_spec.rb +8 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +9 -0
- data/spec/extensions/serialization_spec.rb +7 -0
- data/spec/extensions/set_overrides_spec.rb +12 -0
- data/spec/extensions/static_cache_spec.rb +314 -154
- data/spec/integration/dataset_test.rb +12 -2
- data/spec/integration/schema_test.rb +13 -0
- data/spec/model/record_spec.rb +74 -0
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cab63d0878683dcadae2a2192c6969b1afd46a8d
|
4
|
+
data.tar.gz: c06204a0ba11736b055e57e109b7d8886014dd8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03ea44b1eb6d126258b335e3e28935506360c8d1e2e54c773d26b9f5e795b71f6f8c27eb04ad1fe6dd0deb32d86c42b88ac11b6e9356b735dc54b791310e16d8
|
7
|
+
data.tar.gz: 7d4084003d7202c8507ae31746f0e941a23a187edd8f479b22994a100283b5671982ab877aa4cb72029a846a899e8e356be0f14c7161361994913963547de1a6
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
=== 4.2.0 (2013-09-01)
|
2
|
+
|
3
|
+
* Support custom :flags option in mysql2 adapter (jeremyevans) (#700)
|
4
|
+
|
5
|
+
* Add implementations of Dataset#freeze and Dataset#dup (jeremyevans)
|
6
|
+
|
7
|
+
* Add implementations of Model#dup and Model#clone (jeremyevans)
|
8
|
+
|
9
|
+
* Don't have partial_indexes returned by Database#indexes on MSSQL 2008+ (jeremyevans)
|
10
|
+
|
11
|
+
* Support partial indexes on SQLite 3.8.0+ (jeremyevans)
|
12
|
+
|
13
|
+
* Add Database#supports_partial_indexes? to check for partial index support (mluu, jeremyevans) (#698)
|
14
|
+
|
15
|
+
* The static_cache plugin now disallows saving/destroying if the :frozen=>false option is not used (jeremyevans)
|
16
|
+
|
17
|
+
* Support :frozen=>false option in static_cache plugin, for having new instances returned instead of frozen cached instances (jeremyevans)
|
18
|
+
|
19
|
+
* Add pg_static_cache_updater Database extension for listening for changes to tables and updating static_cache caches automatically (jeremyevans)
|
20
|
+
|
21
|
+
* Add mssql_emulate_lateral_with_apply extension for emulating LATERAL queries using CROSS/OUTER APPLY (jeremyevans)
|
22
|
+
|
23
|
+
* Support LATERAL queries via Dataset#lateral (jeremyevans)
|
24
|
+
|
25
|
+
* Add pg_loose_count Database extension, for fast approximate counts of PostgreSQL tables (jeremyevans)
|
26
|
+
|
27
|
+
* Add from_block Database extension, for having Database#from block affect FROM instead of WHERE (jeremyevans)
|
28
|
+
|
29
|
+
* Support :cursor_name option in postgres adapter Dataset#use_cursor (heeringa, jeremyevans) (#696)
|
30
|
+
|
31
|
+
* Fix placeholder literal strings when used with an empty placeholder hash (trydionel, jeremyevans) (#695)
|
32
|
+
|
1
33
|
=== 4.1.1 (2013-08-01)
|
2
34
|
|
3
35
|
* Fix select_map, select_order_map, and single_value methods on eager_graphed datasets (jeremyevans)
|
data/doc/opening_databases.rdoc
CHANGED
@@ -312,6 +312,10 @@ This is a newer MySQL adapter that does typecasting in C, so it is often faster
|
|
312
312
|
mysql adapter. Supports the same additional options as the mysql adapter, except for :compress, and uses
|
313
313
|
:timeout instead of :read_timeout and :connect_timeout.
|
314
314
|
|
315
|
+
The following additional options are supported:
|
316
|
+
|
317
|
+
:flags :: Override the flags to use for the connection (e.g. ::Mysql2::Client::MULTI_STATEMENTS)
|
318
|
+
|
315
319
|
=== odbc
|
316
320
|
|
317
321
|
The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
|
@@ -0,0 +1,129 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* LATERAL subqueries are now supported on PostgreSQL 9.3+, HSQLDB,
|
4
|
+
and DB2 via Dataset#lateral:
|
5
|
+
|
6
|
+
DB.from(:a, DB[:b].where(:c=>:a__d).lateral)
|
7
|
+
# SELECT * FROM a,
|
8
|
+
# LATERAL (SELECT * FROM b WHERE (c = a.d)) AS t1
|
9
|
+
|
10
|
+
You can use a similar syntax when joining tables:
|
11
|
+
|
12
|
+
DB[:a].cross_join(DB[:b].where(:c=>:a__d).lateral)
|
13
|
+
# SELECT * FROM a
|
14
|
+
# CROSS JOIN LATERAL (SELECT * FROM b WHERE (c = a.d)) AS t1
|
15
|
+
|
16
|
+
If you are using Microsoft SQL Server, you can use the new
|
17
|
+
mssql_emulate_lateral_with_apply extension to emulate LATERAL
|
18
|
+
subqueries via CROSS/OUTER APPLY.
|
19
|
+
|
20
|
+
* The static_cache plugin now supports a :frozen=>false option. When
|
21
|
+
this option is used, instead of returning the frozen cached values,
|
22
|
+
the model now returns new, unfrozen objects that can be modified.
|
23
|
+
Note that if you make any database modifications, you are
|
24
|
+
responsible for updating the cache manually.
|
25
|
+
|
26
|
+
* A pg_static_cache_updater extension has been added. This extension
|
27
|
+
can automatically update the caches used by the static_cache plugin,
|
28
|
+
whenever the underlying database table is updated, using PostgreSQL's
|
29
|
+
notification channels.
|
30
|
+
|
31
|
+
This works by defining triggers on the underlying model tables that
|
32
|
+
use NOTIFY, and spinning up a thread in your application processes
|
33
|
+
that uses LISTEN, and refreshes the cache for the related model
|
34
|
+
whenever it receives a notification that the underlying table has
|
35
|
+
been modified.
|
36
|
+
|
37
|
+
This extension should make it possible to use the static_cache plugin
|
38
|
+
with the :frozen=>false option for any table that is small and not
|
39
|
+
frequently updated.
|
40
|
+
|
41
|
+
* A from_block extension has been added that makes Database#from operate
|
42
|
+
like Dataset#from in regards to a passed block, allowing you to write
|
43
|
+
code like:
|
44
|
+
|
45
|
+
DB.from{table_returning_function(arg1, arg2)}
|
46
|
+
|
47
|
+
* Database#supports_partial_indexes? has been added for checking for
|
48
|
+
partial index support. Partial indexes are now supported on SQLite
|
49
|
+
3.8.0+.
|
50
|
+
|
51
|
+
* A pg_loose_count extension has been added for fast approximate counts
|
52
|
+
of PostgreSQL tables. This uses the system tables and should be
|
53
|
+
fairly accurate if the table statistics are up to date:
|
54
|
+
|
55
|
+
DB.loose_count(:table)
|
56
|
+
|
57
|
+
* The Dataset#use_cursor method in the postgres adapter now supports
|
58
|
+
a :cursor_name option. You can set this option if you want to
|
59
|
+
use nested cursors.
|
60
|
+
|
61
|
+
* The mysql2 adapter now supports a :flags Database option allowing to
|
62
|
+
set custom mysql2 flags (e.g. ::Mysql2::Client::MULTI_STATEMENTS).
|
63
|
+
|
64
|
+
= Other Improvements
|
65
|
+
|
66
|
+
* Dataset#freeze has been implemented. Previously, it was not
|
67
|
+
implemented, so Object#freeze was used, which resulted in a dataset
|
68
|
+
that wasn't cloneable. Dataset#freeze now works as expected,
|
69
|
+
resulting in a cloneable dataset, but it doesn't allow methods to
|
70
|
+
be called that mutate the receiver.
|
71
|
+
|
72
|
+
* Dataset#dup has been implemented. Previously, it was not
|
73
|
+
implemented, so Object#dup was used, which resulted in a dataset
|
74
|
+
that shared an options hash with the receiver, so modifying the
|
75
|
+
dup's opts could also change the original dataset. Now dup works
|
76
|
+
similarly to clone, except that the returned object will not be
|
77
|
+
frozen.
|
78
|
+
|
79
|
+
* Model#dup has been implemented. Previously, it was not implemented,
|
80
|
+
so Object#dup was used, which resulted in a model instance that
|
81
|
+
shared the values hash with the receiver, so modifying the dup's
|
82
|
+
values also changed the original's values. Now, dup does a shallow
|
83
|
+
copy of some of the internal data structures as well, so the copy
|
84
|
+
is more independent.
|
85
|
+
|
86
|
+
Note that you still need to be careful if you mutate objects:
|
87
|
+
|
88
|
+
m = Model.new(:a=>'a')
|
89
|
+
m2 = m.dup
|
90
|
+
m.a.gsub!('a', 'b') # also changes m2
|
91
|
+
|
92
|
+
* Model#clone has been implemented. Previously, it had the same
|
93
|
+
issues as dup. Now, it calls the new Model#dup, but also
|
94
|
+
freezes the returned object if the receiver is frozen.
|
95
|
+
|
96
|
+
* Placeholder literal strings with an empty parameter hash are now
|
97
|
+
handled correctly.
|
98
|
+
|
99
|
+
= Backwards Compatibility
|
100
|
+
|
101
|
+
* The static_cache plugin now disallows saving/destroying instances
|
102
|
+
unless the :frozen=>false option is used. As the cached objects
|
103
|
+
returned by the model were frozen anyway, this affects creating
|
104
|
+
new instances or saving/destroying instances returned from the
|
105
|
+
underlying dataset.
|
106
|
+
|
107
|
+
* Model#set_values has been removed (it was deprecated starting in
|
108
|
+
Sequel 4.0).
|
109
|
+
|
110
|
+
* The following Model class methods are no longer defined:
|
111
|
+
insert_multiple, set, to_csv, paginate, query, set_overrides,
|
112
|
+
set_defaults. By default, these methods used call the
|
113
|
+
dataset method of the same name, but as those methods are no
|
114
|
+
longer defined on datasets by default, they also resulted in a
|
115
|
+
NoMethodError.
|
116
|
+
|
117
|
+
* Dataset#query!, #set_defaults!, and #set_overrides! are no longer
|
118
|
+
defined on all datasets. They are now only defined on datasets
|
119
|
+
that use the query or set_overrides extensions.
|
120
|
+
|
121
|
+
* Partial indexes are no longer returned by Database#indexes on MSSQL,
|
122
|
+
for consistency with PostgreSQL. Note that the same change was
|
123
|
+
desired for SQLite, but SQLite currently does not offer reflection
|
124
|
+
support for determining which indexes are partial.
|
125
|
+
|
126
|
+
* Database#foreign_key_list on MSSQL now will return a
|
127
|
+
SQL::QualifiedIdentifier instead of a symbol for the :table entry if
|
128
|
+
the schema of the referenced table does not match the schema of the
|
129
|
+
referencing table.
|
@@ -30,7 +30,8 @@ module Sequel
|
|
30
30
|
opts = server_opts(server)
|
31
31
|
opts[:host] ||= 'localhost'
|
32
32
|
opts[:username] ||= opts.delete(:user)
|
33
|
-
opts[:flags]
|
33
|
+
opts[:flags] ||= 0
|
34
|
+
opts[:flags] |= ::Mysql2::Client::FOUND_ROWS if ::Mysql2::Client.const_defined?(:FOUND_ROWS)
|
34
35
|
conn = ::Mysql2::Client.new(opts)
|
35
36
|
conn.query_options.merge!(:symbolize_keys=>true, :cache_rows=>false)
|
36
37
|
|
@@ -633,16 +633,19 @@ module Sequel
|
|
633
633
|
#
|
634
634
|
# * :rows_per_fetch - the number of rows per fetch (default 1000). Higher
|
635
635
|
# numbers result in fewer queries but greater memory use.
|
636
|
+
# * :cursor_name - the name assigned to the cursor (default 'sequel_cursor').
|
637
|
+
# Nested cursors require different names.
|
636
638
|
#
|
637
639
|
# Usage:
|
638
640
|
#
|
639
641
|
# DB[:huge_table].use_cursor.each{|row| p row}
|
640
642
|
# DB[:huge_table].use_cursor(:rows_per_fetch=>10000).each{|row| p row}
|
643
|
+
# DB[:huge_table].use_cursor(:cursor_name=>'my_cursor').each{|row| p row}
|
641
644
|
#
|
642
645
|
# This is untested with the prepared statement/bound variable support,
|
643
646
|
# and unlikely to work with either.
|
644
647
|
def use_cursor(opts=OPTS)
|
645
|
-
clone(:cursor=>{:rows_per_fetch=>1000}.merge(opts))
|
648
|
+
clone(:cursor=>{:rows_per_fetch=>1000, :cursor_name => 'sequel_cursor'}.merge(opts))
|
646
649
|
end
|
647
650
|
|
648
651
|
if SEQUEL_POSTGRES_USES_PG
|
@@ -757,12 +760,13 @@ module Sequel
|
|
757
760
|
# Use a cursor to fetch groups of records at a time, yielding them to the block.
|
758
761
|
def cursor_fetch_rows(sql)
|
759
762
|
server_opts = {:server=>@opts[:server] || :read_only}
|
763
|
+
cursor_name = quote_identifier(@opts[:cursor][:cursor_name])
|
760
764
|
db.transaction(server_opts) do
|
761
765
|
begin
|
762
|
-
execute_ddl("DECLARE
|
766
|
+
execute_ddl("DECLARE #{cursor_name} NO SCROLL CURSOR WITHOUT HOLD FOR #{sql}", server_opts)
|
763
767
|
rows_per_fetch = @opts[:cursor][:rows_per_fetch].to_i
|
764
768
|
rows_per_fetch = 1000 if rows_per_fetch <= 0
|
765
|
-
fetch_sql = "FETCH FORWARD #{rows_per_fetch} FROM
|
769
|
+
fetch_sql = "FETCH FORWARD #{rows_per_fetch} FROM #{cursor_name}"
|
766
770
|
cols = nil
|
767
771
|
# Load columns only in the first fetch, so subsequent fetches are faster
|
768
772
|
execute(fetch_sql) do |res|
|
@@ -777,7 +781,7 @@ module Sequel
|
|
777
781
|
end
|
778
782
|
end
|
779
783
|
ensure
|
780
|
-
execute_ddl("CLOSE
|
784
|
+
execute_ddl("CLOSE #{cursor_name}", server_opts)
|
781
785
|
end
|
782
786
|
end
|
783
787
|
end
|
@@ -75,7 +75,7 @@ module Sequel
|
|
75
75
|
referenced_schema = m.call(row[:schema])
|
76
76
|
referenced_table = m.call(row[:table])
|
77
77
|
h[row[:name]] = { :name => m.call(row[:name]),
|
78
|
-
:table => (referenced_schema == current_schema) ? referenced_table :
|
78
|
+
:table => (referenced_schema == current_schema) ? referenced_table : Sequel.qualify(referenced_schema, referenced_table),
|
79
79
|
:columns => [m.call(row[:column])],
|
80
80
|
:key => [m.call(row[:referenced_column])],
|
81
81
|
:on_update => fk_action_map[row[:update_referential_action]],
|
@@ -90,15 +90,20 @@ module Sequel
|
|
90
90
|
m = output_identifier_meth
|
91
91
|
im = input_identifier_meth
|
92
92
|
indexes = {}
|
93
|
-
metadata_dataset.from(:sys__tables___t).
|
93
|
+
ds = metadata_dataset.from(:sys__tables___t).
|
94
94
|
join(:sys__indexes___i, :object_id=>:object_id).
|
95
95
|
join(:sys__index_columns___ic, :object_id=>:object_id, :index_id=>:index_id).
|
96
96
|
join(:sys__columns___c, :object_id=>:object_id, :column_id=>:column_id).
|
97
97
|
select(:i__name, :i__is_unique, :c__name___column).
|
98
98
|
where{{t__name=>im.call(table)}}.
|
99
99
|
where(:i__is_primary_key=>0, :i__is_disabled=>0).
|
100
|
-
order(:i__name, :ic__index_column_id)
|
101
|
-
|
100
|
+
order(:i__name, :ic__index_column_id)
|
101
|
+
|
102
|
+
if supports_partial_indexes?
|
103
|
+
ds = ds.where(:i__has_filter=>0)
|
104
|
+
end
|
105
|
+
|
106
|
+
ds.each do |r|
|
102
107
|
index = indexes[m.call(r[:name])] ||= {:columns=>[], :unique=>(r[:is_unique] && r[:is_unique]!=0)}
|
103
108
|
index[:columns] << m.call(r[:column])
|
104
109
|
end
|
@@ -119,6 +124,11 @@ module Sequel
|
|
119
124
|
@server_version
|
120
125
|
end
|
121
126
|
|
127
|
+
# MSSQL 2008+ supports partial indexes.
|
128
|
+
def supports_partial_indexes?
|
129
|
+
dataset.send(:is_2008_or_later?)
|
130
|
+
end
|
131
|
+
|
122
132
|
# MSSQL supports savepoints, though it doesn't support committing/releasing them savepoint
|
123
133
|
def supports_savepoints?
|
124
134
|
true
|
@@ -276,6 +286,7 @@ module Sequel
|
|
276
286
|
# support for clustered index type
|
277
287
|
def index_definition_sql(table_name, index)
|
278
288
|
index_name = index[:name] || default_index_name(table_name, index[:columns])
|
289
|
+
raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
|
279
290
|
if index[:type] == :full_text
|
280
291
|
"CREATE FULLTEXT INDEX ON #{quote_schema_table(table_name)} #{literal(index[:columns])} KEY INDEX #{literal(index[:key_index])}"
|
281
292
|
else
|
@@ -401,6 +401,7 @@ module Sequel
|
|
401
401
|
# Handle MySQL specific index SQL syntax
|
402
402
|
def index_definition_sql(table_name, index)
|
403
403
|
index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
|
404
|
+
raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
|
404
405
|
index_type = case index[:type]
|
405
406
|
when :full_text
|
406
407
|
"FULLTEXT "
|
@@ -470,6 +470,11 @@ module Sequel
|
|
470
470
|
true
|
471
471
|
end
|
472
472
|
|
473
|
+
# PostgreSQL supports partial indexes.
|
474
|
+
def supports_partial_indexes?
|
475
|
+
true
|
476
|
+
end
|
477
|
+
|
473
478
|
# PostgreSQL supports prepared transactions (two-phase commit) if
|
474
479
|
# max_prepared_transactions is greater than 0.
|
475
480
|
def supports_prepared_transactions?
|
@@ -1238,6 +1243,11 @@ module Sequel
|
|
1238
1243
|
true
|
1239
1244
|
end
|
1240
1245
|
|
1246
|
+
# PostgreSQL 9.3rc1+ supports lateral subqueries
|
1247
|
+
def supports_lateral_subqueries?
|
1248
|
+
server_version >= 90300
|
1249
|
+
end
|
1250
|
+
|
1241
1251
|
# PostgreSQL supports modifying joined datasets
|
1242
1252
|
def supports_modifying_joins?
|
1243
1253
|
true
|
@@ -148,6 +148,11 @@ module Sequel
|
|
148
148
|
sqlite_version >= 30619
|
149
149
|
end
|
150
150
|
|
151
|
+
# SQLite 3.8.0+ supports partial indexes.
|
152
|
+
def supports_partial_indexes?
|
153
|
+
sqlite_version >= 30800
|
154
|
+
end
|
155
|
+
|
151
156
|
# SQLite 3.6.8+ supports savepoints.
|
152
157
|
def supports_savepoints?
|
153
158
|
sqlite_version >= 30608
|
@@ -47,6 +47,11 @@ module Sequel
|
|
47
47
|
respond_to?(:indexes)
|
48
48
|
end
|
49
49
|
|
50
|
+
# Whether the database supports partial indexes (indexes on a subset of a table).
|
51
|
+
def supports_partial_indexes?
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
50
55
|
# Whether the database and adapter support prepared transactions
|
51
56
|
# (two-phase commit), false by default.
|
52
57
|
def supports_prepared_transactions?
|
@@ -90,7 +95,7 @@ module Sequel
|
|
90
95
|
end
|
91
96
|
|
92
97
|
private
|
93
|
-
|
98
|
+
|
94
99
|
# Whether the database supports combining multiple alter table
|
95
100
|
# operations into a single query, false by default.
|
96
101
|
def supports_combining_alter_table_ops?
|
@@ -716,13 +716,9 @@ module Sequel
|
|
716
716
|
# and index specifications.
|
717
717
|
def index_definition_sql(table_name, index)
|
718
718
|
index_name = index[:name] || default_index_name(table_name, index[:columns])
|
719
|
-
if index[:type]
|
720
|
-
|
721
|
-
|
722
|
-
raise Error, "Partial indexes are not supported for this database"
|
723
|
-
else
|
724
|
-
"CREATE #{'UNIQUE ' if index[:unique]}INDEX #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{literal(index[:columns])}"
|
725
|
-
end
|
719
|
+
raise Error, "Index types are not supported for this database" if index[:type]
|
720
|
+
raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
|
721
|
+
"CREATE #{'UNIQUE ' if index[:unique]}INDEX #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{literal(index[:columns])}#{" WHERE #{filter_expr(index[:where])}" if index[:where]}"
|
726
722
|
end
|
727
723
|
|
728
724
|
# Array of SQL DDL statements, one for each index specification,
|
@@ -9,12 +9,11 @@ module Sequel
|
|
9
9
|
|
10
10
|
# Action methods defined by Sequel that execute code on the database.
|
11
11
|
ACTION_METHODS = (<<-METHS).split.map{|x| x.to_sym}
|
12
|
-
<< []
|
13
|
-
empty? fetch_rows first first! get import insert
|
12
|
+
<< [] all avg count columns columns! delete each
|
13
|
+
empty? fetch_rows first first! get import insert interval last
|
14
14
|
map max min multi_insert paged_each range select_hash select_hash_groups select_map select_order_map
|
15
|
-
|
15
|
+
single_record single_value sum to_hash to_hash_groups truncate update
|
16
16
|
METHS
|
17
|
-
# REMOVE40 []= insert_multiple set to_csv
|
18
17
|
|
19
18
|
# Inserts the given argument into the database. Returns self so it
|
20
19
|
# can be used safely when chaining:
|
@@ -95,6 +95,11 @@ module Sequel
|
|
95
95
|
true
|
96
96
|
end
|
97
97
|
|
98
|
+
# Whether the dataset supports LATERAL for subqueries in the FROM or JOIN clauses.
|
99
|
+
def supports_lateral_subqueries?
|
100
|
+
false
|
101
|
+
end
|
102
|
+
|
98
103
|
# Whether modifying joined datasets is supported.
|
99
104
|
def supports_modifying_joins?
|
100
105
|
false
|