sequel 4.45.0 → 4.46.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +108 -0
- data/doc/release_notes/4.46.0.txt +404 -0
- data/doc/security.rdoc +9 -0
- data/doc/sql.rdoc +2 -2
- data/doc/testing.rdoc +1 -1
- data/doc/validations.rdoc +1 -2
- data/lib/sequel/adapters/ado.rb +8 -3
- data/lib/sequel/adapters/ado/access.rb +8 -4
- data/lib/sequel/adapters/ado/mssql.rb +3 -1
- data/lib/sequel/adapters/amalgalite.rb +5 -0
- data/lib/sequel/adapters/cubrid.rb +16 -7
- data/lib/sequel/adapters/do.rb +7 -1
- data/lib/sequel/adapters/do/mysql.rb +8 -4
- data/lib/sequel/adapters/ibmdb.rb +10 -5
- data/lib/sequel/adapters/jdbc.rb +8 -2
- data/lib/sequel/adapters/jdbc/as400.rb +10 -3
- data/lib/sequel/adapters/jdbc/db2.rb +27 -16
- data/lib/sequel/adapters/jdbc/derby.rb +47 -20
- data/lib/sequel/adapters/jdbc/h2.rb +13 -7
- data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
- data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
- data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
- data/lib/sequel/adapters/mock.rb +5 -0
- data/lib/sequel/adapters/mysql.rb +8 -1
- data/lib/sequel/adapters/mysql2.rb +6 -1
- data/lib/sequel/adapters/odbc.rb +20 -8
- data/lib/sequel/adapters/odbc/mssql.rb +6 -3
- data/lib/sequel/adapters/oracle.rb +12 -6
- data/lib/sequel/adapters/postgres.rb +20 -8
- data/lib/sequel/adapters/shared/access.rb +76 -47
- data/lib/sequel/adapters/shared/cubrid.rb +16 -11
- data/lib/sequel/adapters/shared/db2.rb +46 -19
- data/lib/sequel/adapters/shared/firebird.rb +20 -8
- data/lib/sequel/adapters/shared/informix.rb +6 -3
- data/lib/sequel/adapters/shared/mssql.rb +132 -72
- data/lib/sequel/adapters/shared/mysql.rb +112 -65
- data/lib/sequel/adapters/shared/oracle.rb +36 -21
- data/lib/sequel/adapters/shared/postgres.rb +91 -56
- data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
- data/lib/sequel/adapters/shared/sqlite.rb +67 -32
- data/lib/sequel/adapters/sqlanywhere.rb +9 -1
- data/lib/sequel/adapters/sqlite.rb +8 -1
- data/lib/sequel/adapters/swift.rb +5 -0
- data/lib/sequel/adapters/swift/mysql.rb +4 -2
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +10 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
- data/lib/sequel/adapters/utils/pg_types.rb +14 -6
- data/lib/sequel/adapters/utils/replace.rb +4 -2
- data/lib/sequel/connection_pool/single.rb +2 -2
- data/lib/sequel/core.rb +24 -11
- data/lib/sequel/database/connecting.rb +9 -3
- data/lib/sequel/database/dataset_defaults.rb +7 -1
- data/lib/sequel/database/logging.rb +1 -0
- data/lib/sequel/database/misc.rb +5 -2
- data/lib/sequel/database/query.rb +7 -5
- data/lib/sequel/database/schema_generator.rb +1 -0
- data/lib/sequel/database/schema_methods.rb +50 -27
- data/lib/sequel/database/transactions.rb +19 -9
- data/lib/sequel/dataset/actions.rb +15 -6
- data/lib/sequel/dataset/graph.rb +15 -5
- data/lib/sequel/dataset/misc.rb +12 -4
- data/lib/sequel/dataset/mutation.rb +17 -8
- data/lib/sequel/dataset/prepared_statements.rb +3 -2
- data/lib/sequel/dataset/query.rb +84 -38
- data/lib/sequel/dataset/sql.rb +302 -191
- data/lib/sequel/deprecated.rb +26 -17
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/from_block.rb +1 -0
- data/lib/sequel/extensions/graph_each.rb +1 -1
- data/lib/sequel/extensions/identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/migration.rb +28 -4
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +4 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
- data/lib/sequel/extensions/set_overrides.rb +2 -0
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +11 -7
- data/lib/sequel/model/associations.rb +5 -7
- data/lib/sequel/model/base.rb +47 -45
- data/lib/sequel/model/dataset_module.rb +9 -14
- data/lib/sequel/model/plugins.rb +3 -0
- data/lib/sequel/no_core_ext.rb +1 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -1
- data/lib/sequel/plugins/boolean_subsets.rb +7 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
- data/lib/sequel/plugins/dataset_associations.rb +1 -1
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/finder.rb +240 -0
- data/lib/sequel/plugins/inverted_subsets.rb +19 -12
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/schema.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
- data/lib/sequel/plugins/subset_conditions.rb +11 -3
- data/lib/sequel/plugins/whitelist_security.rb +118 -0
- data/lib/sequel/sql.rb +80 -36
- data/lib/sequel/timezones.rb +2 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +20 -0
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/oracle_spec.rb +12 -8
- data/spec/adapters/postgres_spec.rb +1 -1
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +36 -34
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +87 -9
- data/spec/core/dataset_spec.rb +501 -129
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +146 -60
- data/spec/core/mock_adapter_spec.rb +1 -1
- data/spec/core/object_graph_spec.rb +61 -9
- data/spec/core/placeholder_literalizer_spec.rb +20 -2
- data/spec/core/schema_generator_spec.rb +6 -6
- data/spec/core/schema_spec.rb +54 -5
- data/spec/core_extensions_spec.rb +122 -18
- data/spec/deprecation_helper.rb +27 -2
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
- data/spec/extensions/association_proxies_spec.rb +2 -2
- data/spec/extensions/auto_literal_strings_spec.rb +212 -0
- data/spec/extensions/blacklist_security_spec.rb +1 -0
- data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
- data/spec/extensions/column_select_spec.rb +20 -8
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/core_refinements_spec.rb +29 -12
- data/spec/extensions/dataset_associations_spec.rb +12 -12
- data/spec/extensions/def_dataset_method_spec.rb +100 -0
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +260 -0
- data/spec/extensions/graph_each_spec.rb +2 -2
- data/spec/extensions/identifier_mangling_spec.rb +14 -8
- data/spec/extensions/inverted_subsets_spec.rb +4 -4
- data/spec/extensions/lazy_attributes_spec.rb +7 -0
- data/spec/extensions/many_through_many_spec.rb +38 -14
- data/spec/extensions/nested_attributes_spec.rb +18 -6
- data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
- data/spec/extensions/pg_enum_spec.rb +16 -1
- data/spec/extensions/pg_interval_spec.rb +11 -2
- data/spec/extensions/pg_loose_count_spec.rb +5 -0
- data/spec/extensions/pg_row_spec.rb +25 -0
- data/spec/extensions/prepared_statements_spec.rb +10 -1
- data/spec/extensions/query_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/set_overrides_spec.rb +7 -3
- data/spec/extensions/sql_expr_spec.rb +0 -1
- data/spec/extensions/subset_conditions_spec.rb +6 -6
- data/spec/extensions/table_select_spec.rb +24 -12
- data/spec/extensions/to_dot_spec.rb +4 -4
- data/spec/extensions/whitelist_security_spec.rb +131 -0
- data/spec/integration/dataset_test.rb +9 -5
- data/spec/integration/model_test.rb +2 -0
- data/spec/integration/plugin_test.rb +2 -2
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/model/associations_spec.rb +39 -11
- data/spec/model/base_spec.rb +44 -24
- data/spec/model/class_dataset_methods_spec.rb +18 -16
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +84 -24
- data/spec/model/model_spec.rb +97 -63
- data/spec/model/record_spec.rb +21 -13
- metadata +13 -2
@@ -8,7 +8,28 @@ module Sequel
|
|
8
8
|
module JDBC
|
9
9
|
Sequel.synchronize do
|
10
10
|
DATABASE_SETUP[:db2] = proc do |db|
|
11
|
+
(class << db; self; end).class_eval do
|
12
|
+
alias jdbc_schema_parse_table schema_parse_table
|
13
|
+
alias jdbc_tables tables
|
14
|
+
alias jdbc_views views
|
15
|
+
alias jdbc_indexes indexes
|
16
|
+
end
|
11
17
|
db.extend(Sequel::JDBC::DB2::DatabaseMethods)
|
18
|
+
(class << db; self; end).class_eval do
|
19
|
+
alias schema_parse_table jdbc_schema_parse_table
|
20
|
+
alias tables jdbc_tables
|
21
|
+
alias views jdbc_views
|
22
|
+
alias indexes jdbc_indexes
|
23
|
+
%w'schema_parse_table tables views indexes'.each do |s|
|
24
|
+
class_eval(<<-END, __FILE__, __LINE__+1)
|
25
|
+
def jdbc_#{s}(*a)
|
26
|
+
Sequel::Deprecation.deprecate("Database#jdbc_#{s} in the jdbc/db2 adapter", "Use Database\##{s} instead")
|
27
|
+
#{s}(*a)
|
28
|
+
end
|
29
|
+
END
|
30
|
+
# remove_method(:"jdbc_#{s}") # SEQUEL5
|
31
|
+
end
|
32
|
+
end
|
12
33
|
db.dataset_class = Sequel::JDBC::DB2::Dataset
|
13
34
|
com.ibm.db2.jcc.DB2Driver
|
14
35
|
end
|
@@ -24,29 +45,19 @@ module Sequel
|
|
24
45
|
end
|
25
46
|
end
|
26
47
|
|
27
|
-
class Database
|
28
|
-
# Alias the generic JDBC versions so they can be called directly later
|
29
|
-
alias jdbc_schema_parse_table schema_parse_table
|
30
|
-
alias jdbc_tables tables
|
31
|
-
alias jdbc_views views
|
32
|
-
alias jdbc_indexes indexes
|
33
|
-
end
|
34
|
-
|
35
48
|
# Database and Dataset instance methods for DB2 specific
|
36
49
|
# support via JDBC.
|
37
50
|
module DB2
|
38
51
|
# Database instance methods for DB2 databases accessed via JDBC.
|
39
52
|
module DatabaseMethods
|
40
|
-
PRIMARY_KEY_INDEX_RE = /\Asql\d+\z/i.freeze
|
41
|
-
|
42
53
|
include Sequel::DB2::DatabaseMethods
|
43
54
|
include Sequel::JDBC::Transactions
|
55
|
+
|
56
|
+
PRIMARY_KEY_INDEX_RE = /\Asql\d+\z/i.freeze
|
57
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
44
58
|
IDENTITY_VAL_LOCAL = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1".freeze
|
59
|
+
Sequel::Deprecation.deprecate_constant(self, :IDENTITY_VAL_LOCAL)
|
45
60
|
|
46
|
-
%w'schema_parse_table tables views indexes'.each do |s|
|
47
|
-
class_eval("def #{s}(*a) jdbc_#{s}(*a) end", __FILE__, __LINE__)
|
48
|
-
end
|
49
|
-
|
50
61
|
private
|
51
62
|
|
52
63
|
def set_ps_arg(cps, arg, i)
|
@@ -64,7 +75,7 @@ module Sequel
|
|
64
75
|
|
65
76
|
def last_insert_id(conn, opts=OPTS)
|
66
77
|
statement(conn) do |stmt|
|
67
|
-
sql = IDENTITY_VAL_LOCAL
|
78
|
+
sql = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1"
|
68
79
|
rs = log_connection_yield(sql, conn){stmt.executeQuery(sql)}
|
69
80
|
rs.next
|
70
81
|
rs.getLong(1)
|
@@ -73,7 +84,7 @@ module Sequel
|
|
73
84
|
|
74
85
|
# Primary key indexes appear to be named sqlNNNN on DB2
|
75
86
|
def primary_key_index_re
|
76
|
-
|
87
|
+
/\Asql\d+\z/i
|
77
88
|
end
|
78
89
|
|
79
90
|
def setup_type_convertor_map
|
@@ -18,6 +18,7 @@ module Sequel
|
|
18
18
|
# Instance methods for Derby Database objects accessed via JDBC.
|
19
19
|
module DatabaseMethods
|
20
20
|
PRIMARY_KEY_INDEX_RE = /\Asql\d+\z/i.freeze
|
21
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
21
22
|
|
22
23
|
include ::Sequel::JDBC::Transactions
|
23
24
|
|
@@ -159,7 +160,7 @@ module Sequel
|
|
159
160
|
|
160
161
|
# Primary key indexes appear to be named sqlNNNN on Derby
|
161
162
|
def primary_key_index_re
|
162
|
-
|
163
|
+
/\Asql\d+\z/i
|
163
164
|
end
|
164
165
|
|
165
166
|
# If an :identity option is present in the column, add the necessary IDENTITY SQL.
|
@@ -190,23 +191,40 @@ module Sequel
|
|
190
191
|
|
191
192
|
# Dataset class for Derby datasets accessed via JDBC.
|
192
193
|
class Dataset < JDBC::Dataset
|
193
|
-
PAREN_CLOSE =
|
194
|
-
|
195
|
-
|
194
|
+
PAREN_CLOSE = ')'.freeze
|
195
|
+
Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
|
196
|
+
PAREN_OPEN = '('.freeze
|
197
|
+
Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
|
198
|
+
OFFSET = " OFFSET ".freeze
|
199
|
+
Sequel::Deprecation.deprecate_constant(self, :OFFSET)
|
196
200
|
CAST_STRING_OPEN = "RTRIM(".freeze
|
201
|
+
Sequel::Deprecation.deprecate_constant(self, :CAST_STRING_OPEN)
|
197
202
|
BLOB_OPEN = "CAST(X'".freeze
|
203
|
+
Sequel::Deprecation.deprecate_constant(self, :BLOB_OPEN)
|
198
204
|
BLOB_CLOSE = "' AS BLOB)".freeze
|
205
|
+
Sequel::Deprecation.deprecate_constant(self, :BLOB_CLOSE)
|
199
206
|
HSTAR = "H*".freeze
|
207
|
+
Sequel::Deprecation.deprecate_constant(self, :HSTAR)
|
200
208
|
TIME_FORMAT = "'%H:%M:%S'".freeze
|
209
|
+
Sequel::Deprecation.deprecate_constant(self, :TIME_FORMAT)
|
201
210
|
DEFAULT_FROM = " FROM sysibm.sysdummy1".freeze
|
211
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_FROM)
|
202
212
|
ROWS = " ROWS".freeze
|
213
|
+
Sequel::Deprecation.deprecate_constant(self, :ROWS)
|
203
214
|
FETCH_FIRST = " FETCH FIRST ".freeze
|
215
|
+
Sequel::Deprecation.deprecate_constant(self, :FETCH_FIRST)
|
204
216
|
ROWS_ONLY = " ROWS ONLY".freeze
|
217
|
+
Sequel::Deprecation.deprecate_constant(self, :ROWS_ONLY)
|
205
218
|
BOOL_TRUE_OLD = '(1 = 1)'.freeze
|
219
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE_OLD)
|
206
220
|
BOOL_FALSE_OLD = '(1 = 0)'.freeze
|
221
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE_OLD)
|
207
222
|
BOOL_TRUE = 'TRUE'.freeze
|
223
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
|
208
224
|
BOOL_FALSE = 'FALSE'.freeze
|
225
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
|
209
226
|
EMULATED_FUNCTION_MAP = {:char_length=>'length'.freeze}
|
227
|
+
Sequel::Deprecation.deprecate_constant(self, :EMULATED_FUNCTION_MAP)
|
210
228
|
|
211
229
|
# Derby doesn't support an expression between CASE and WHEN,
|
212
230
|
# so remove
|
@@ -220,9 +238,9 @@ module Sequel
|
|
220
238
|
# a string and the ending whitespace is important.
|
221
239
|
def cast_sql_append(sql, expr, type)
|
222
240
|
if type == String
|
223
|
-
sql <<
|
241
|
+
sql << "RTRIM("
|
224
242
|
super
|
225
|
-
sql <<
|
243
|
+
sql << ')'
|
226
244
|
else
|
227
245
|
super
|
228
246
|
end
|
@@ -241,9 +259,9 @@ module Sequel
|
|
241
259
|
literal_append(sql, args[0])
|
242
260
|
sql << "))"
|
243
261
|
when :extract
|
244
|
-
sql << args
|
245
|
-
literal_append(sql, args
|
246
|
-
sql <<
|
262
|
+
sql << args[0].to_s << '('
|
263
|
+
literal_append(sql, args[1])
|
264
|
+
sql << ')'
|
247
265
|
else
|
248
266
|
super
|
249
267
|
end
|
@@ -267,12 +285,12 @@ module Sequel
|
|
267
285
|
private
|
268
286
|
|
269
287
|
def empty_from_sql
|
270
|
-
|
288
|
+
" FROM sysibm.sysdummy1"
|
271
289
|
end
|
272
290
|
|
273
291
|
# Derby needs a hex string casted to BLOB for blobs.
|
274
292
|
def literal_blob_append(sql, v)
|
275
|
-
sql <<
|
293
|
+
sql << "CAST(X'" << v.unpack("H*").first << "' AS BLOB)"
|
276
294
|
end
|
277
295
|
|
278
296
|
# Derby needs the standard workaround to insert all default values into
|
@@ -285,24 +303,24 @@ module Sequel
|
|
285
303
|
# Newer versions can use the FALSE literal, but the latest gem version cannot.
|
286
304
|
def literal_false
|
287
305
|
if db.svn_version >= 1040133
|
288
|
-
|
306
|
+
'FALSE'
|
289
307
|
else
|
290
|
-
|
308
|
+
'(1 = 0)'
|
291
309
|
end
|
292
310
|
end
|
293
311
|
|
294
312
|
# Derby handles fractional seconds in timestamps, but not in times
|
295
313
|
def literal_sqltime(v)
|
296
|
-
v.strftime(
|
314
|
+
v.strftime("'%H:%M:%S'")
|
297
315
|
end
|
298
316
|
|
299
317
|
# Derby uses an expression yielding true for true values.
|
300
318
|
# Newer versions can use the TRUE literal, but the latest gem version cannot.
|
301
319
|
def literal_true
|
302
320
|
if db.svn_version >= 1040133
|
303
|
-
|
321
|
+
'TRUE'
|
304
322
|
else
|
305
|
-
|
323
|
+
'(1 = 1)'
|
306
324
|
end
|
307
325
|
end
|
308
326
|
|
@@ -311,17 +329,26 @@ module Sequel
|
|
311
329
|
:values
|
312
330
|
end
|
313
331
|
|
332
|
+
# Emulate the char_length function with length
|
333
|
+
def native_function_name(emulated_function)
|
334
|
+
if emulated_function == :char_length
|
335
|
+
'length'
|
336
|
+
else
|
337
|
+
super
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
314
341
|
# Offset comes before limit in Derby
|
315
342
|
def select_limit_sql(sql)
|
316
343
|
if o = @opts[:offset]
|
317
|
-
sql << OFFSET
|
344
|
+
sql << " OFFSET "
|
318
345
|
literal_append(sql, o)
|
319
|
-
sql << ROWS
|
346
|
+
sql << " ROWS"
|
320
347
|
end
|
321
348
|
if l = @opts[:limit]
|
322
|
-
sql <<
|
349
|
+
sql << " FETCH FIRST "
|
323
350
|
literal_append(sql, l)
|
324
|
-
sql <<
|
351
|
+
sql << " ROWS ONLY"
|
325
352
|
end
|
326
353
|
end
|
327
354
|
end
|
@@ -17,6 +17,7 @@ module Sequel
|
|
17
17
|
# Instance methods for H2 Database objects accessed via JDBC.
|
18
18
|
module DatabaseMethods
|
19
19
|
PRIMARY_KEY_INDEX_RE = /\Aprimary_key/i.freeze
|
20
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
20
21
|
|
21
22
|
# Commit an existing prepared transaction with the given transaction
|
22
23
|
# identifier string.
|
@@ -150,7 +151,7 @@ module Sequel
|
|
150
151
|
end
|
151
152
|
|
152
153
|
def primary_key_index_re
|
153
|
-
|
154
|
+
/\Aprimary_key/i
|
154
155
|
end
|
155
156
|
|
156
157
|
# H2 does not support named column constraints.
|
@@ -167,17 +168,22 @@ module Sequel
|
|
167
168
|
|
168
169
|
# Dataset class for H2 datasets accessed via JDBC.
|
169
170
|
class Dataset < JDBC::Dataset
|
170
|
-
APOS = Dataset::APOS
|
171
|
-
HSTAR = "H*".freeze
|
172
171
|
ILIKE_PLACEHOLDER = ["CAST(".freeze, " AS VARCHAR_IGNORECASE)".freeze].freeze
|
172
|
+
|
173
|
+
APOS = "'".freeze
|
174
|
+
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
175
|
+
HSTAR = "H*".freeze
|
176
|
+
Sequel::Deprecation.deprecate_constant(self, :HSTAR)
|
173
177
|
TIME_FORMAT = "'%H:%M:%S'".freeze
|
178
|
+
Sequel::Deprecation.deprecate_constant(self, :TIME_FORMAT)
|
174
179
|
ONLY_OFFSET = " LIMIT -1 OFFSET ".freeze
|
180
|
+
Sequel::Deprecation.deprecate_constant(self, :ONLY_OFFSET)
|
175
181
|
|
176
182
|
# Emulate the case insensitive LIKE operator and the bitwise operators.
|
177
183
|
def complex_expression_sql_append(sql, op, args)
|
178
184
|
case op
|
179
185
|
when :ILIKE, :"NOT ILIKE"
|
180
|
-
super(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), [SQL::PlaceholderLiteralString.new(ILIKE_PLACEHOLDER, [args
|
186
|
+
super(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), [SQL::PlaceholderLiteralString.new(ILIKE_PLACEHOLDER, [args[0]]), args[1]])
|
181
187
|
when :&, :|, :^, :<<, :>>, :'B~'
|
182
188
|
complex_expression_emulate_append(sql, op, args)
|
183
189
|
else
|
@@ -214,12 +220,12 @@ module Sequel
|
|
214
220
|
|
215
221
|
# H2 expects hexadecimal strings for blob values
|
216
222
|
def literal_blob_append(sql, v)
|
217
|
-
sql <<
|
223
|
+
sql << "'" << v.unpack("H*").first << "'"
|
218
224
|
end
|
219
225
|
|
220
226
|
# H2 handles fractional seconds in timestamps, but not in times
|
221
227
|
def literal_sqltime(v)
|
222
|
-
v.strftime(
|
228
|
+
v.strftime("'%H:%M:%S'")
|
223
229
|
end
|
224
230
|
|
225
231
|
# H2 supports multiple rows in INSERT.
|
@@ -228,7 +234,7 @@ module Sequel
|
|
228
234
|
end
|
229
235
|
|
230
236
|
def select_only_offset_sql(sql)
|
231
|
-
sql <<
|
237
|
+
sql << " LIMIT -1 OFFSET "
|
232
238
|
literal_append(sql, @opts[:offset])
|
233
239
|
end
|
234
240
|
|
@@ -18,6 +18,7 @@ module Sequel
|
|
18
18
|
# Instance methods for HSQLDB Database objects accessed via JDBC.
|
19
19
|
module DatabaseMethods
|
20
20
|
PRIMARY_KEY_INDEX_RE = /\Asys_idx_sys_pk_/i.freeze
|
21
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
21
22
|
|
22
23
|
include ::Sequel::JDBC::Transactions
|
23
24
|
|
@@ -40,7 +41,7 @@ module Sequel
|
|
40
41
|
# The version of the database, as an integer (e.g 2.2.5 -> 20205)
|
41
42
|
def db_version
|
42
43
|
return @db_version if defined?(@db_version)
|
43
|
-
v = get
|
44
|
+
v = get(Sequel.function(:DATABASE_VERSION))
|
44
45
|
@db_version = if v =~ /(\d+)\.(\d+)\.(\d+)/
|
45
46
|
$1.to_i * 10000 + $2.to_i * 100 + $3.to_i
|
46
47
|
end
|
@@ -112,7 +113,7 @@ module Sequel
|
|
112
113
|
|
113
114
|
# Primary key indexes appear to start with sys_idx_sys_pk_ on HSQLDB
|
114
115
|
def primary_key_index_re
|
115
|
-
|
116
|
+
/\Asys_idx_sys_pk_/i
|
116
117
|
end
|
117
118
|
|
118
119
|
# If an :identity option is present in the column, add the necessary IDENTITY SQL.
|
@@ -146,13 +147,21 @@ module Sequel
|
|
146
147
|
# Dataset class for HSQLDB datasets accessed via JDBC.
|
147
148
|
class Dataset < JDBC::Dataset
|
148
149
|
BOOL_TRUE = 'TRUE'.freeze
|
150
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
|
149
151
|
BOOL_FALSE = 'FALSE'.freeze
|
152
|
+
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
|
150
153
|
SQL_WITH_RECURSIVE = "WITH RECURSIVE ".freeze
|
151
|
-
|
154
|
+
Sequel::Deprecation.deprecate_constant(self, :SQL_WITH_RECURSIVE)
|
155
|
+
APOS = "'".freeze
|
156
|
+
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
152
157
|
HSTAR = "H*".freeze
|
158
|
+
Sequel::Deprecation.deprecate_constant(self, :HSTAR)
|
153
159
|
BLOB_OPEN = "X'".freeze
|
160
|
+
Sequel::Deprecation.deprecate_constant(self, :BLOB_OPEN)
|
154
161
|
DEFAULT_FROM = " FROM (VALUES (0))".freeze
|
162
|
+
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_FROM)
|
155
163
|
TIME_FORMAT = "'%H:%M:%S'".freeze
|
164
|
+
Sequel::Deprecation.deprecate_constant(self, :TIME_FORMAT)
|
156
165
|
|
157
166
|
# Handle HSQLDB specific case insensitive LIKE and bitwise operator support.
|
158
167
|
def complex_expression_sql_append(sql, op, args)
|
@@ -198,27 +207,27 @@ module Sequel
|
|
198
207
|
private
|
199
208
|
|
200
209
|
def empty_from_sql
|
201
|
-
|
210
|
+
" FROM (VALUES (0))"
|
202
211
|
end
|
203
212
|
|
204
213
|
# Use string in hex format for blob data.
|
205
214
|
def literal_blob_append(sql, v)
|
206
|
-
sql <<
|
215
|
+
sql << "X'" << v.unpack("H*").first << "'"
|
207
216
|
end
|
208
217
|
|
209
218
|
# HSQLDB uses FALSE for false values.
|
210
219
|
def literal_false
|
211
|
-
|
220
|
+
'FALSE'
|
212
221
|
end
|
213
222
|
|
214
223
|
# HSQLDB handles fractional seconds in timestamps, but not in times
|
215
224
|
def literal_sqltime(v)
|
216
|
-
v.strftime(
|
225
|
+
v.strftime("'%H:%M:%S'")
|
217
226
|
end
|
218
227
|
|
219
228
|
# HSQLDB uses TRUE for true values.
|
220
229
|
def literal_true
|
221
|
-
|
230
|
+
'TRUE'
|
222
231
|
end
|
223
232
|
|
224
233
|
# HSQLDB supports multiple rows in INSERT.
|
@@ -228,7 +237,7 @@ module Sequel
|
|
228
237
|
|
229
238
|
# Use WITH RECURSIVE instead of WITH if any of the CTEs is recursive
|
230
239
|
def select_with_sql_base
|
231
|
-
opts[:with].any?{|w| w[:recursive]} ?
|
240
|
+
opts[:with].any?{|w| w[:recursive]} ? "WITH RECURSIVE " : super
|
232
241
|
end
|
233
242
|
end
|
234
243
|
end
|
@@ -10,8 +10,11 @@ module Sequel
|
|
10
10
|
# Database instance methods for MSSQL databases accessed via JDBC.
|
11
11
|
module DatabaseMethods
|
12
12
|
PRIMARY_KEY_INDEX_RE = /\Apk__/i.freeze
|
13
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
13
14
|
ATAT_IDENTITY = 'SELECT @@IDENTITY'.freeze
|
15
|
+
Sequel::Deprecation.deprecate_constant(self, :ATAT_IDENTITY)
|
14
16
|
SCOPE_IDENTITY = 'SELECT SCOPE_IDENTITY()'.freeze
|
17
|
+
Sequel::Deprecation.deprecate_constant(self, :SCOPE_IDENTITY)
|
15
18
|
|
16
19
|
include Sequel::MSSQL::DatabaseMethods
|
17
20
|
|
@@ -20,7 +23,7 @@ module Sequel
|
|
20
23
|
# Get the last inserted id using SCOPE_IDENTITY().
|
21
24
|
def last_insert_id(conn, opts=OPTS)
|
22
25
|
statement(conn) do |stmt|
|
23
|
-
sql = opts[:prepared] ?
|
26
|
+
sql = opts[:prepared] ? 'SELECT @@IDENTITY' : 'SELECT SCOPE_IDENTITY()'
|
24
27
|
rs = log_connection_yield(sql, conn){stmt.executeQuery(sql)}
|
25
28
|
rs.next
|
26
29
|
rs.getLong(1)
|
@@ -29,7 +32,7 @@ module Sequel
|
|
29
32
|
|
30
33
|
# Primary key indexes appear to start with pk__ on MSSQL
|
31
34
|
def primary_key_index_re
|
32
|
-
|
35
|
+
/\Apk__/i
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -20,6 +20,7 @@ module Sequel
|
|
20
20
|
module DatabaseMethods
|
21
21
|
include Sequel::MySQL::DatabaseMethods
|
22
22
|
LAST_INSERT_ID = 'SELECT LAST_INSERT_ID()'.freeze
|
23
|
+
Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ID)
|
23
24
|
|
24
25
|
private
|
25
26
|
|
@@ -27,7 +28,7 @@ module Sequel
|
|
27
28
|
# of the connection string, since the JDBC does no parsing on the
|
28
29
|
# given connection string by default.
|
29
30
|
def database_name
|
30
|
-
Sequel::Deprecation.deprecate("Database#database_name", "Instead, use .get
|
31
|
+
Sequel::Deprecation.deprecate("Database#database_name", "Instead, use .get(Sequel.function(:DATABASE))")
|
31
32
|
u = URI.parse(uri.sub(/\Ajdbc:/, ''))
|
32
33
|
(m = /\/(.*)/.match(u.path)) && m[1]
|
33
34
|
end
|
@@ -57,7 +58,7 @@ module Sequel
|
|
57
58
|
end
|
58
59
|
else
|
59
60
|
statement(conn) do |st|
|
60
|
-
rs = st.executeQuery(LAST_INSERT_ID)
|
61
|
+
rs = st.executeQuery('SELECT LAST_INSERT_ID()')
|
61
62
|
rs.next
|
62
63
|
rs.getLong(1)
|
63
64
|
end
|
@@ -34,6 +34,7 @@ module Sequel
|
|
34
34
|
# Instance methods for Oracle Database objects accessed via JDBC.
|
35
35
|
module DatabaseMethods
|
36
36
|
PRIMARY_KEY_INDEX_RE = /\Asys_/i.freeze
|
37
|
+
Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
|
37
38
|
|
38
39
|
include Sequel::Oracle::DatabaseMethods
|
39
40
|
include Sequel::JDBC::Transactions
|
@@ -83,7 +84,7 @@ module Sequel
|
|
83
84
|
|
84
85
|
# Primary key indexes appear to start with sys_ on Oracle
|
85
86
|
def primary_key_index_re
|
86
|
-
|
87
|
+
/\Asys_/i
|
87
88
|
end
|
88
89
|
|
89
90
|
def schema_parse_table(*)
|
@@ -119,7 +120,7 @@ module Sequel
|
|
119
120
|
|
120
121
|
NUMERIC_TYPE = Java::JavaSQL::Types::NUMERIC
|
121
122
|
TIMESTAMP_TYPE = Java::JavaSQL::Types::TIMESTAMP
|
122
|
-
TIMESTAMPTZ_TYPES = [Java::oracle.jdbc.OracleTypes::TIMESTAMPTZ, Java::oracle.jdbc.OracleTypes::TIMESTAMPLTZ]
|
123
|
+
TIMESTAMPTZ_TYPES = [Java::oracle.jdbc.OracleTypes::TIMESTAMPTZ, Java::oracle.jdbc.OracleTypes::TIMESTAMPLTZ]#.freeze # SEQUEL5
|
123
124
|
|
124
125
|
def type_convertor(map, meta, type, i)
|
125
126
|
case type
|