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.
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
@@ -30,7 +30,7 @@ module Sequel
30
30
  when 0
31
31
  return insert_sql({})
32
32
  when 1
33
- case vals = values.at(0)
33
+ case vals = values[0]
34
34
  when Hash
35
35
  values = []
36
36
  vals.each do |k,v|
@@ -41,7 +41,7 @@ module Sequel
41
41
  values = vals
42
42
  end
43
43
  when 2
44
- if (v0 = values.at(0)).is_a?(Array) && ((v1 = values.at(1)).is_a?(Array) || v1.is_a?(Dataset) || v1.is_a?(LiteralString))
44
+ if (v0 = values[0]).is_a?(Array) && ((v1 = values[1]).is_a?(Array) || v1.is_a?(Dataset) || v1.is_a?(LiteralString))
45
45
  columns, values = v0, v1
46
46
  raise(Error, "Different number of values and columns given to insert_sql") if values.is_a?(Array) and columns.length != values.length
47
47
  end
@@ -124,13 +124,13 @@ module Sequel
124
124
  when :union
125
125
  c = false
126
126
  sql = LiteralString.new
127
- u = UNION_ALL_SELECT
127
+ u = ' UNION ALL SELECT '
128
128
  f = empty_from_sql
129
129
  values.each do |v|
130
130
  if c
131
131
  sql << u
132
132
  else
133
- sql << SELECT << SPACE
133
+ sql << 'SELECT '
134
134
  c = true
135
135
  end
136
136
  expression_list_append(sql, v)
@@ -174,6 +174,15 @@ module Sequel
174
174
  return static_sql(opts[:sql]) if opts[:sql]
175
175
  check_modification_allowed!
176
176
  check_not_limited!(:update)
177
+
178
+ case values
179
+ when LiteralString
180
+ # nothing
181
+ when String
182
+ Sequel::Deprecation.deprecate("Calling Sequel::Dataset#update/update_sql with a plain string", "Use Sequel.lit(#{values.inspect}) to create a literal string and pass that to update/update_sql, or use the auto_literal_strings extension")
183
+ # raise Error, "plain string passed to Dataset#update" # SEQUEL5
184
+ end
185
+
177
186
  clone(:values=>values).send(:_update_sql)
178
187
  end
179
188
 
@@ -232,116 +241,211 @@ module Sequel
232
241
  def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order limit lock')
233
242
  def_sql_method(self, :update, %w'update table set where')
234
243
 
235
- # Map of emulated function names to native function names.
244
+ WILDCARD = LiteralString.new('*').freeze
245
+ COUNT_OF_ALL_AS_COUNT = SQL::Function.new(:count, WILDCARD).as(:count)
246
+ DEFAULT = LiteralString.new('DEFAULT').freeze
247
+
248
+ EXISTS = ['EXISTS '.freeze].freeze
249
+ BITWISE_METHOD_MAP = {:& =>:BITAND, :| => :BITOR, :^ => :BITXOR}#.freeze # SEQUEL5
250
+ COUNT_FROM_SELF_OPTS = [:distinct, :group, :sql, :limit, :offset, :compounds]#.freeze # SEQUEL5
251
+ IS_LITERALS = {nil=>'NULL'.freeze, true=>'TRUE'.freeze, false=>'FALSE'.freeze}.freeze
252
+ QUALIFY_KEYS = [:select, :where, :having, :order, :group]#.freeze # SEQUEL5
253
+
254
+ IS_OPERATORS = ::Sequel::SQL::ComplexExpression::IS_OPERATORS
255
+ LIKE_OPERATORS = ::Sequel::SQL::ComplexExpression::LIKE_OPERATORS
256
+ N_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::N_ARITY_OPERATORS
257
+ TWO_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::TWO_ARITY_OPERATORS
258
+ REGEXP_OPERATORS = ::Sequel::SQL::ComplexExpression::REGEXP_OPERATORS
259
+
236
260
  EMULATED_FUNCTION_MAP = {}
261
+ Sequel::Deprecation.deprecate_constant(self, :EMULATED_FUNCTION_MAP)
237
262
 
238
- WILDCARD = LiteralString.new('*').freeze
239
263
  ALL = ' ALL'.freeze
264
+ Sequel::Deprecation.deprecate_constant(self, :ALL)
240
265
  AND_SEPARATOR = " AND ".freeze
266
+ Sequel::Deprecation.deprecate_constant(self, :AND_SEPARATOR)
241
267
  APOS = "'".freeze
268
+ Sequel::Deprecation.deprecate_constant(self, :APOS)
242
269
  APOS_RE = /'/.freeze
270
+ Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
243
271
  ARRAY_EMPTY = '(NULL)'.freeze
272
+ Sequel::Deprecation.deprecate_constant(self, :ARRAY_EMPTY)
244
273
  AS = ' AS '.freeze
274
+ Sequel::Deprecation.deprecate_constant(self, :AS)
245
275
  ASC = ' ASC'.freeze
276
+ Sequel::Deprecation.deprecate_constant(self, :ASC)
246
277
  BACKSLASH = "\\".freeze
278
+ Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
247
279
  BITCOMP_CLOSE = ") - 1)".freeze
280
+ Sequel::Deprecation.deprecate_constant(self, :BITCOMP_CLOSE)
248
281
  BITCOMP_OPEN = "((0 - ".freeze
249
- BITWISE_METHOD_MAP = {:& =>:BITAND, :| => :BITOR, :^ => :BITXOR}
282
+ Sequel::Deprecation.deprecate_constant(self, :BITCOMP_OPEN)
250
283
  BOOL_FALSE = "'f'".freeze
284
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
251
285
  BOOL_TRUE = "'t'".freeze
286
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
252
287
  BRACKET_CLOSE = ']'.freeze
288
+ Sequel::Deprecation.deprecate_constant(self, :BRACKET_CLOSE)
253
289
  BRACKET_OPEN = '['.freeze
290
+ Sequel::Deprecation.deprecate_constant(self, :BRACKET_OPEN)
254
291
  CASE_ELSE = " ELSE ".freeze
292
+ Sequel::Deprecation.deprecate_constant(self, :CASE_ELSE)
255
293
  CASE_END = " END)".freeze
294
+ Sequel::Deprecation.deprecate_constant(self, :CASE_END)
256
295
  CASE_OPEN = '(CASE'.freeze
296
+ Sequel::Deprecation.deprecate_constant(self, :CASE_OPEN)
257
297
  CASE_THEN = " THEN ".freeze
298
+ Sequel::Deprecation.deprecate_constant(self, :CASE_THEN)
258
299
  CASE_WHEN = " WHEN ".freeze
300
+ Sequel::Deprecation.deprecate_constant(self, :CASE_WHEN)
259
301
  CAST_OPEN = 'CAST('.freeze
302
+ Sequel::Deprecation.deprecate_constant(self, :CAST_OPEN)
260
303
  COLON = ':'.freeze
261
- COLUMN_REF_RE1 = Sequel::COLUMN_REF_RE1
262
- COLUMN_REF_RE2 = Sequel::COLUMN_REF_RE2
263
- COLUMN_REF_RE3 = Sequel::COLUMN_REF_RE3
304
+ Sequel::Deprecation.deprecate_constant(self, :COLON)
305
+ COLUMN_REF_RE1 = /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/.freeze
306
+ Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE1)
307
+ COLUMN_REF_RE2 = /\A((?:(?!___).)+)___(.+)\z/.freeze
308
+ Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE2)
309
+ COLUMN_REF_RE3 = /\A((?:(?!__).)+)__(.+)\z/.freeze
310
+ Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE3)
264
311
  COMMA = ', '.freeze
