forked from jeremyevans/sequel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3.38.0.txt
234 lines (172 loc) · 8.45 KB
/
3.38.0.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
= New Features
* A pg_row extension has been added that supports PostgreSQL's
row-valued/composite types. You can register support for
specific row types:
DB.register_row_type(:address)
Then you can create values of that row type:
ad = DB.row_type(:address, ['555 Foo St.', 'Bar City', '98765'])
# or
ad = DB.row_type(:address, :street=>'555 Foo St.',
:city=>'Bar City', :zip=>'98765')
Which you can use in your datasets:
DB[:people].insert(:name=>'Me', :address=>ad)
If you are using the native postgres adapter, when retreiving
row type values, they will be returned as instances of the row
type, which are hash-like objects:
ad = DB[:people].get(:address)
ad[:street] # => '555 Foo St.'
ad[:city] # => 'Bar City'
ad[:zip] # => '98765'
If you are also using the pg_array extension, then arrays of
composite types are supported automatically. Composite
types can also include arrays of other types as well as other
composite types, though recursive composite types are not
allowed by PostgreSQL.
Using arrays and composite types brings one of the benefits
of document databases to PostgreSQL, allowing you to store
nested structures inside a single row.
* A pg_row_ops extension has been added that adds DSL support
for accessing members of row-valued/composite types. You
first create a row op:
r = Sequel.pg_row_op(:row_column)
Then you can get DSL support for accessing members of that
row_column via the #[] method:
r[:a] # (row_column).a
This works with composite types containing composite types:
r[:a][:b] # ((row_column).a).b
When used in conjunction with the pg_array_ops extension,
there is support for composite types that include arrays,
as well as arrays of composite types:
r[1][:a] # (row_column[1]).a
r[:a][1] # (row_column).a[1]
The extension offers additional support for referencing
a table's type when it contains a column with the same
name, see the RDoc for details.
* A pg_row plugin has been added, that works with the pg_row
extension, and allows you to represent row-valued types as
Sequel::Model objects (instead of the hash-like objects
they use by default). In your model class, you load the
plugin:
class Address < Sequel::Model(:address)
plugin :pg_row
end
Then you can use Address instances in your datasets:
ad = Address.new(:street=>'555 Foo St.',
:city=>'Bar City', :zip=>'98765')
DB[:people].insert(:name=>'Me', :address=>ad)
And if you are using the native postgres adapter, the dataset
will return the type as a model instance:
ad = DB[:people].get(:address)
ad.street # => '555 Foo St.'
ad.city # => 'Bar City'
ad.zip # => '98765'
* A pg_typecast_on_load plugin has been added. This plugin is
designed for use with the jdbc/postgres, do/postgres, and
swift/postgres adapters, and it is similar to the
typecast_on_load plugin. However, while the typecast_on_load
plugin uses setter methods, the pg_typecast_on_load plugin
uses the same code that the native postgres adapter uses for
typecasting.
* The tinytds adapter now supports a :textsize option to override
the default TEXTSIZE setting. The FreeTDS default is fairly
small (~64k), so if you want to use large blob or text columns,
you should probably set this to a value larger than the
largest text/blob you want to use.
* Sequel.expr when called with a symbol now splits the symbol and
returns an Identifier, QualifiedIdentifier, or AliasedExpression,
depending on the content of the symbol. Previously, it only
wrapped the symbol using a Wrapper.
* Identifier#* and QualifiedIdentifier#* when called without any
argument now represent a selection of all columns from the
represented table:
Sequel.expr(:table).* # table.*
Sequel.expr(:schema__table).* # schema.table.*
This makes it easier to represent the selection of all columns
in a table without using the core extensions.
* Model#values now has a Model#to_hash alias.
* SQL::Blob values now have as, cast, and lit methods even if the
core extensions are not loaded.
= Other Improvements
* When loading multiple pg_* extensions into a Database instance,
the conversion procs are only reset once instead of once per
extension.
* All adapters that access PostgreSQL now store type conversion
procs, similar to the native postgres adapter. This has been
added to make it easier to write extensions that support
advanced PostgreSQL types.
* Database#schema output on PostgreSQL now includes the type oid
for each column.
* You can now register custom array types to specific Database
instances, using the :type_procs and :typecast_methods_module
options, so it is now possible to have custom array types
without affecting global state.
* Dropping of columns with defaults now works correctly on
Microsoft SQL Server. Before, it would fail as the related
constraint was not dropped first.
* The MySQL type "double(x,y)" is now recognized as a float type.
* The jdbc/jtds and jdbc/derby adapters now handle nil prepared
statement values in more cases.
* Blob prepared statement arguments are now handled correctly on
jdbc/db2 and jdbc/oracle.
* Sequel now works around a Time#nsec bug in JRuby 1.6 ruby 1.9 mode
when using Time values in prepared statements in the jdbc adapter.
* Java::JavaUtil::UUID types are now returned as ruby strings
when converting types in the jdbc adapter.
* Real boolean literals are now used on derby 10.7+. On derby <10.7
Sequel still uses (1 = 1) and (1 != 1) for true and false. This
allows you to use boolean columns with a true/false default on
derby 10.7+.
* Clobs are now treated as string types instead of blobs on derby,
since treating clob as blob doesn't work there.
* The swift adapter now supports an output identifier method.
* The swift adapter now returns blobs as SQL::Blob instances.
* The schema_dumper extension no longer produces code that requires
the core extensions.
* All of Sequel's specs now run without the core extensions loaded,
ensuring that none of the internals depend on the core extensions.
The only exception is the specs for the core extensions themselves.
= Backwards Compatibility
* The pg_* extensions no longer modify core classes if the
core_extensions extension is not loaded. All methods they added now
have equivalent methods on the main Sequel module:
Sequel.pg_array
Sequel.pg_array_op
Sequel.hstore
Sequel.hstore_op
Sequel.pg_json
Sequel.pg_range
Sequel.pg_range_op
* The Sequel::SQL::IdentifierMethods module has been removed. This
module was only included in Symbol if the core_extensions were
enabled. Since it only defined a single method, now the core
extensions just define that method directly on Symbol.
* The swift adapter now requires swift-db-{postgres,mysql,sqlite3}
gems instead of the swift gem. swift/postgres requires
swift-db-postgres 0.2.0+, swift/sqlite requires swift-db-sqlite
0.1.2+, and swift/mysql requires swift-db-mysql.
* Sequel will no longer typecast a string to a PostgreSQL array
or hstore column in a model column setter. This is because the
parsers that Sequel uses were designed to support only
PostgreSQL's output format. It's unlikely that a user would
provide that format for typecasting, and while there aren't known
security issues with the parsers, they were not designed to handle
arbtirary user input, so typecasting from string is no longer
allowed and will now raise an error.
The only reason such typecasting was allowed in the first place
was to work around issues in the jdbc/postgres, do/postgres, and
swift/postgres adapters, using the the typecast_on_load plugin.
If you were previously using the typecast_on_load plugin for
hstore or array columns, you need to switch to using the new
pg_typecast_on_load plugin.
* The private get_conversion_procs method in the postgres adapter
no longer accepts an argument.
* The Sequel::Postgres::PGArray::DatabaseMethods singleton
define_array_typecast_method method has been removed. This
method was designed for internal use.
* The change to make Sequel.expr split symbols can cause the
following type of code to break:
Sequel.expr(:column___alias).desc
This is because expr now returns an AliasedExpression, which
doesn't support the desc method. However, as you can't
apply an order to an aliased expression, nobody should be
relying on this.