sequel 3.47.0 → 3.48.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 (243) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +230 -0
  3. data/README.rdoc +31 -40
  4. data/Rakefile +1 -14
  5. data/doc/active_record.rdoc +29 -29
  6. data/doc/association_basics.rdoc +4 -13
  7. data/doc/cheat_sheet.rdoc +8 -6
  8. data/doc/code_order.rdoc +89 -0
  9. data/doc/core_extensions.rdoc +3 -3
  10. data/doc/dataset_basics.rdoc +7 -8
  11. data/doc/dataset_filtering.rdoc +7 -2
  12. data/doc/mass_assignment.rdoc +2 -3
  13. data/doc/migration.rdoc +8 -8
  14. data/doc/model_hooks.rdoc +11 -7
  15. data/doc/object_model.rdoc +2 -2
  16. data/doc/opening_databases.rdoc +5 -14
  17. data/doc/prepared_statements.rdoc +5 -9
  18. data/doc/querying.rdoc +23 -28
  19. data/doc/reflection.rdoc +11 -0
  20. data/doc/release_notes/3.48.0.txt +477 -0
  21. data/doc/schema_modification.rdoc +12 -5
  22. data/doc/security.rdoc +2 -2
  23. data/doc/sharding.rdoc +1 -2
  24. data/doc/sql.rdoc +10 -13
  25. data/doc/testing.rdoc +8 -4
  26. data/doc/transactions.rdoc +2 -2
  27. data/doc/validations.rdoc +40 -17
  28. data/doc/virtual_rows.rdoc +2 -2
  29. data/lib/sequel/adapters/ado.rb +25 -20
  30. data/lib/sequel/adapters/ado/access.rb +1 -0
  31. data/lib/sequel/adapters/ado/mssql.rb +1 -0
  32. data/lib/sequel/adapters/db2.rb +9 -7
  33. data/lib/sequel/adapters/dbi.rb +16 -16
  34. data/lib/sequel/adapters/do.rb +17 -18
  35. data/lib/sequel/adapters/do/mysql.rb +1 -0
  36. data/lib/sequel/adapters/do/postgres.rb +2 -0
  37. data/lib/sequel/adapters/do/sqlite.rb +1 -0
  38. data/lib/sequel/adapters/firebird.rb +5 -7
  39. data/lib/sequel/adapters/ibmdb.rb +23 -20
  40. data/lib/sequel/adapters/informix.rb +8 -2
  41. data/lib/sequel/adapters/jdbc.rb +39 -35
  42. data/lib/sequel/adapters/jdbc/as400.rb +1 -0
  43. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
  44. data/lib/sequel/adapters/jdbc/db2.rb +1 -0
  45. data/lib/sequel/adapters/jdbc/derby.rb +1 -0
  46. data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
  47. data/lib/sequel/adapters/jdbc/h2.rb +1 -0
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
  49. data/lib/sequel/adapters/jdbc/informix.rb +1 -0
  50. data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
  51. data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
  52. data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
  53. data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
  54. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
  55. data/lib/sequel/adapters/jdbc/progress.rb +1 -0
  56. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
  57. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
  58. data/lib/sequel/adapters/mock.rb +30 -31
  59. data/lib/sequel/adapters/mysql.rb +6 -7
  60. data/lib/sequel/adapters/mysql2.rb +5 -6
  61. data/lib/sequel/adapters/odbc.rb +22 -20
  62. data/lib/sequel/adapters/odbc/mssql.rb +1 -0
  63. data/lib/sequel/adapters/openbase.rb +4 -1
  64. data/lib/sequel/adapters/oracle.rb +10 -8
  65. data/lib/sequel/adapters/postgres.rb +12 -10
  66. data/lib/sequel/adapters/shared/access.rb +6 -0
  67. data/lib/sequel/adapters/shared/cubrid.rb +2 -0
  68. data/lib/sequel/adapters/shared/db2.rb +2 -0
  69. data/lib/sequel/adapters/shared/firebird.rb +2 -0
  70. data/lib/sequel/adapters/shared/informix.rb +2 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +14 -8
  72. data/lib/sequel/adapters/shared/mysql.rb +6 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +2 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +14 -4
  75. data/lib/sequel/adapters/shared/progress.rb +1 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +4 -3
  77. data/lib/sequel/adapters/sqlite.rb +6 -7
  78. data/lib/sequel/adapters/swift.rb +20 -21
  79. data/lib/sequel/adapters/swift/mysql.rb +1 -0
  80. data/lib/sequel/adapters/swift/postgres.rb +2 -0
  81. data/lib/sequel/adapters/swift/sqlite.rb +1 -0
  82. data/lib/sequel/adapters/tinytds.rb +5 -6
  83. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
  84. data/lib/sequel/connection_pool.rb +1 -1
  85. data/lib/sequel/core.rb +57 -50
  86. data/lib/sequel/database/connecting.rb +9 -10
  87. data/lib/sequel/database/dataset.rb +11 -6
  88. data/lib/sequel/database/dataset_defaults.rb +61 -69
  89. data/lib/sequel/database/features.rb +21 -0
  90. data/lib/sequel/database/misc.rb +23 -3
  91. data/lib/sequel/database/query.rb +13 -7
  92. data/lib/sequel/database/schema_methods.rb +6 -6
  93. data/lib/sequel/database/transactions.rb +1 -0
  94. data/lib/sequel/dataset/actions.rb +51 -38
  95. data/lib/sequel/dataset/features.rb +1 -0
  96. data/lib/sequel/dataset/graph.rb +9 -33
  97. data/lib/sequel/dataset/misc.rb +30 -5
  98. data/lib/sequel/dataset/mutation.rb +2 -3
  99. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  100. data/lib/sequel/dataset/query.rb +91 -27
  101. data/lib/sequel/dataset/sql.rb +40 -6
  102. data/lib/sequel/deprecated.rb +74 -0
  103. data/lib/sequel/deprecated_core_extensions.rb +135 -0
  104. data/lib/sequel/extensions/columns_introspection.rb +1 -5
  105. data/lib/sequel/extensions/core_extensions.rb +10 -3
  106. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  107. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
  108. data/lib/sequel/extensions/filter_having.rb +58 -0
  109. data/lib/sequel/extensions/graph_each.rb +63 -0
  110. data/lib/sequel/extensions/hash_aliases.rb +44 -0
  111. data/lib/sequel/extensions/looser_typecasting.rb +14 -3
  112. data/lib/sequel/extensions/migration.rb +2 -3
  113. data/lib/sequel/extensions/named_timezones.rb +14 -1
  114. data/lib/sequel/extensions/null_dataset.rb +7 -1
  115. data/lib/sequel/extensions/pagination.rb +15 -5
  116. data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
  117. data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
  118. data/lib/sequel/extensions/pg_json.rb +7 -7
  119. data/lib/sequel/extensions/pg_range_ops.rb +8 -2
  120. data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
  121. data/lib/sequel/extensions/pretty_table.rb +13 -4
  122. data/lib/sequel/extensions/query.rb +21 -4
  123. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
  124. data/lib/sequel/extensions/schema_caching.rb +10 -7
  125. data/lib/sequel/extensions/schema_dumper.rb +35 -48
  126. data/lib/sequel/extensions/select_remove.rb +13 -4
  127. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
  128. data/lib/sequel/extensions/set_overrides.rb +43 -0
  129. data/lib/sequel/extensions/to_dot.rb +6 -0
  130. data/lib/sequel/model.rb +12 -6
  131. data/lib/sequel/model/associations.rb +80 -38
  132. data/lib/sequel/model/base.rb +137 -52
  133. data/lib/sequel/model/errors.rb +7 -2
  134. data/lib/sequel/plugins/active_model.rb +13 -0
  135. data/lib/sequel/plugins/after_initialize.rb +43 -0
  136. data/lib/sequel/plugins/association_proxies.rb +63 -7
  137. data/lib/sequel/plugins/auto_validations.rb +56 -16
  138. data/lib/sequel/plugins/blacklist_security.rb +63 -0
  139. data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
  140. data/lib/sequel/plugins/constraint_validations.rb +50 -8
  141. data/lib/sequel/plugins/dataset_associations.rb +2 -0
  142. data/lib/sequel/plugins/hook_class_methods.rb +7 -1
  143. data/lib/sequel/plugins/identity_map.rb +4 -0
  144. data/lib/sequel/plugins/json_serializer.rb +32 -13
  145. data/lib/sequel/plugins/optimistic_locking.rb +1 -1
  146. data/lib/sequel/plugins/rcte_tree.rb +4 -4
  147. data/lib/sequel/plugins/scissors.rb +33 -0
  148. data/lib/sequel/plugins/serialization.rb +1 -1
  149. data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
  150. data/lib/sequel/plugins/tree.rb +5 -1
  151. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  152. data/lib/sequel/plugins/validation_helpers.rb +15 -11
  153. data/lib/sequel/plugins/xml_serializer.rb +12 -3
  154. data/lib/sequel/sql.rb +12 -2
  155. data/lib/sequel/timezones.rb +1 -1
  156. data/lib/sequel/version.rb +1 -1
  157. data/lib/sequel_core.rb +1 -0
  158. data/lib/sequel_model.rb +1 -0
  159. data/spec/adapters/mssql_spec.rb +24 -57
  160. data/spec/adapters/postgres_spec.rb +27 -55
  161. data/spec/adapters/spec_helper.rb +1 -1
  162. data/spec/adapters/sqlite_spec.rb +1 -1
  163. data/spec/bin_spec.rb +251 -0
  164. data/spec/core/database_spec.rb +46 -32
  165. data/spec/core/dataset_spec.rb +233 -181
  166. data/spec/core/deprecated_spec.rb +78 -0
  167. data/spec/core/expression_filters_spec.rb +3 -4
  168. data/spec/core/mock_adapter_spec.rb +9 -9
  169. data/spec/core/object_graph_spec.rb +9 -19
  170. data/spec/core/schema_spec.rb +3 -1
  171. data/spec/core/spec_helper.rb +19 -0
  172. data/spec/core_extensions_spec.rb +80 -30
  173. data/spec/extensions/after_initialize_spec.rb +24 -0
  174. data/spec/extensions/association_proxies_spec.rb +37 -1
  175. data/spec/extensions/auto_validations_spec.rb +20 -4
  176. data/spec/extensions/blacklist_security_spec.rb +87 -0
  177. data/spec/extensions/boolean_readers_spec.rb +2 -1
  178. data/spec/extensions/class_table_inheritance_spec.rb +7 -0
  179. data/spec/extensions/columns_introspection_spec.rb +3 -3
  180. data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
  181. data/spec/extensions/core_refinements_spec.rb +7 -7
  182. data/spec/extensions/dataset_associations_spec.rb +2 -2
  183. data/spec/extensions/date_arithmetic_spec.rb +1 -1
  184. data/spec/extensions/defaults_setter_spec.rb +2 -1
  185. data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
  186. data/spec/extensions/filter_having_spec.rb +40 -0
  187. data/spec/extensions/graph_each_spec.rb +109 -0
  188. data/spec/extensions/hash_aliases_spec.rb +16 -0
  189. data/spec/extensions/hook_class_methods_spec.rb +2 -2
  190. data/spec/extensions/identity_map_spec.rb +3 -3
  191. data/spec/extensions/json_serializer_spec.rb +19 -19
  192. data/spec/extensions/lazy_attributes_spec.rb +1 -0
  193. data/spec/extensions/list_spec.rb +13 -13
  194. data/spec/extensions/looser_typecasting_spec.rb +10 -3
  195. data/spec/extensions/many_through_many_spec.rb +1 -1
  196. data/spec/extensions/migration_spec.rb +7 -7
  197. data/spec/extensions/named_timezones_spec.rb +6 -0
  198. data/spec/extensions/nested_attributes_spec.rb +2 -2
  199. data/spec/extensions/null_dataset_spec.rb +1 -1
  200. data/spec/extensions/pagination_spec.rb +2 -2
  201. data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
  202. data/spec/extensions/pg_range_ops_spec.rb +4 -2
  203. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  204. data/spec/extensions/pretty_table_spec.rb +1 -1
  205. data/spec/extensions/query_literals_spec.rb +1 -1
  206. data/spec/extensions/query_spec.rb +3 -3
  207. data/spec/extensions/schema_caching_spec.rb +3 -3
  208. data/spec/extensions/schema_dumper_spec.rb +27 -2
  209. data/spec/extensions/schema_spec.rb +2 -2
  210. data/spec/extensions/scissors_spec.rb +26 -0
  211. data/spec/extensions/select_remove_spec.rb +1 -1
  212. data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
  213. data/spec/extensions/set_overrides_spec.rb +45 -0
  214. data/spec/extensions/single_table_inheritance_spec.rb +10 -0
  215. data/spec/extensions/spec_helper.rb +24 -1
  216. data/spec/extensions/static_cache_spec.rb +1 -1
  217. data/spec/extensions/string_stripper_spec.rb +2 -1
  218. data/spec/extensions/to_dot_spec.rb +1 -1
  219. data/spec/extensions/typecast_on_load_spec.rb +3 -2
  220. data/spec/extensions/update_primary_key_spec.rb +2 -2
  221. data/spec/extensions/validation_class_methods_spec.rb +19 -19
  222. data/spec/extensions/validation_helpers_spec.rb +30 -21
  223. data/spec/extensions/xml_serializer_spec.rb +5 -5
  224. data/spec/integration/associations_test.rb +10 -30
  225. data/spec/integration/dataset_test.rb +20 -24
  226. data/spec/integration/eager_loader_test.rb +5 -5
  227. data/spec/integration/model_test.rb +3 -3
  228. data/spec/integration/plugin_test.rb +7 -39
  229. data/spec/integration/schema_test.rb +4 -38
  230. data/spec/integration/spec_helper.rb +2 -1
  231. data/spec/model/association_reflection_spec.rb +70 -5
  232. data/spec/model/associations_spec.rb +11 -11
  233. data/spec/model/base_spec.rb +25 -8
  234. data/spec/model/class_dataset_methods_spec.rb +143 -0
  235. data/spec/model/dataset_methods_spec.rb +1 -1
  236. data/spec/model/eager_loading_spec.rb +25 -25
  237. data/spec/model/hooks_spec.rb +1 -1
  238. data/spec/model/model_spec.rb +22 -7
  239. data/spec/model/plugins_spec.rb +1 -6
  240. data/spec/model/record_spec.rb +37 -29
  241. data/spec/model/spec_helper.rb +23 -1
  242. data/spec/model/validations_spec.rb +15 -17
  243. metadata +32 -3