265
- COMMA_SEPARATOR = COMMA
312
+ Sequel::Deprecation.deprecate_constant(self, :COMMA)
313
+ COMMA_SEPARATOR = ', '.freeze
314
+ Sequel::Deprecation.deprecate_constant(self, :COMMA_SEPARATOR)
266
315
  CONDITION_FALSE = '(1 = 0)'.freeze
316
+ Sequel::Deprecation.deprecate_constant(self, :CONDITION_FALSE)
267
317
  CONDITION_TRUE = '(1 = 1)'.freeze
268
- COUNT_FROM_SELF_OPTS = [:distinct, :group, :sql, :limit, :offset, :compounds]
269
- COUNT_OF_ALL_AS_COUNT = SQL::Function.new(:count, WILDCARD).as(:count)
318
+ Sequel::Deprecation.deprecate_constant(self, :CONDITION_TRUE)
270
319
  DATASET_ALIAS_BASE_NAME = 't'.freeze
271
- DEFAULT = LiteralString.new('DEFAULT').freeze
320
+ Sequel::Deprecation.deprecate_constant(self, :DATASET_ALIAS_BASE_NAME)
321
+ DATETIME_SECFRACTION_ARG = RUBY_VERSION >= '1.9.0' ? 1000000 : 86400000000
322
+ Sequel::Deprecation.deprecate_constant(self, :DATETIME_SECFRACTION_ARG)
272
323
  DEFAULT_VALUES = " DEFAULT VALUES".freeze
324
+ Sequel::Deprecation.deprecate_constant(self, :DEFAULT_VALUES)
273
325
  DELETE = 'DELETE'.freeze
326
+ Sequel::Deprecation.deprecate_constant(self, :DELETE)
274
327
  DESC = ' DESC'.freeze
328
+ Sequel::Deprecation.deprecate_constant(self, :DESC)
275
329
  DISTINCT = " DISTINCT".freeze
330
+ Sequel::Deprecation.deprecate_constant(self, :DISTINCT)
276
331
  DOT = '.'.freeze
332
+ Sequel::Deprecation.deprecate_constant(self, :DOT)
277
333
  DOUBLE_APOS = "''".freeze
334
+ Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
278
335
  DOUBLE_QUOTE = '""'.freeze
336
+ Sequel::Deprecation.deprecate_constant(self, :DOUBLE_QUOTE)
279
337
  EQUAL = ' = '.freeze
338
+ Sequel::Deprecation.deprecate_constant(self, :EQUAL)
280
339
  EMPTY_PARENS = '()'.freeze
340
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_PARENS)
281
341
  ESCAPE = " ESCAPE ".freeze
342
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE)
282
343
  EXTRACT = 'extract('.freeze
283
- EXISTS = ['EXISTS '.freeze].freeze
344
+ Sequel::Deprecation.deprecate_constant(self, :EXTRACT)
284
345
  FILTER = " FILTER (WHERE ".freeze
346
+ Sequel::Deprecation.deprecate_constant(self, :FILTER)
285
347
  FOR_UPDATE = ' FOR UPDATE'.freeze
348
+ Sequel::Deprecation.deprecate_constant(self, :FOR_UPDATE)
286
349
  FORMAT_DATE = "'%Y-%m-%d'".freeze
350
+ Sequel::Deprecation.deprecate_constant(self, :FORMAT_DATE)
287
351
  FORMAT_DATE_STANDARD = "DATE '%Y-%m-%d'".freeze
352
+ Sequel::Deprecation.deprecate_constant(self, :FORMAT_DATE_STANDARD)
288
353
  FORMAT_OFFSET = "%+03i%02i".freeze
354
+ Sequel::Deprecation.deprecate_constant(self, :FORMAT_OFFSET)
289
355
  FORMAT_TIMESTAMP_RE = /%[Nz]/.freeze
356
+ Sequel::Deprecation.deprecate_constant(self, :FORMAT_TIMESTAMP_RE)
290
357
  FORMAT_USEC = '%N'.freeze
358
+ Sequel::Deprecation.deprecate_constant(self, :FORMAT_USEC)
291
359
  FRAME_ALL = "ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING".freeze
360
+ Sequel::Deprecation.deprecate_constant(self, :FRAME_ALL)
292
361
  FRAME_ROWS = "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW".freeze
362
+ Sequel::Deprecation.deprecate_constant(self, :FRAME_ROWS)
293
363
  FROM = ' FROM '.freeze
364
+ Sequel::Deprecation.deprecate_constant(self, :FROM)
294
365
  FUNCTION_DISTINCT = "DISTINCT ".freeze
366
+ Sequel::Deprecation.deprecate_constant(self, :FUNCTION_DISTINCT)
295
367
  GROUP_BY = " GROUP BY ".freeze
368
+ Sequel::Deprecation.deprecate_constant(self, :GROUP_BY)
296
369
  HAVING = " HAVING ".freeze
370
+ Sequel::Deprecation.deprecate_constant(self, :HAVING)
297
371
  INSERT = "INSERT".freeze
372
+ Sequel::Deprecation.deprecate_constant(self, :INSERT)
298
373
  INTO = " INTO ".freeze
299
- IS_LITERALS = {nil=>'NULL'.freeze, true=>'TRUE'.freeze, false=>'FALSE'.freeze}.freeze
300
- IS_OPERATORS = ::Sequel::SQL::ComplexExpression::IS_OPERATORS
374
+ Sequel::Deprecation.deprecate_constant(self, :INTO)
301
375
  LATERAL = 'LATERAL '.freeze
302
- LIKE_OPERATORS = ::Sequel::SQL::ComplexExpression::LIKE_OPERATORS
376
+ Sequel::Deprecation.deprecate_constant(self, :LATERAL)
303
377
  LIMIT = " LIMIT ".freeze
304
- N_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::N_ARITY_OPERATORS
378
+ Sequel::Deprecation.deprecate_constant(self, :LIMIT)
305
379
  NOT_SPACE = 'NOT '.freeze
380
+ Sequel::Deprecation.deprecate_constant(self, :NOT_SPACE)
306
381
  NULL = "NULL".freeze
382
+ Sequel::Deprecation.deprecate_constant(self, :NULL)
307
383
  NULLS_FIRST = " NULLS FIRST".freeze
384
+ Sequel::Deprecation.deprecate_constant(self, :NULLS_FIRST)
308
385
  NULLS_LAST = " NULLS LAST".freeze
386
+ Sequel::Deprecation.deprecate_constant(self, :NULLS_LAST)
309
387
  OFFSET = " OFFSET ".freeze
388
+ Sequel::Deprecation.deprecate_constant(self, :OFFSET)
310
389
  ON = ' ON '.freeze
390
+ Sequel::Deprecation.deprecate_constant(self, :ON)
311
391
  ON_PAREN = " ON (".freeze
392
+ Sequel::Deprecation.deprecate_constant(self, :ON_PAREN)
312
393
  ORDER_BY = " ORDER BY ".freeze
394
+ Sequel::Deprecation.deprecate_constant(self, :ORDER_BY)
313
395
  ORDER_BY_NS = "ORDER BY ".freeze
