sequel 4.45.0 → 4.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +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
|