@@ -336,6 +336,7 @@ module Sequel
336
336
  # Do not call this method with untrusted input, as that can result in
337
337
  # arbitrary code execution.
338
338
  def self.def_append_methods(meths)
339
+ Sequel::Deprecation.deprecate('Dataset.def_append_methods', "There is no replacement planned")
339
340
  meths.each do |meth|
340
341
  class_eval(<<-END, __FILE__, __LINE__ + 1)
341
342
  def #{meth}(*args, &block)
@@ -346,9 +347,28 @@ module Sequel
346
347
  END
347
348
  end
348
349
  end
349
- def_append_methods(PUBLIC_APPEND_METHODS + PRIVATE_APPEND_METHODS)
350
+ (PUBLIC_APPEND_METHODS + PRIVATE_APPEND_METHODS - [:literal, :quote_identifier, :quote_schema_table]).each do |meth|
351
+ class_eval(<<-END, __FILE__, __LINE__ + 1)
352
+ def #{meth}(*args, &block)
353
+ Sequel::Deprecation.deprecate('Dataset##{meth}', "Please switch to Dataset##{meth}_append")
354
+ s = ''
355
+ #{meth}_append(s, *args, &block)
356
+ s
357
+ end
358
+ END
359
+ end
350
360
  private(*PRIVATE_APPEND_METHODS)