396
+ Sequel::Deprecation.deprecate_constant(self, :ORDER_BY_NS)
314
397
  OVER = ' OVER '.freeze
398
+ Sequel::Deprecation.deprecate_constant(self, :OVER)
315
399
  PAREN_CLOSE = ')'.freeze
400
+ Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
316
401
  PAREN_OPEN = '('.freeze
402
+ Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
317
403
  PAREN_SPACE_OPEN = ' ('.freeze
404
+ Sequel::Deprecation.deprecate_constant(self, :PAREN_SPACE_OPEN)
318
405
  PARTITION_BY = "PARTITION BY ".freeze
319
- QUALIFY_KEYS = [:select, :where, :having, :order, :group]
406
+ Sequel::Deprecation.deprecate_constant(self, :PARTITION_BY)
320
407
  QUESTION_MARK = '?'.freeze
408
+ Sequel::Deprecation.deprecate_constant(self, :QUESTION_MARK)
321
409
  QUESTION_MARK_RE = /\?/.freeze
410
+ Sequel::Deprecation.deprecate_constant(self, :QUESTION_MARK_RE)
322
411
  QUOTE = '"'.freeze
412
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE)
323
413
  QUOTE_RE = /"/.freeze
414
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
324
415
  RETURNING = " RETURNING ".freeze
416
+ Sequel::Deprecation.deprecate_constant(self, :RETURNING)
325
417
  SELECT = 'SELECT'.freeze
418
+ Sequel::Deprecation.deprecate_constant(self, :SELECT)
326
419
  SET = ' SET '.freeze
420
+ Sequel::Deprecation.deprecate_constant(self, :SET)
327
421
  SPACE = ' '.freeze
422
+ Sequel::Deprecation.deprecate_constant(self, :SPACE)
328
423
  SQL_WITH = "WITH ".freeze
424
+ Sequel::Deprecation.deprecate_constant(self, :SQL_WITH)
329
425
  SPACE_WITH = " WITH ".freeze
426
+ Sequel::Deprecation.deprecate_constant(self, :SPACE_WITH)
330
427
  TILDE = '~'.freeze
428
+ Sequel::Deprecation.deprecate_constant(self, :TILDE)
331
429
  TIMESTAMP_FORMAT = "'%Y-%m-%d %H:%M:%S%N%z'".freeze
332
- STANDARD_TIMESTAMP_FORMAT = "TIMESTAMP #{TIMESTAMP_FORMAT}".freeze
333
- TWO_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::TWO_ARITY_OPERATORS
334
- REGEXP_OPERATORS = ::Sequel::SQL::ComplexExpression::REGEXP_OPERATORS
430
+ Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
431
+ STANDARD_TIMESTAMP_FORMAT = "TIMESTAMP '%Y-%m-%d %H:%M:%S%N%z'".freeze
432
+ Sequel::Deprecation.deprecate_constant(self, :STANDARD_TIMESTAMP_FORMAT)
335
433
  UNDERSCORE = '_'.freeze
434
+ Sequel::Deprecation.deprecate_constant(self, :UNDERSCORE)
336
435
  UPDATE = 'UPDATE'.freeze
436
+ Sequel::Deprecation.deprecate_constant(self, :UPDATE)
337
437
  USING = ' USING ('.freeze
438
+ Sequel::Deprecation.deprecate_constant(self, :USING)
338
439
  UNION_ALL_SELECT = ' UNION ALL SELECT '.freeze
440
+ Sequel::Deprecation.deprecate_constant(self, :UNION_ALL_SELECT)
339
441
  VALUES = " VALUES ".freeze
442
+ Sequel::Deprecation.deprecate_constant(self, :VALUES)
340
443
  WHERE = " WHERE ".freeze
444
+ Sequel::Deprecation.deprecate_constant(self, :WHERE)
341
445
  WITH_ORDINALITY = " WITH ORDINALITY".freeze
446
+ Sequel::Deprecation.deprecate_constant(self, :WITH_ORDINALITY)
342
447
  WITHIN_GROUP = " WITHIN GROUP (ORDER BY ".freeze
343
-
344
- DATETIME_SECFRACTION_ARG = RUBY_VERSION >= '1.9.0' ? 1000000 : 86400000000
448
+ Sequel::Deprecation.deprecate_constant(self, :WITHIN_GROUP)
345
449
 
346
450
  [:literal, :quote_identifier, :quote_schema_table].each do |meth|
347
451
  class_eval(<<-END, __FILE__, __LINE__ + 1)
@@ -362,18 +466,18 @@ module Sequel
362
466
  # Append literalization of array to SQL string.
363
467
  def array_sql_append(sql, a)
364
468
  if a.empty?
365
- sql << ARRAY_EMPTY
469
+ sql << '(NULL)'
366
470
  else
367
- sql << PAREN_OPEN
471
+ sql << '('
368
472
  expression_list_append(sql, a)
369
- sql << PAREN_CLOSE
473
+ sql << ')'
370
474
  end
371
475
  end
372
476
 
373
477
  # Append literalization of boolean constant to SQL string.
374
478
  def boolean_constant_sql_append(sql, constant)
375
479
  if (constant == true || constant == false) && !supports_where_true?
376
- sql << (constant == true ? CONDITION_TRUE : CONDITION_FALSE)
480
+ sql << (constant == true ? '(1 = 1)' : '(1 = 0)')
377
481
  else
378
482
  literal_append(sql, constant)
379
483
  end
@@ -381,30 +485,30 @@ module Sequel
381
485
 
382
486
  # Append literalization of case expression to SQL string.
383
487
  def case_expression_sql_append(sql, ce)
384
- sql << CASE_OPEN
488
+ sql << '(CASE'
385
489
  if ce.expression?
386
- sql << SPACE
490
+ sql << ' '
387
491
  literal_append(sql, ce.expression)
388
492
  end
389
- w = CASE_WHEN
390
- t = CASE_THEN
493
+ w = " WHEN "
494
+ t = " THEN "
391
495
  ce.conditions.each do |c,r|
392
496
  sql << w
393
497
  literal_append(sql, c)
394
498
  sql << t
395
499
  literal_append(sql, r)
396
500
  end
397
- sql << CASE_ELSE
501
+ sql << " ELSE "
398
502
  literal_append(sql, ce.default)
399
- sql << CASE_END
503
+ sql << " END)"
400
504
  end
401
505
 
402
506
  # Append literalization of cast expression to SQL string.
403
507
  def cast_sql_append(sql, expr, type)
404
- sql << CAST_OPEN
508
+ sql << 'CAST('
405
509
  literal_append(sql, expr)
406
- sql << AS << db.cast_type_literal(type).to_s
407
- sql << PAREN_CLOSE
510
+ sql << ' AS ' << db.cast_type_literal(type).to_s
511
+ sql << ')'
408
512
  end
409
513
 
410
514
  # Append literalization of column all selection to SQL string.
@@ -416,21 +520,21 @@ module Sequel
416
520
  def complex_expression_sql_append(sql, op, args)
417
521
  case op
418
522
  when *IS_OPERATORS
419
- r = args.at(1)
523
+ r = args[1]
420
524
  if r.nil? || supports_is_true?
421
525
  raise(InvalidOperation, 'Invalid argument used for IS operator') unless val = IS_LITERALS[r]
