sequel 4.45.0 → 4.46.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +108 -0
  3. data/doc/release_notes/4.46.0.txt +404 -0
  4. data/doc/security.rdoc +9 -0
  5. data/doc/sql.rdoc +2 -2
  6. data/doc/testing.rdoc +1 -1
  7. data/doc/validations.rdoc +1 -2
  8. data/lib/sequel/adapters/ado.rb +8 -3
  9. data/lib/sequel/adapters/ado/access.rb +8 -4
  10. data/lib/sequel/adapters/ado/mssql.rb +3 -1
  11. data/lib/sequel/adapters/amalgalite.rb +5 -0
  12. data/lib/sequel/adapters/cubrid.rb +16 -7
  13. data/lib/sequel/adapters/do.rb +7 -1
  14. data/lib/sequel/adapters/do/mysql.rb +8 -4
  15. data/lib/sequel/adapters/ibmdb.rb +10 -5
  16. data/lib/sequel/adapters/jdbc.rb +8 -2
  17. data/lib/sequel/adapters/jdbc/as400.rb +10 -3
  18. data/lib/sequel/adapters/jdbc/db2.rb +27 -16
  19. data/lib/sequel/adapters/jdbc/derby.rb +47 -20
  20. data/lib/sequel/adapters/jdbc/h2.rb +13 -7
  21. data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
  22. data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
  23. data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
  24. data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
  25. data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
  26. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
  27. data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
  28. data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
  29. data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
  30. data/lib/sequel/adapters/mock.rb +5 -0
  31. data/lib/sequel/adapters/mysql.rb +8 -1
  32. data/lib/sequel/adapters/mysql2.rb +6 -1
  33. data/lib/sequel/adapters/odbc.rb +20 -8
  34. data/lib/sequel/adapters/odbc/mssql.rb +6 -3
  35. data/lib/sequel/adapters/oracle.rb +12 -6
  36. data/lib/sequel/adapters/postgres.rb +20 -8
  37. data/lib/sequel/adapters/shared/access.rb +76 -47
  38. data/lib/sequel/adapters/shared/cubrid.rb +16 -11
  39. data/lib/sequel/adapters/shared/db2.rb +46 -19
  40. data/lib/sequel/adapters/shared/firebird.rb +20 -8
  41. data/lib/sequel/adapters/shared/informix.rb +6 -3
  42. data/lib/sequel/adapters/shared/mssql.rb +132 -72
  43. data/lib/sequel/adapters/shared/mysql.rb +112 -65
  44. data/lib/sequel/adapters/shared/oracle.rb +36 -21
  45. data/lib/sequel/adapters/shared/postgres.rb +91 -56
  46. data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
  47. data/lib/sequel/adapters/shared/sqlite.rb +67 -32
  48. data/lib/sequel/adapters/sqlanywhere.rb +9 -1
  49. data/lib/sequel/adapters/sqlite.rb +8 -1
  50. data/lib/sequel/adapters/swift.rb +5 -0
  51. data/lib/sequel/adapters/swift/mysql.rb +4 -2
  52. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  53. data/lib/sequel/adapters/tinytds.rb +10 -3
  54. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  55. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  56. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
  57. data/lib/sequel/adapters/utils/pg_types.rb +14 -6
  58. data/lib/sequel/adapters/utils/replace.rb +4 -2
  59. data/lib/sequel/connection_pool/single.rb +2 -2
  60. data/lib/sequel/core.rb +24 -11
  61. data/lib/sequel/database/connecting.rb +9 -3
  62. data/lib/sequel/database/dataset_defaults.rb +7 -1
  63. data/lib/sequel/database/logging.rb +1 -0
  64. data/lib/sequel/database/misc.rb +5 -2
  65. data/lib/sequel/database/query.rb +7 -5
  66. data/lib/sequel/database/schema_generator.rb +1 -0
  67. data/lib/sequel/database/schema_methods.rb +50 -27
  68. data/lib/sequel/database/transactions.rb +19 -9
  69. data/lib/sequel/dataset/actions.rb +15 -6
  70. data/lib/sequel/dataset/graph.rb +15 -5
  71. data/lib/sequel/dataset/misc.rb +12 -4
  72. data/lib/sequel/dataset/mutation.rb +17 -8
  73. data/lib/sequel/dataset/prepared_statements.rb +3 -2
  74. data/lib/sequel/dataset/query.rb +84 -38
  75. data/lib/sequel/dataset/sql.rb +302 -191
  76. data/lib/sequel/deprecated.rb +26 -17
  77. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
  78. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  79. data/lib/sequel/extensions/from_block.rb +1 -0
  80. data/lib/sequel/extensions/graph_each.rb +1 -1
  81. data/lib/sequel/extensions/identifier_mangling.rb +2 -2
  82. data/lib/sequel/extensions/migration.rb +28 -4
  83. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
  84. data/lib/sequel/extensions/schema_dumper.rb +4 -4
  85. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
  86. data/lib/sequel/extensions/set_overrides.rb +2 -0
  87. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  88. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  89. data/lib/sequel/model.rb +11 -7
  90. data/lib/sequel/model/associations.rb +5 -7
  91. data/lib/sequel/model/base.rb +47 -45
  92. data/lib/sequel/model/dataset_module.rb +9 -14
  93. data/lib/sequel/model/plugins.rb +3 -0
  94. data/lib/sequel/no_core_ext.rb +1 -0
  95. data/lib/sequel/plugins/blacklist_security.rb +1 -1
  96. data/lib/sequel/plugins/boolean_subsets.rb +7 -5
  97. data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
  98. data/lib/sequel/plugins/dataset_associations.rb +1 -1
  99. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  100. data/lib/sequel/plugins/finder.rb +240 -0
  101. data/lib/sequel/plugins/inverted_subsets.rb +19 -12
  102. data/lib/sequel/plugins/many_through_many.rb +1 -1
  103. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  104. data/lib/sequel/plugins/schema.rb +1 -1
  105. data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
  106. data/lib/sequel/plugins/subset_conditions.rb +11 -3
  107. data/lib/sequel/plugins/whitelist_security.rb +118 -0
  108. data/lib/sequel/sql.rb +80 -36
  109. data/lib/sequel/timezones.rb +2 -0
  110. data/lib/sequel/version.rb +1 -1
  111. data/spec/adapters/mssql_spec.rb +20 -0
  112. data/spec/adapters/mysql_spec.rb +1 -1
  113. data/spec/adapters/oracle_spec.rb +12 -8
  114. data/spec/adapters/postgres_spec.rb +1 -1
  115. data/spec/adapters/spec_helper.rb +1 -1
  116. data/spec/adapters/sqlite_spec.rb +36 -34
  117. data/spec/core/connection_pool_spec.rb +2 -1
  118. data/spec/core/database_spec.rb +87 -9
  119. data/spec/core/dataset_spec.rb +501 -129
  120. data/spec/core/deprecated_spec.rb +1 -1
  121. data/spec/core/expression_filters_spec.rb +146 -60
  122. data/spec/core/mock_adapter_spec.rb +1 -1
  123. data/spec/core/object_graph_spec.rb +61 -9
  124. data/spec/core/placeholder_literalizer_spec.rb +20 -2
  125. data/spec/core/schema_generator_spec.rb +6 -6
  126. data/spec/core/schema_spec.rb +54 -5
  127. data/spec/core_extensions_spec.rb +122 -18
  128. data/spec/deprecation_helper.rb +27 -2
  129. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
  130. data/spec/extensions/association_proxies_spec.rb +2 -2
  131. data/spec/extensions/auto_literal_strings_spec.rb +212 -0
  132. data/spec/extensions/blacklist_security_spec.rb +1 -0
  133. data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
  134. data/spec/extensions/column_select_spec.rb +20 -8
  135. data/spec/extensions/columns_introspection_spec.rb +3 -3
  136. data/spec/extensions/core_refinements_spec.rb +29 -12
  137. data/spec/extensions/dataset_associations_spec.rb +12 -12
  138. data/spec/extensions/def_dataset_method_spec.rb +100 -0
  139. data/spec/extensions/error_sql_spec.rb +1 -1
  140. data/spec/extensions/finder_spec.rb +260 -0
  141. data/spec/extensions/graph_each_spec.rb +2 -2
  142. data/spec/extensions/identifier_mangling_spec.rb +14 -8
  143. data/spec/extensions/inverted_subsets_spec.rb +4 -4
  144. data/spec/extensions/lazy_attributes_spec.rb +7 -0
  145. data/spec/extensions/many_through_many_spec.rb +38 -14
  146. data/spec/extensions/nested_attributes_spec.rb +18 -6
  147. data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
  148. data/spec/extensions/pg_enum_spec.rb +16 -1
  149. data/spec/extensions/pg_interval_spec.rb +11 -2
  150. data/spec/extensions/pg_loose_count_spec.rb +5 -0
  151. data/spec/extensions/pg_row_spec.rb +25 -0
  152. data/spec/extensions/prepared_statements_spec.rb +10 -1
  153. data/spec/extensions/query_spec.rb +2 -2
  154. data/spec/extensions/schema_dumper_spec.rb +2 -2
  155. data/spec/extensions/schema_spec.rb +2 -2
  156. data/spec/extensions/set_overrides_spec.rb +7 -3
  157. data/spec/extensions/sql_expr_spec.rb +0 -1
  158. data/spec/extensions/subset_conditions_spec.rb +6 -6
  159. data/spec/extensions/table_select_spec.rb +24 -12
  160. data/spec/extensions/to_dot_spec.rb +4 -4
  161. data/spec/extensions/whitelist_security_spec.rb +131 -0
  162. data/spec/integration/dataset_test.rb +9 -5
  163. data/spec/integration/model_test.rb +2 -0
  164. data/spec/integration/plugin_test.rb +2 -2
  165. data/spec/integration/spec_helper.rb +1 -1
  166. data/spec/model/associations_spec.rb +39 -11
  167. data/spec/model/base_spec.rb +44 -24
  168. data/spec/model/class_dataset_methods_spec.rb +18 -16
  169. data/spec/model/dataset_methods_spec.rb +4 -4
  170. data/spec/model/eager_loading_spec.rb +84 -24
  171. data/spec/model/model_spec.rb +97 -63
  172. data/spec/model/record_spec.rb +21 -13
  173. 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