351
361
 
362
+ [:literal, :quote_identifier, :quote_schema_table].each do |meth|
363
+ class_eval(<<-END, __FILE__, __LINE__ + 1)
364
+ def #{meth}(*args, &block)
365
+ s = ''
366
+ #{meth}_append(s, *args, &block)
367
+ s
368
+ end
369
+ END
370
+ end
371
+
352
372
  # SQL fragment for AliasedExpression
353
373
  def aliased_expression_sql_append(sql, ae)
354
374
  literal_append(sql, ae.expression)
@@ -601,13 +621,21 @@ module Sequel
601
621
  sql << s
602
622
  literal_append(sql, args[i]) unless i == len
603
623
  end
624
+ unless str.length == args.length || str.length == args.length + 1
625
+ Sequel::Deprecation.deprecate("Using a mismatched number of placeholders (#{str.length}) and placeholder arguments (#{args.length}) is deprecated and will raise an Error in Sequel 4.")
626
+ end
604
627
  else
605
628
  i = -1
606
629
  loop do
607
630
  previous, q, str = str.partition(QUESTION_MARK)
608
631
  sql << previous
609
- literal_append(sql, args.at(i+=1)) unless q.empty?
610
- break if str.empty?
632
+ literal_append(sql, args.at(i+=1)) unless q.empty?
633
+ if str.empty?
634
+ unless i + 1 == args.length
635
+ Sequel::Deprecation.deprecate("Using a mismatched number of placeholders (#{i+1}) and placeholder arguments (#{args.length}) is deprecated and will raise an Error in Sequel 4.")
636
+ end
637
+ break
638
+ end
611
639
  end