422
- sql << PAREN_OPEN
423
- literal_append(sql, args.at(0))
424
- sql << SPACE << op.to_s << SPACE
425
- sql << val << PAREN_CLOSE
526
+ sql << '('
527
+ literal_append(sql, args[0])
528
+ sql << ' ' << op.to_s << ' '
529
+ sql << val << ')'
426
530
  elsif op == :IS
427
531
  complex_expression_sql_append(sql, :"=", args)
428
532
  else
429
- complex_expression_sql_append(sql, :OR, [SQL::BooleanExpression.new(:"!=", *args), SQL::BooleanExpression.new(:IS, args.at(0), nil)])
533
+ complex_expression_sql_append(sql, :OR, [SQL::BooleanExpression.new(:"!=", *args), SQL::BooleanExpression.new(:IS, args[0], nil)])
430
534
  end
431
535
  when :IN, :"NOT IN"
432
- cols = args.at(0)
433
- vals = args.at(1)
536
+ cols = args[0]
537
+ vals = args[1]
434
538
  col_array = true if cols.is_a?(Array)
435
539
  if vals.is_a?(Array)
436
540
  val_array = true
@@ -454,31 +558,31 @@ module Sequel
454
558
  # If the columns and values are both arrays, use array_sql instead of
455
559
  # literal so that if values is an array of two element arrays, it
456
560
  # will be treated as a value list instead of a condition specifier.
457
- sql << PAREN_OPEN
561
+ sql << '('
458
562
  literal_append(sql, cols)
459
- sql << SPACE << op.to_s << SPACE
563
+ sql << ' ' << op.to_s << ' '
460
564
  if val_array
461
565
  array_sql_append(sql, vals)
462
566
  else
463
567
  literal_append(sql, vals)
464
568
  end
465
- sql << PAREN_CLOSE
569
+ sql << ')'
466
570
  end
467
571
  else
468
- sql << PAREN_OPEN
572
+ sql << '('
469
573
  literal_append(sql, cols)
470
- sql << SPACE << op.to_s << SPACE
574
+ sql << ' ' << op.to_s << ' '
471
575
  literal_append(sql, vals)
472
- sql << PAREN_CLOSE
576
+ sql << ')'
473
577
  end
474
578
  when :LIKE, :'NOT LIKE'
475
- sql << PAREN_OPEN
476
- literal_append(sql, args.at(0))
477
- sql << SPACE << op.to_s << SPACE
478
- literal_append(sql, args.at(1))
479
- sql << ESCAPE
480
- literal_append(sql, BACKSLASH)
481
- sql << PAREN_CLOSE
579
+ sql << '('
580
+ literal_append(sql, args[0])
581
+ sql << ' ' << op.to_s << ' '
582
+ literal_append(sql, args[1])
583
+ sql << " ESCAPE "
584
+ literal_append(sql, "\\")
585
+ sql << ')'
482
586
  when :ILIKE, :'NOT ILIKE'
483
587
  complex_expression_sql_append(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), args.map{|v| Sequel.function(:UPPER, v)})
484
588
  when :**
@@ -487,13 +591,13 @@ module Sequel
487
591
  if REGEXP_OPERATORS.include?(op) && !supports_regexp?
488
592
  raise InvalidOperation, "Pattern matching via regular expressions is not supported on #{db.database_type}"
489
593
  end
490
- sql << PAREN_OPEN
491
- literal_append(sql, args.at(0))
492
- sql << SPACE << op.to_s << SPACE
493
- literal_append(sql, args.at(1))
494
- sql << PAREN_CLOSE
594
+ sql << '('
595
+ literal_append(sql, args[0])
596
+ sql << ' ' << op.to_s << ' '
597
+ literal_append(sql, args[1])
598
+ sql << ')'
495
599
  when *N_ARITY_OPERATORS
496
- sql << PAREN_OPEN
600
+ sql << '('
497
601
  c = false
498
602
  op_str = " #{op} "
499
603
  args.each do |a|
@@ -501,19 +605,19 @@ module Sequel
501
605
  literal_append(sql, a)
502
606
  c ||= true
503
607
  end
504
- sql << PAREN_CLOSE
608
+ sql << ')'
505
609
  when :NOT
506
- sql << NOT_SPACE
507
- literal_append(sql, args.at(0))
610
+ sql << 'NOT '
611
+ literal_append(sql, args[0])
508
612
  when :NOOP
509
- literal_append(sql, args.at(0))
613
+ literal_append(sql, args[0])
510
614
  when :'B~'
511
- sql << TILDE
512
- literal_append(sql, args.at(0))
615
+ sql << '~'
616
+ literal_append(sql, args[0])
513
617
  when :extract
514
- sql << EXTRACT << args.at(0).to_s << FROM
515
- literal_append(sql, args.at(1))
516
- sql << PAREN_CLOSE
618
+ sql << 'extract(' << args[0].to_s << ' FROM '
619
+ literal_append(sql, args[1])
620
+ sql << ')'
517
621
  else
518
622
  raise(InvalidOperation, "invalid operator #{op}")
519
623
  end
@@ -553,11 +657,11 @@ module Sequel
553
657
  name = native_function_name(name)
554
658
  end
555
659
 
556
- sql << LATERAL if opts[:lateral]
660
+ sql << 'LATERAL ' if opts[:lateral]
557
661
 
558
662
  case name
559
663
  when SQL::Identifier
560
- if supports_quoted_function_names? && opts[:quoted] != false
664
+ if supports_quoted_function_names? && opts[:quoted]
561
665
  literal_append(sql, name)
562
666
  else
563
667
  sql << name.value.to_s
@@ -566,7 +670,7 @@ module Sequel
566
670
  if supports_quoted_function_names? && opts[:quoted] != false
567
671
  literal_append(sql, name)
568
672
  else
569
- sql << split_qualifiers(name).join(DOT)
673
+ sql << split_qualifiers(name).join('.')
570
674
  end
571
675
  else
572
676
  if supports_quoted_function_names? && opts[:quoted]
@@ -576,38 +680,38 @@ module Sequel
576
680
  end
577
681
  end
578
682
 
579
- sql << PAREN_OPEN
683
+ sql << '('
580
684
  if opts[:*]
581
- sql << WILDCARD
685
+ sql << '*'
582
686
  else
583
- sql << FUNCTION_DISTINCT if opts[:distinct]
687
+ sql << "DISTINCT " if opts[:distinct]
584
688
  expression_list_append(sql, f.args)
585
689
  if order = opts[:order]
586
- sql << ORDER_BY
690
+ sql << " ORDER BY "
587
691
  expression_list_append(sql, order)
588
692
  end
589
693
  end
590
- sql << PAREN_CLOSE
694
+ sql << ')'
591
695
 
592
696
  if group = opts[:within_group]
593
- sql << WITHIN_GROUP
697
+ sql << " WITHIN GROUP (ORDER BY "
594
698
  expression_list_append(sql, group)
595
- sql << PAREN_CLOSE
699
+ sql << ')'
596
700
  end
597
701
 
598
702
  if filter = opts[:filter]
599
- sql << FILTER
703
+ sql << " FILTER (WHERE "
600
704
  literal_append(sql, filter_expr(filter, &opts[:filter_block]))
601
- sql << PAREN_CLOSE
705
+ sql << ')'
602
706
  end
603
707
 
604
708
  if window = opts[:over]
605
- sql << OVER
709
+ sql << ' OVER '
606
710
  window_sql_append(sql, window.opts)
607
711
  end
608
712
 
609
713
  if opts[:with_ordinality]