- PRIMARY_KEY_INDEX_RE
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
- PRIMARY_KEY_INDEX_RE
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 = Dataset::PAREN_CLOSE
194
- PAREN_OPEN = Dataset::PAREN_OPEN
195
- OFFSET = Dataset::OFFSET
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 << CAST_STRING_OPEN
241
+ sql << "RTRIM("
224
242
  super
225
- sql << PAREN_CLOSE
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.at(0).to_s << PAREN_OPEN
245
- literal_append(sql, args.at(1))
246
- sql << PAREN_CLOSE
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
- DEFAULT_FROM
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 << BLOB_OPEN << v.unpack(HSTAR).first << BLOB_CLOSE
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
- BOOL_FALSE
306
+ 'FALSE'
289
307
  else
290
- BOOL_FALSE_OLD
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(TIME_FORMAT)
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
- BOOL_TRUE
321
+ 'TRUE'
304
322
  else
305
- BOOL_TRUE_OLD
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 << FETCH_FIRST
349
+ sql << " FETCH FIRST "
323
350
  literal_append(sql, l)
324
- sql << ROWS_ONLY
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
- PRIMARY_KEY_INDEX_RE
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.at(0)]), args.at(1)])
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 << APOS << v.unpack(HSTAR).first << APOS
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(TIME_FORMAT)
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 << ONLY_OFFSET
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{DATABASE_VERSION(){}}
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
- PRIMARY_KEY_INDEX_RE
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
- APOS = Dataset::APOS
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
- DEFAULT_FROM
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 << BLOB_OPEN << v.unpack(HSTAR).first << APOS
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
- BOOL_FALSE
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(TIME_FORMAT)
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
- BOOL_TRUE
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]} ? SQL_WITH_RECURSIVE : super
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] ? ATAT_IDENTITY : SCOPE_IDENTITY
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
- PRIMARY_KEY_INDEX_RE
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{DATABASE{}}")
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
- PRIMARY_KEY_INDEX_RE
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