612
640
  end
613
641
  sql << PAREN_CLOSE if pls.parens
@@ -665,7 +693,7 @@ module Sequel
665
693
  # Note that this function does not handle tables with more than one
666
694
  # level of qualification (e.g. database.schema.table on Microsoft
667
695
  # SQL Server).
668
- def schema_and_table(table_name, sch=(db.default_schema if db))
696
+ def schema_and_table(table_name, sch=(db._default_schema if db))
669
697
  sch = sch.to_s if sch
670
698
  case table_name
671
699
  when Symbol
@@ -921,6 +949,7 @@ module Sequel
921
949
  end
922
950
  end
923
951
 
952
+ # An expression for how to handle an empty array lookup
924
953
  def empty_array_value(op, cols)
925
954
  if Sequel.empty_array_handle_nulls
926
955
  c = Array(cols)
@@ -978,7 +1007,12 @@ module Sequel
978
1007
  literal_append(sql, v)
979
1008
  end
980
1009
  end
981
- alias table_ref_append identifier_append
1010
+
1011
+ # REMOVE40
1012
+ def table_ref_append(sql, v)
1013
+ Sequel::Deprecation.deprecate('Dataset#table_ref_append', "Please switch to Dataset#identifier_append")
1014
+ identifier_append(sql, v)
1015
+ end
982
1016
 