610
- sql << WITH_ORDINALITY
714
+ sql << " WITH ORDINALITY"
611
715
  end
612
716
  end
613
717
 
@@ -616,7 +720,7 @@ module Sequel
616
720
  table = jc.table
617
721
  table_alias = jc.table_alias
618
722
  table_alias = nil if table == table_alias && !jc.column_aliases
619
- sql << SPACE << join_type_sql(jc.join_type) << SPACE
723
+ sql << ' ' << join_type_sql(jc.join_type) << ' '
620
724
  identifier_append(sql, table)
621
725
  as_sql_append(sql, table_alias, jc.column_aliases) if table_alias
622
726
  end
@@ -624,33 +728,33 @@ module Sequel
624
728
  # Append literalization of JOIN ON clause to SQL string.
625
729
  def join_on_clause_sql_append(sql, jc)
626
730
  join_clause_sql_append(sql, jc)
627
- sql << ON
731
+ sql << ' ON '
628
732
  literal_append(sql, filter_expr(jc.on))
629
733
  end
630
734
 
631
735
  # Append literalization of JOIN USING clause to SQL string.
632
736
  def join_using_clause_sql_append(sql, jc)
633
737
  join_clause_sql_append(sql, jc)
634
- sql << USING
738
+ sql << ' USING ('
635
739
  column_list_append(sql, jc.using)
636
- sql << PAREN_CLOSE
740
+ sql << ')'
637
741
  end
638
742
 
639
743
  # Append literalization of negative boolean constant to SQL string.
640
744
  def negative_boolean_constant_sql_append(sql, constant)
641
- sql << NOT_SPACE
745
+ sql << 'NOT '
642
746
  boolean_constant_sql_append(sql, constant)
643
747
  end
644
748
 
645
749
  # Append literalization of ordered expression to SQL string.
646
750
  def ordered_expression_sql_append(sql, oe)
647
751
  literal_append(sql, oe.expression)
648
- sql << (oe.descending ? DESC : ASC)
752
+ sql << (oe.descending ? ' DESC' : ' ASC')
649
753
  case oe.nulls
650
754
  when :first
651
- sql << NULLS_FIRST
755
+ sql << " NULLS FIRST"
652
756
  when :last
653
- sql << NULLS_LAST
757
+ sql << " NULLS LAST"
654
758
  end
655
759
  end
656
760
 
@@ -658,7 +762,7 @@ module Sequel
658
762
  def placeholder_literal_string_sql_append(sql, pls)
659
763
  args = pls.args
660
764
  str = pls.str
661
- sql << PAREN_OPEN if pls.parens
765
+ sql << '(' if pls.parens
662
766
  if args.is_a?(Hash)
663
767
  if args.empty?
664
768
  sql << str
@@ -684,7 +788,7 @@ module Sequel
684
788
  i = -1
685
789
  match_len = args.length - 1
686
790
  loop do
687
- previous, q, str = str.partition(QUESTION_MARK)
791
+ previous, q, str = str.partition('?')
688
792
  sql << previous
689
793
  literal_append(sql, args.at(i+=1)) unless q.empty?
690
794
  if str.empty?
@@ -695,7 +799,7 @@ module Sequel
695
799
  end
696
800
  end
697
801
  end
698
- sql << PAREN_CLOSE if pls.parens
802
+ sql << ')' if pls.parens
699
803
  end
700
804
 
701
805
  # Append literalization of qualified identifier to SQL string.
@@ -703,7 +807,7 @@ module Sequel
703
807
  # column/qualified. If 2 arguments are given, the 2nd should be an SQL::QualifiedIdentifier.
704
808
  def qualified_identifier_sql_append(sql, table, column=(c = table.column; table = table.table; c))
705
809
  identifier_append(sql, table)
706
- sql << DOT
810
+ sql << '.'
707
811
  identifier_append(sql, column)
708
812
  end
709
813
 
@@ -730,7 +834,7 @@ module Sequel
730
834
  schema, table = schema_and_table(table)
731
835
  if schema
732
836
  quote_identifier_append(sql, schema)
733
- sql << DOT
837
+ sql << '.'
734
838
  end
735
839
  quote_identifier_append(sql, table)
736
840
  end
@@ -740,7 +844,7 @@ module Sequel
740
844
  # should be overridden by subclasses to provide quoting not matching the
741
845
  # SQL standard, such as backtick (used by MySQL and SQLite).
742
846
  def quoted_identifier_append(sql, name)
743
- sql << QUOTE << name.to_s.gsub(QUOTE_RE, DOUBLE_QUOTE) << QUOTE
847
+ sql << '"' << name.to_s.gsub('"', '""') << '"'
744
848
  end
745
849
 
746
850
  # Split the schema information from the table, returning two strings,
@@ -786,39 +890,39 @@ module Sequel
786
890
  # Append literalization of subscripts (SQL array accesses) to SQL string.
787
891
  def subscript_sql_append(sql, s)
788
892
  literal_append(sql, s.f)
789
- sql << BRACKET_OPEN
893
+ sql << '['
790
894
  if s.sub.length == 1 && (range = s.sub.first).is_a?(Range)
791
895
  literal_append(sql, range.begin)
792
- sql << COLON
896
+ sql << ':'
793
897
  e = range.end
794
898
  e -= 1 if range.exclude_end? && e.is_a?(Integer)
795
899
  literal_append(sql, e)
796
900
  else
797
901
  expression_list_append(sql, s.sub)
798
902
  end
799
- sql << BRACKET_CLOSE
903
+ sql << ']'
800
904
  end
801
905
 
802
906
  # Append literalization of windows (for window functions) to SQL string.
803
907
  def window_sql_append(sql, opts)
804
908
  raise(Error, 'This dataset does not support window functions') unless supports_window_functions?
805
- sql << PAREN_OPEN
909
+ sql << '('
806
910
  window, part, order, frame = opts.values_at(:window, :partition, :order, :frame)
807
911
  space = false
808
- space_s = SPACE
912
+ space_s = ' '
809
913
  if window
810
914
  literal_append(sql, window)
811
915
  space = true
812
916
  end
813
917
  if part
814
918
  sql << space_s if space
815
- sql << PARTITION_BY
919
+ sql << "PARTITION BY "
816
920
  expression_list_append(sql, Array(part))
817
921
  space = true
818
922
  end
819
923
  if order
820
924
  sql << space_s if space
821
- sql << ORDER_BY_NS
925
+ sql << "ORDER BY "
822
926
  expression_list_append(sql, Array(order))
823
927
  space = true
824
928
  end
@@ -827,17 +931,17 @@ module Sequel
827
931
  # nothing
828
932
  when :all
829
933
  sql << space_s if space
830
- sql << FRAME_ALL
934
+ sql << "ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
831
935
  when :rows
832
936
  sql << space_s if space
833
- sql << FRAME_ROWS
937
+ sql << "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"
834
938
  when String
835
939
  sql << space_s if space
836
940
  sql << frame
837
941
  else
838
942
  raise Error, "invalid window frame clause, should be :all, :rows, a string, or nil"
839
943
  end
840
- sql << PAREN_CLOSE
944
+ sql << ')'
841
945
  end
842
946
 
843
947
  protected
@@ -901,13 +1005,13 @@ module Sequel
901
1005
 
902
1006
  # Append aliasing expression to SQL string.
903
1007
  def as_sql_append(sql, aliaz, column_aliases=nil)