983
1017
  # Append all identifiers in args interspersed by commas.
984
1018
  def identifier_list_append(sql, args)
@@ -1196,7 +1230,7 @@ module Sequel
1196
1230
  # Returns a qualified column name (including a table name) if the column
1197
1231
  # name isn't already qualified.
1198
1232
  def qualified_column_name(column, table)
1199
- if Symbol === column
1233
+ if column.is_a?(Symbol)
1200
1234
  c_table, column, _ = split_symbol(column)
1201
1235
  unless c_table
1202
1236
  case table
@@ -0,0 +1,74 @@
1
+ module Sequel
2
+ # This module makes it easy to print deprecation warnings with optional backtraces to a given stream.
3
+ # There are a two accessors you can use to change how/where the deprecation methods are printed
4
+ # and whether/how backtraces should be included:
5
+ #
6
+ # Sequel::Deprecation.output = $stderr # print deprecation messages to standard error (default)
7
+ # Sequel::Deprecation.output = File.open('deprecated_calls.txt', 'wb') # use a file instead
8
+ # Sequel::Deprecation.output = false # do not output deprecation messages
9
+ #
10
+ # Sequel::Deprecation.prefix = "SEQUEL DEPRECATION WARNING: " # prefix deprecation messages with a given string (default)
11
+ # Sequel::Deprecation.prefix = false # do not prefix deprecation messages
12
+ #
13
+ # Sequel::Deprecation.backtrace_filter = false # don't include backtraces
14
+ # Sequel::Deprecation.backtrace_filter = true # include full backtraces
15
+ # Sequel::Deprecation.backtrace_filter = 10 # include 10 backtrace lines (default)
16
+ # Sequel::Deprecation.backtrace_filter = 1 # include 1 backtrace line
17
+ # Sequel::Deprecation.backtrace_filter = lambda{|line, line_no| line_no < 3 || line =~ /my_app/} # select backtrace lines to output
18
+ module Deprecation
19
+ @backtrace_filter = 10
20
+ @output = $stderr
21
+ @prefix = "SEQUEL DEPRECATION WARNING: "
22
+
23
+ class << self
24
+ # How to filter backtraces. +false+ does not include backtraces, +true+ includes
25
+ # full backtraces, an Integer includes that number of backtrace lines, and
26
+ # a proc is called with the backtrace line and line number to select the backtrace
27
+ # lines to include. The default is 10 backtrace lines.
28
+ attr_accessor :backtrace_filter
29
+
30
+ # Where deprecation messages should be output, must respond to puts. $stderr by default.
31
+ attr_accessor :output
32
+
33
+ # Where deprecation messages should be prefixed with ("SEQUEL DEPRECATION WARNING: " by default).
34
+ attr_accessor :prefix
35
+ end
36
+
37
+ # Print the message and possibly backtrace to the output.
38
+ def self.deprecate(method, instead=nil)
39
+ return unless output
40
+ message = instead ? "#{method} is deprecated and will be removed in Sequel 4.0. #{instead}." : method
41
+ message = "#{prefix}#{message}" if prefix
42
+ output.puts(message)
43
+ case b = backtrace_filter
44
+ when Integer
45
+ caller.each do |c|
46
+ b -= 1
47
+ output.puts(c)
48
+ break if b <= 0
49
+ end
50
+ when true
51
+ caller.each{|c| output.puts(c)}
52
+ when Proc
53
+ caller.each_with_index{|line, line_no| output.puts(line) if b.call(line, line_no)}
54
+ end
55
+ nil
56
+ end
57
+
58
+ # Return a module that includes deprecation warnings for all public
59
+ # instance methods in the given module, such that including the returned
60
+ # module will not result in the given module being included.
61
+ def self.deprecated_module(mod, &block)
62
+ Module.new do
63
+ include mod.dup
64
+ mod.public_instance_methods.each do |meth|
65
+ msg = block.call(meth)
66
+ define_method(meth) do |*a, &blk|
67
+ Sequel::Deprecation.deprecate(*msg)
68
+ super(*a, &blk)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,135 @@
1
+ def Sequel.core_extensions?
2
+ true
3
+ end
4
+
5
+ class Array
6
+ def ~
7
+ Sequel::Deprecation.deprecate('Array#~', 'Please use Sequel.~ instead, or Sequel.extension(:core_extensions) to continue using it')
8
+ Sequel.~(self)
9
+ end
10
+
11
+ def case(*args)
12
+ Sequel::Deprecation.deprecate('Array#case', 'Please use Sequel.case instead, or Sequel.extension(:core_extensions) to continue using it')
13
+ ::Sequel::SQL::CaseExpression.new(self, *args)
14
+ end
15
+
16
+ def sql_value_list
17
+ Sequel::Deprecation.deprecate('Array#sql_value_list/Array#sql_array', 'Please use Sequel.value_list instead, or Sequel.extension(:core_extensions) to continue using it')
18
+ ::Sequel::SQL::ValueList.new(self)
19
+ end
20
+ alias sql_array sql_value_list
21
+
22
+ def sql_expr
23
+ Sequel::Deprecation.deprecate('Array#sql_expr', 'Please use Sequel.expr instead, or Sequel.extension(:core_extensions) to continue using it')
24
+ Sequel.expr(self)
25
+ end
26
+
27
+ def sql_negate
28
+ Sequel::Deprecation.deprecate('Array#sql_negate', 'Please use Sequel.negate instead, or Sequel.extension(:core_extensions) to continue using it')
29
+ Sequel.negate(self)
30
+ end
31
+
32
+ def sql_or
33
+ Sequel::Deprecation.deprecate('Array#sql_or', 'Please use Sequel.or instead, or Sequel.extension(:core_extensions) to continue using it')
34
+ Sequel.or(self)
35
+ end
36
+
37
+ def sql_string_join(joiner=nil)
38
+ Sequel::Deprecation.deprecate('Array#sql_string_join', 'Please use Sequel.join instead, or Sequel.extension(:core_extensions) to continue using it')
39
+ Sequel.join(self, joiner)
40
+ end
41
+ end
42
+
43
+ class Hash
44
+ def &(ce)
45
+ Sequel::Deprecation.deprecate('Hash#&', 'Please use Sequel.& instead, or Sequel.extension(:core_extensions) to continue using it')
46
+ ::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
47
+ end
48
+
49
+ def |(ce)
50
+ Sequel::Deprecation.deprecate('Hash#|', 'Please use Sequel.| instead, or Sequel.extension(:core_extensions) to continue using it')
51
+ ::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
52
+ end
53
+
54
+ def ~
55
+ Sequel::Deprecation.deprecate('Hash#~', 'Please use Sequel.~ instead, or Sequel.extension(:core_extensions) to continue using it')
56
+ ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
57
+ end
58
+
59
+ def case(*args)
60
+ Sequel::Deprecation.deprecate('Hash#case', 'Please use Sequel.case instead, or Sequel.extension(:core_extensions) to continue using it')
61
+ ::Sequel::SQL::CaseExpression.new(to_a, *args)
62
+ end
63
+
64
+ def sql_expr
65
+ Sequel::Deprecation.deprecate('Hash#sql_expr', 'Please use Sequel.expr instead, or Sequel.extension(:core_extensions) to continue using it')
66
+ ::Sequel::SQL::BooleanExpression.from_value_pairs(self)
67
+ end
68
+
69
+ def sql_negate
70
+ Sequel::Deprecation.deprecate('Hash#sql_negate', 'Please use Sequel.negate instead, or Sequel.extension(:core_extensions) to continue using it')
71
+ ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
72
+ end
73
+
74
+ def sql_or
75
+ Sequel::Deprecation.deprecate('Hash#sql_or', 'Please use Sequel.or instead, or Sequel.extension(:core_extensions) to continue using it')
76
+ ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
77
+ end
78
+ end
79
+
80
+ class String
81
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::AliasMethods){|meth| ["String#as", 'Please use Sequel.as instead, or Sequel.extension(:core_extensions) to continue using it']}
82
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::CastMethods){|meth| ["String##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
83
+
84
+ def lit(*args)
85
+ Sequel::Deprecation.deprecate('String#lit', 'Please use Sequel.lit instead, or Sequel.extension(:core_extensions) to continue using it')
86
+ args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
87
+ end
88
+
89
+ def to_sequel_blob
90
+ Sequel::Deprecation.deprecate('String#to_sequel_blob', 'Please use Sequel.blob instead, or Sequel.extension(:core_extensions) to continue using it')
91
+ ::Sequel::SQL::Blob.new(self)
92
+ end
93
+ end
94
+
95
+ class Symbol
96
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::AliasMethods){|meth| ["Symbol#as", 'Please use Sequel.as instead, or Sequel.extension(:core_extensions) to continue using it']}
97
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::CastMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
98
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::OrderMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
99
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::BooleanMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
100
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::NumericMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
101
+ include(Sequel::Deprecation.deprecated_module(Sequel::SQL::QualifyingMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}.module_eval do
102
+ def *(ce=(arg=false;nil))
103
+ if arg == false
104
+ Sequel::Deprecation.deprecate('Symbol#*', "Please use Sequel.expr(symbol).* instead, or Sequel.extension(:core_extensions) to continue using it")
105
+ Sequel::SQL::ColumnAll.new(self)
106
+ else
107
+ super(ce)
108
+ end
109
+ end
110
+ self
111
+ end)
112
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::StringMethods){|meth| ["Symbol##{meth}", "Please use Sequel.#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
113
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::SubscriptMethods){["Symbol#sql_subscript", "Please use Sequel.subscript instead, or Sequel.extension(:core_extensions) to continue using it"]}
114
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::ComplexExpressionMethods){|meth| ["Symbol##{meth}", "Please use Sequel.expr(symbol).#{meth} instead, or Sequel.extension(:core_extensions) to continue using it"]}
115
+
116
+ if RUBY_VERSION < '1.9.0'
117
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::InequalityMethods){|meth| ["Symbol##{meth}", "Please use Sequel.expr(symbol).#{meth} instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it"]}
118
+ end
119
+
120
+ def identifier
121
+ Sequel::Deprecation.deprecate('Symbol#identifier', 'Please use Sequel.identifier instead, or Sequel.extension(:core_extensions) to continue using it')
122
+ Sequel::SQL::Identifier.new(self)
123
+ end
124
+
125
+ def sql_function(*args)
126
+ Sequel::Deprecation.deprecate('Symbol#sql_function', 'Please use Sequel.function instead, or Sequel.extension(:core_extensions) to continue using it')
127
+ Sequel::SQL::Function.new(self, *args)
128
+ end
129
+ if RUBY_VERSION < '1.9.0'
130
+ def [](*args)
131
+ Sequel::Deprecation.deprecate('Symbol#[]', 'Please use Sequel.function instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it')
132
+ Sequel::SQL::Function.new(self, *args)
133
+ end
134
+ end
135
+ end
@@ -14,11 +14,6 @@
14
14
  # To attempt to introspect columns for all datasets on a single database:
15
15
  #
16
16
  # DB.extension(:columns_introspection)
17
- #
18
- # To attempt to introspect columns for all datasets on all databases:
19
- #
20
- # Sequel.extension :columns_introspection
21
- # Sequel::Dataset.introspect_all_columns
22
17
 
23
18
  module Sequel
24
19
  module ColumnsIntrospection
@@ -87,6 +82,7 @@ module Sequel
87
82
 
88
83
  # Enable column introspection for every dataset.
89
84
  def self.introspect_all_columns
85
+ Sequel::Deprecation.deprecate('Sequel::Dataset.introspect_all_columns', "Please use Database.extension :columns_introspection to load the extension into all databases")
90
86
  include ColumnsIntrospection
91
87
  remove_method(:columns) if instance_methods(false).map{|x| x.to_s}.include?('columns')
92
88
  end
@@ -4,7 +4,7 @@
4
4
  # expression objects.
5
5
  #
6
6
  # This extension is currently loaded by default, but that will no
7
- # longer be true in a future version. In a future version, you will
7
+ # longer be true in Sequel 4. Starting in Sequel 4, you will
8
8
  # need to load it manually via:
9
9
  #
10
10
  # Sequel.extension :core_extensions
@@ -208,7 +208,9 @@ class Symbol
208
208
  include Sequel::SQL::StringMethods
209
209
  include Sequel::SQL::SubscriptMethods
210
210
  include Sequel::SQL::ComplexExpressionMethods
211
- include Sequel::SQL::InequalityMethods if RUBY_VERSION < '1.9.0'
211
+ if RUBY_VERSION < '1.9.0'
212
+ include Sequel::Deprecation.deprecated_module(Sequel::SQL::InequalityMethods){|meth| ["Symbol##{meth}", "Please use Sequel.expr(symbol).#{meth} instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it"]}
213
+ end
212
214
 
213
215
  # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>. Usually used to
214
216
  # prevent splitting the symbol.
@@ -230,5 +232,10 @@ class Symbol
230
232
  def sql_function(*args)
231
233
  Sequel::SQL::Function.new(self, *args)
232
234
  end
233
- alias_method(:[], :sql_function) if RUBY_VERSION < '1.9.0'
235
+ if RUBY_VERSION < '1.9.0'
236
+ def [](*args)
237
+ Sequel::Deprecation.deprecate('Symbol#[]', 'Please use Sequel.function instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it')
238
+ Sequel::SQL::Function.new(self, *args)
239
+ end
240
+ end
234
241
  end
@@ -122,6 +122,7 @@ module Sequel
122
122
  end
123
123
  false
124
124
  else