904
- sql << AS
1008
+ sql << ' AS '
905
1009
  quote_identifier_append(sql, aliaz)
906
1010
  if column_aliases
907
1011
  raise Error, "#{db.database_type} does not support derived column lists" unless supports_derived_column_lists?
908
- sql << PAREN_OPEN
1012
+ sql << '('
909
1013
  identifier_list_append(sql, column_aliases)
910
- sql << PAREN_CLOSE
1014
+ sql << ')'
911
1015
  end
912
1016
  end
913
1017
 
@@ -942,7 +1046,7 @@ module Sequel
942
1046
  # column names. If the array is empty, a wildcard (*) is returned.
943
1047
  def column_list_append(sql, columns)
944
1048
  if (columns.nil? || columns.empty?)
945
- sql << WILDCARD
1049
+ sql << '*'
946
1050
  else
947
1051
  expression_list_append(sql, columns)
948
1052
  end
@@ -955,9 +1059,9 @@ module Sequel
955
1059
  def complex_expression_arg_pairs(args)
956
1060
  case args.length
957
1061
  when 1
958
- args.at(0)
1062
+ args[0]
959
1063
  when 2
960
- yield args.at(0), args.at(1)
1064
+ yield args[0], args[1]
961
1065
  else
962
1066
  args.inject{|m, a| yield(m, a)}
963
1067
  end
@@ -985,9 +1089,9 @@ module Sequel
985
1089
  f = BITWISE_METHOD_MAP[op]
986
1090
  complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(f, a, b)}
987
1091
  when :'B~'
988
- sql << BITCOMP_OPEN
989
- literal_append(sql, args.at(0))
990
- sql << BITCOMP_CLOSE
1092
+ sql << "((0 - "
1093
+ literal_append(sql, args[0])
1094
+ sql << ") - 1)"
991
1095
  end
992
1096
  end
993
1097
 
@@ -998,21 +1102,21 @@ module Sequel
998
1102
 
999
1103
  # The alias to use for datasets, takes a number to make sure the name is unique.
1000
1104
  def dataset_alias(number)
1001
- :"#{DATASET_ALIAS_BASE_NAME}#{number}"
1105
+ :"t#{number}"
1002
1106
  end
1003
1107
 
1004
1108
  # The strftime format to use when literalizing the time.
1005
1109
  def default_timestamp_format
1006
- requires_sql_standard_datetimes? ? STANDARD_TIMESTAMP_FORMAT : TIMESTAMP_FORMAT
1110
+ requires_sql_standard_datetimes? ? "TIMESTAMP '%Y-%m-%d %H:%M:%S%N%z'" : "'%Y-%m-%d %H:%M:%S%N%z'"
1007
1111
  end
1008
1112
 
1009
1113
  def delete_delete_sql(sql)
1010
- sql << DELETE
1114
+ sql << 'DELETE'
1011
1115
  end
1012
1116
 
1013
1117
  def delete_from_sql(sql)
1014
1118
  if f = @opts[:from]
1015
- sql << FROM
1119
+ sql << ' FROM '
1016
1120
  source_list_append(sql, f)
1017
1121
  end
1018
1122
  end
@@ -1037,7 +1141,7 @@ module Sequel
1037
1141
  # Append literalization of array of expressions to SQL string.
1038
1142
  def expression_list_append(sql, columns)
1039
1143
  c = false
1040
- co = COMMA
1144
+ co = ', '
1041
1145
  columns.each do |col|
1042
1146
  sql << co if c
1043
1147
  literal_append(sql, col)
@@ -1048,11 +1152,11 @@ module Sequel
1048
1152
  # Append literalization of array of grouping elements to SQL string.
1049
1153
  def grouping_element_list_append(sql, columns)
1050
1154
  c = false
1051
- co = COMMA
1155
+ co = ', '
1052
1156
  columns.each do |col|
1053
1157
  sql << co if c
1054
1158
  if col.is_a?(Array) && col.empty?
1055
- sql << EMPTY_PARENS
1159
+ sql << '()'
1056
1160
  else
1057
1161
  literal_append(sql, Array(col))
1058
1162
  end
@@ -1071,9 +1175,9 @@ module Sequel
1071
1175
  # of hours and minutes.
1072
1176
  def format_timestamp(v)
1073
1177
  v2 = db.from_application_timestamp(v)
1074
- fmt = default_timestamp_format.gsub(FORMAT_TIMESTAMP_RE) do |m|
1075
- if m == FORMAT_USEC
1076
- format_timestamp_usec(v.is_a?(DateTime) ? v.sec_fraction*(DATETIME_SECFRACTION_ARG) : v.usec) if supports_timestamp_usecs?
1178
+ fmt = default_timestamp_format.gsub(/%[Nz]/) do |m|
1179
+ if m == '%N'
1180
+ format_timestamp_usec(v.is_a?(DateTime) ? v.sec_fraction*(RUBY_VERSION >= '1.9.0' ? 1000000 : 86400000000) : v.usec) if supports_timestamp_usecs?
1077
1181
  else
1078
1182
  if supports_timestamp_timezones?
1079
1183
  # Would like to just use %z format, but it doesn't appear to work on Windows
@@ -1088,13 +1192,13 @@ module Sequel
1088
1192
 
1089
1193
  # Return the SQL timestamp fragment to use for the timezone offset.
1090
1194
  def format_timestamp_offset(hour, minute)
1091
- sprintf(FORMAT_OFFSET, hour, minute)
1195
+ sprintf("%+03i%02i", hour, minute)
1092
1196
  end
1093
1197
 
1094
1198
  # Return the SQL timestamp fragment to use for the fractional time part.
1095
1199
  # Should start with the decimal point. Uses 6 decimal places by default.
1096
- def format_timestamp_usec(usec)
1097
- unless (ts = timestamp_precision) == 6
1200
+ def format_timestamp_usec(usec, ts=timestamp_precision)
1201
+ unless ts == 6
1098
1202
  usec = usec/(10 ** (6 - ts))
1099
1203
  end
1100
1204
  sprintf(".%0#{ts}d", usec)
@@ -1120,7 +1224,7 @@ module Sequel
1120
1224
  # Append literalization of array of identifiers to SQL string.
1121
1225
  def identifier_list_append(sql, args)
1122
1226
  c = false
1123
- comma = COMMA
1227
+ comma = ', '
1124
1228
  args.each do |a|
1125
1229
  sql << comma if c
1126
1230
  identifier_append(sql, a)
@@ -1134,7 +1238,7 @@ module Sequel
1134
1238
  end
1135
1239
 
1136
1240
  def insert_into_sql(sql)
1137
- sql << INTO
1241
+ sql << " INTO "
1138
1242
  if (f = @opts[:from]) && f.length == 1
1139
1243
  identifier_append(sql, unaliased_identifier(f.first))
1140
1244
  else
@@ -1145,9 +1249,9 @@ module Sequel
1145
1249
  def insert_columns_sql(sql)
1146
1250
  columns = opts[:columns]
1147
1251
  if columns && !columns.empty?
1148
- sql << PAREN_SPACE_OPEN
1252
+ sql << ' ('
1149
1253
  identifier_list_append(sql, columns)
1150
- sql << PAREN_CLOSE
1254
+ sql << ')'
1151
1255
  end
1152
1256
  end
1153
1257
 
@@ -1158,23 +1262,23 @@ module Sequel
1158
1262
  end
1159
1263
 
1160
1264
  def insert_insert_sql(sql)
1161
- sql << INSERT
1265
+ sql << "INSERT"
1162
1266
  end
1163
1267
 
1164
1268
  def insert_values_sql(sql)
1165
1269
  case values = opts[:values]
1166
1270
  when Array
1167
1271
  if values.empty?
1168
- sql << DEFAULT_VALUES
1272
+ sql << " DEFAULT VALUES"
1169
1273
  else
1170
- sql << VALUES
1274
+ sql << " VALUES "
1171
1275
  literal_append(sql, values)
1172
1276
  end
1173
1277
  when Dataset
1174
- sql << SPACE
1278
+ sql << ' '
1175
1279
  subselect_sql_append(sql, values)
1176
1280
  when LiteralString
1177
- sql << SPACE << values
1281
+ sql << ' ' << values
1178
1282
  else
1179
1283
  raise Error, "Unsupported INSERT values type, should be an Array or Dataset: #{values.inspect}"
1180
1284
  end
@@ -1182,7 +1286,7 @@ module Sequel
1182
1286
 
1183
1287
  def insert_returning_sql(sql)
1184
1288
  if opts.has_key?(:returning)
1185
- sql << RETURNING
1289
+ sql << " RETURNING "
1186
1290
  column_list_append(sql, Array(opts[:returning]))
1187
1291
  end
1188
1292
  end
@@ -1192,7 +1296,7 @@ module Sequel
1192
1296
  # SQL fragment specifying a JOIN type, converts underscores to
1193
1297
  # spaces and upcases.
1194
1298
  def join_type_sql(join_type)
1195
- "#{join_type.to_s.gsub(UNDERSCORE, SPACE).upcase} JOIN"
1299
+ "#{join_type.to_s.gsub('_', ' ').upcase} JOIN"
1196
1300
  end
1197
1301
 
1198
1302
  # Append a literalization of the array to SQL string.
@@ -1218,18 +1322,18 @@ module Sequel
1218
1322
 
1219
1323
  # Append literalization of dataset to SQL string. Does a subselect inside parantheses.
1220
1324
  def literal_dataset_append(sql, v)
1221
- sql << LATERAL if v.opts[:lateral]
1222
- sql << PAREN_OPEN
1325
+ sql << 'LATERAL ' if v.opts[:lateral]
1326
+ sql << '('
1223
1327
  subselect_sql_append(sql, v)
1224
- sql << PAREN_CLOSE
1328
+ sql << ')'
1225
1329
  end
1226
1330
 
1227
1331
  # SQL fragment for Date, using the ISO8601 format.
1228
1332
  def literal_date(v)
1229
1333
  if requires_sql_standard_datetimes?
1230
- v.strftime(FORMAT_DATE_STANDARD)
1334
+ v.strftime("DATE '%Y-%m-%d'")
1231
1335
  else
1232
- v.strftime(FORMAT_DATE)
1336
+ v.strftime("'%Y-%m-%d'")
1233
1337
  end
1234
1338
  end
1235
1339
 
@@ -1250,7 +1354,7 @@ module Sequel
1250
1354
 
1251
1355
  # SQL fragment for false
1252
1356
  def literal_false
1253
- BOOL_FALSE
1357
+ "'f'"
1254
1358
  end
1255
1359
 
1256
1360
  # SQL fragment for Float
@@ -1270,7 +1374,7 @@ module Sequel
1270
1374
 
1271
1375
  # SQL fragment for nil
1272
1376
  def literal_nil
1273
- NULL
1377
+ "NULL"
1274
1378
  end
1275
1379
 
1276
1380
  # Append a literalization of the object to the given SQL string.
@@ -1293,7 +1397,7 @@ module Sequel
1293
1397
 
1294
1398
  # SQL fragment for Sequel::SQLTime, containing just the time part
1295
1399
  def literal_sqltime(v)
1296
- v.strftime("'%H:%M:%S#{format_timestamp_usec(v.usec) if supports_timestamp_usecs?}'")
1400
+ v.strftime("'%H:%M:%S#{format_timestamp_usec(v.usec, sqltime_precision) if supports_timestamp_usecs?}'")
1297
1401
  end
1298
1402
 
1299
1403
  # Append literalization of Sequel::SQLTime to SQL string.
@@ -1303,7 +1407,7 @@ module Sequel
1303
1407
 
1304
1408
  # Append literalization of string to SQL string.
1305
1409
  def literal_string_append(sql, v)