125
+ Sequel::Deprecation.deprecate('Sequel::NotImplemented', 'Sequel 4 will just raise Error if date_arithmetic is not supported on the database')
125
126
  raise NotImplemented, "date arithmetic is not implemented on #{db.database_type}"
126
127
  end
127
128
 
@@ -0,0 +1,33 @@
1
+ # This changes Sequel's literalization of IN/NOT IN with an empty
2
+ # array value to not return NULL even if one of the referenced
3
+ # columns is NULL:
4
+ #
5
+ # DB[:test].where(:name=>[])
6
+ # # SELECT * FROM test WHERE (1 = 0)
7
+ # DB[:test].exclude(:name=>[])
8
+ # # SELECT * FROM test WHERE (1 = 1)
9
+ #
10
+ # The default Sequel behavior is to respect NULLs, so that when
11
+ # name is NULL, the expression returns NULL.
12
+ #
13
+ # You can load this extension into specific datasets:
14
+ #
15
+ # ds = DB[:table]
16
+ # ds.extension(:empty_array_ignore_nulls)
17
+ #
18
+ # Or you can load it into all of a database's datasets, which
19
+ # is probably the desired behavior if you are using this extension:
20
+ #
21
+ # DB.extension(:empty_array_ignore_nulls)
22
+
23
+ module Sequel
24
+ module EmptyArrayIgnoreNulls
25
+ # Use a simple expression that is always true or false, never NULL.
26
+ def empty_array_value(op, cols)
27
+ {1 => ((op == :IN) ? 0 : 1)}
28
+ end
29
+
30
+ end
31
+
32
+ Dataset.register_extension(:empty_array_ignore_nulls, EmptyArrayIgnoreNulls)
33
+ end
@@ -0,0 +1,58 @@
1
+ # The filter_having extension allows Dataset#filter, #and, #or
2
+ # and #exclude to operate on the HAVING clause if the dataset
3
+ # already has a HAVING clause, which was the historical behavior
4
+ # before Sequel 4. It is only recommended to use this for
5
+ # backwards compatibility.
6
+ #
7
+ # You can load this extension into specific datasets:
8
+ #
9
+ # ds = DB[:table]
10
+ # ds.extension(:filter_having)
11
+ #
12
+ # Or you can load it into all of a database's datasets, which
13
+ # is probably the desired behavior if you are using this extension:
14
+ #
15
+ # DB.extension(:filter_having)
16
+
17
+ module Sequel
18
+ module FilterHaving
19
+ # Operate on HAVING clause if HAVING clause already present.
20
+ def and(*cond, &block)
21
+ if @opts[:having]
22
+ having(*cond, &block)
23
+ else
24
+ super
25
+ end
26
+ end
27
+
28
+ # Operate on HAVING clause if HAVING clause already present.
29
+ def exclude(*cond, &block)
30
+ if @opts[:having]
31
+ exclude_having(*cond, &block)
32
+ else
33
+ super
34
+ end
35
+ end
36
+
37
+ # Operate on HAVING clause if HAVING clause already present.
38
+ def filter(*cond, &block)
39
+ if @opts[:having]
40
+ having(*cond, &block)
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ # Operate on HAVING clause if HAVING clause already present.
47
+ def or(*cond, &block)
48
+ if having = @opts[:having]
49
+ cond = cond.first if cond.size == 1
50
+ clone(:having => SQL::BooleanExpression.new(:OR, having, filter_expr(cond, &block)))
51
+ else
52
+ super
53
+ end
54
+ end
55
+ end
56
+
57
+ Dataset.register_extension(:filter_having, FilterHaving)
58
+ end