1306
- sql << APOS << v.gsub(APOS_RE, DOUBLE_APOS) << APOS
1410
+ sql << "'" << v.gsub(/'/, "''") << "'"
1307
1411
  end
1308
1412
 
1309
1413
  # Append literalization of symbol to SQL string.
@@ -1311,7 +1415,7 @@ module Sequel
1311
1415
  c_table, column, c_alias = split_symbol(v)
1312
1416
  if c_table
1313
1417
  quote_identifier_append(sql, c_table)
1314
- sql << DOT
1418
+ sql << '.'
1315
1419
  end
1316
1420
  quote_identifier_append(sql, column)
1317
1421
  as_sql_append(sql, c_alias) if c_alias
@@ -1329,7 +1433,7 @@ module Sequel
1329
1433
 
1330
1434
  # SQL fragment for true
1331
1435
  def literal_true
1332
- BOOL_TRUE
1436
+ "'t'"
1333
1437
  end
1334
1438
 
1335
1439
  # What strategy to use for import/multi_insert. While SQL-92 defaults
@@ -1340,9 +1444,10 @@ module Sequel
1340
1444
  :separate
1341
1445
  end
1342
1446
 
1447
+
1343
1448
  # Get the native function name given the emulated function name.
1344
1449
  def native_function_name(emulated_function)
1345
- self.class.const_get(:EMULATED_FUNCTION_MAP).fetch(emulated_function, emulated_function)
1450
+ emulated_function
1346
1451
  end
1347
1452
 
1348
1453
  # Returns a qualified column name (including a table name) if the column
@@ -1372,17 +1477,17 @@ module Sequel
1372
1477
  end
1373
1478
 
1374
1479
  def select_columns_sql(sql)
1375
- sql << SPACE
1480
+ sql << ' '
1376
1481
  column_list_append(sql, @opts[:select])
1377
1482
  end
1378
1483
 
1379
1484
  def select_distinct_sql(sql)
1380
1485
  if distinct = @opts[:distinct]
1381
- sql << DISTINCT
1486
+ sql << " DISTINCT"
1382
1487
  unless distinct.empty?
1383
- sql << ON_PAREN
1488
+ sql << " ON ("
1384
1489
  expression_list_append(sql, distinct)
1385
- sql << PAREN_CLOSE
1490
+ sql << ')'
1386
1491
  end
1387
1492
  end
1388
1493
  end
@@ -1393,16 +1498,16 @@ module Sequel
1393
1498
  def select_compounds_sql(sql)
1394
1499
  return unless c = @opts[:compounds]
1395
1500
  c.each do |type, dataset, all|
1396
- sql << SPACE << type.to_s.upcase
1397
- sql << ALL if all
1398
- sql << SPACE
1501
+ sql << ' ' << type.to_s.upcase
1502
+ sql << ' ALL' if all
1503
+ sql << ' '
1399
1504
  compound_dataset_sql_append(sql, dataset)
1400
1505
  end
1401
1506
  end
1402
1507
 
1403
1508
  def select_from_sql(sql)
1404
1509
  if f = @opts[:from]
1405
- sql << FROM
1510
+ sql << ' FROM '
1406
1511
  source_list_append(sql, f)
1407
1512
  elsif f = empty_from_sql
1408
1513
  sql << f
@@ -1411,19 +1516,19 @@ module Sequel
1411
1516
 
1412
1517
  def select_group_sql(sql)
1413
1518
  if group = @opts[:group]
1414
- sql << GROUP_BY
1519
+ sql << " GROUP BY "
1415
1520
  if go = @opts[:group_options]
1416
1521
  if go == :"grouping sets"
1417
- sql << go.to_s.upcase << PAREN_OPEN
1522
+ sql << go.to_s.upcase << '('
1418
1523
  grouping_element_list_append(sql, group)
1419
- sql << PAREN_CLOSE
1524
+ sql << ')'
1420
1525
  elsif uses_with_rollup?
1421
1526
  expression_list_append(sql, group)
1422
- sql << SPACE_WITH << go.to_s.upcase
1527
+ sql << " WITH " << go.to_s.upcase
1423
1528
  else
1424
- sql << go.to_s.upcase << PAREN_OPEN
1529
+ sql << go.to_s.upcase << '('
1425
1530
  expression_list_append(sql, group)
1426
- sql << PAREN_CLOSE
1531
+ sql << ')'
1427
1532
  end
1428
1533
  else
1429
1534
  expression_list_append(sql, group)
@@ -1433,7 +1538,7 @@ module Sequel
1433
1538
 
1434
1539
  def select_having_sql(sql)
1435
1540
  if having = @opts[:having]
1436
- sql << HAVING
1541
+ sql << " HAVING "
1437
1542
  literal_append(sql, having)
1438
1543
  end
1439
1544
  end
@@ -1446,10 +1551,10 @@ module Sequel
1446
1551
 
1447
1552
  def select_limit_sql(sql)
1448
1553
  if l = @opts[:limit]
1449
- sql << LIMIT
1554
+ sql << " LIMIT "
1450
1555
  literal_append(sql, l)
1451
1556
  if o = @opts[:offset]
1452
- sql << OFFSET
1557
+ sql << " OFFSET "
1453
1558
  literal_append(sql, o)
1454
1559
  end
1455
1560
  elsif @opts[:offset]
@@ -1460,9 +1565,9 @@ module Sequel
1460
1565
  def select_lock_sql(sql)
1461
1566
  case l = @opts[:lock]
1462
1567
  when :update
1463
- sql << FOR_UPDATE
1568
+ sql << ' FOR UPDATE'
1464
1569
  when String
1465
- sql << SPACE << l
1570
+ sql << ' ' << l
1466
1571
  end
1467
1572
  end
1468
1573
 
@@ -1470,13 +1575,13 @@ module Sequel
1470
1575
  # in the adapter, as many databases do not support just a plain offset with
1471
1576
  # no limit.
1472
1577
  def select_only_offset_sql(sql)
1473
- sql << OFFSET
1578
+ sql << " OFFSET "
1474
1579
  literal_append(sql, @opts[:offset])
1475
1580
  end
1476
1581
 
1477
1582
  def select_order_sql(sql)
1478
1583
  if o = @opts[:order]
1479
- sql << ORDER_BY
1584
+ sql << " ORDER BY "
1480
1585
  expression_list_append(sql, o)
1481
1586
  end
1482
1587
  end
@@ -1484,12 +1589,12 @@ module Sequel
1484
1589
  alias update_order_sql select_order_sql
1485
1590
 
1486
1591
  def select_select_sql(sql)
1487
- sql << SELECT
1592
+ sql << 'SELECT'
1488
1593
  end
1489
1594
 
1490
1595
  def select_where_sql(sql)
1491
1596
  if w = @opts[:where]
1492
- sql << WHERE
1597
+ sql << " WHERE "
1493
1598
  literal_append(sql, w)
1494
1599
  end
1495
1600
  end
@@ -1502,20 +1607,20 @@ module Sequel
1502
1607
  return if !ws || ws.empty?
1503
1608
  sql << select_with_sql_base
1504
1609
  c = false
1505
- comma = COMMA
1610
+ comma = ', '
1506
1611
  ws.each do |w|
1507
1612
  sql << comma if c
1508
1613
  quote_identifier_append(sql, w[:name])
1509
1614
  if args = w[:args]
1510
- sql << PAREN_OPEN
1615
+ sql << '('
1511
1616
  identifier_list_append(sql, args)
1512
- sql << PAREN_CLOSE
1617
+ sql << ')'
1513
1618
  end
1514
- sql << AS
1619
+ sql << ' AS '
1515
1620
  literal_dataset_append(sql, w[:dataset])
1516
1621
  c ||= true
1517
1622
  end
1518
- sql << SPACE
1623
+ sql << ' '
1519
1624
  end
1520
1625
  alias delete_with_sql select_with_sql
1521
1626
  alias insert_with_sql select_with_sql
@@ -1523,7 +1628,7 @@ module Sequel
1523
1628
 
1524
1629
  # The base keyword to use for the SQL WITH clause
1525
1630
  def select_with_sql_base
1526
- SQL_WITH
1631
+ "WITH "
1527
1632
  end
1528
1633
 
1529
1634
  # Whether the symbol cache should be skipped when literalizing the dataset
@@ -1549,6 +1654,12 @@ module Sequel
1549
1654
  String.new
1550
1655
  end
1551
1656
 
1657
+ # The precision to use for SQLTime instances (time column values without dates).
1658
+ # Defaults to timestamp_precision.
1659
+ def sqltime_precision
1660
+ timestamp_precision
1661
+ end
1662
+
1552
1663
  # SQL to use if this dataset uses static SQL. Since static SQL
1553
1664
  # can be a PlaceholderLiteralString in addition to a String,
1554
1665
  # we literalize nonstrings. If there is an append_sql for this
@@ -1580,13 +1691,13 @@ module Sequel
1580
1691
  end
1581
1692
 
1582
1693
  def update_table_sql(sql)
1583
- sql << SPACE
1694
+ sql << ' '
1584
1695
  source_list_append(sql, @opts[:from])
1585
1696
  select_join_sql(sql) if supports_modifying_joins?
1586
1697
  end
1587
1698
 
1588
1699
  def update_set_sql(sql)
1589
- sql << SET
1700
+ sql << ' SET '
1590
1701
  values = @opts[:values]
1591
1702
  if values.is_a?(Hash)
1592
1703
  update_sql_values_hash(sql, values)
@@ -1597,9 +1708,9 @@ module Sequel
1597
1708
 
1598
1709
  def update_sql_values_hash(sql, values)
1599
1710
  c = false
1600
- eq = EQUAL
1711
+ eq = ' = '
1601
1712
  values.each do |k, v|
1602
- sql << COMMA if c
1713
+ sql << ', ' if c
1603
1714
  if k.is_a?(String) && !k.is_a?(LiteralString)
1604
1715
  quote_identifier_append(sql, k)
1605
1716
  else
@@ -1612,7 +1723,7 @@ module Sequel
1612
1723
  end
1613
1724
 
1614
1725
  def update_update_sql(sql)
1615
- sql << UPDATE
1726
+ sql << 'UPDATE'
1616
1727
  end
1617
1728
  end
1618
1729
  end