sequel 4.47.0 → 4.48.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +134 -0
  3. data/Rakefile +1 -1
  4. data/doc/release_notes/4.48.0.txt +293 -0
  5. data/lib/sequel/adapters/ado/access.rb +2 -1
  6. data/lib/sequel/adapters/do/postgres.rb +5 -2
  7. data/lib/sequel/adapters/ibmdb.rb +24 -7
  8. data/lib/sequel/adapters/jdbc.rb +36 -22
  9. data/lib/sequel/adapters/jdbc/db2.rb +12 -3
  10. data/lib/sequel/adapters/jdbc/derby.rb +4 -5
  11. data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
  12. data/lib/sequel/adapters/jdbc/postgresql.rb +43 -18
  13. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
  14. data/lib/sequel/adapters/jdbc/sqlserver.rb +11 -4
  15. data/lib/sequel/adapters/mock.rb +24 -19
  16. data/lib/sequel/adapters/mysql.rb +17 -16
  17. data/lib/sequel/adapters/mysql2.rb +4 -5
  18. data/lib/sequel/adapters/oracle.rb +5 -9
  19. data/lib/sequel/adapters/postgres.rb +89 -102
  20. data/lib/sequel/adapters/shared/db2.rb +22 -6
  21. data/lib/sequel/adapters/shared/mssql.rb +5 -4
  22. data/lib/sequel/adapters/shared/mysql.rb +75 -24
  23. data/lib/sequel/adapters/shared/postgres.rb +196 -94
  24. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  25. data/lib/sequel/adapters/shared/sqlite.rb +72 -82
  26. data/lib/sequel/adapters/sqlanywhere.rb +4 -1
  27. data/lib/sequel/adapters/sqlite.rb +5 -3
  28. data/lib/sequel/adapters/swift/postgres.rb +5 -2
  29. data/lib/sequel/adapters/tinytds.rb +0 -5
  30. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  31. data/lib/sequel/adapters/utils/pg_types.rb +2 -76
  32. data/lib/sequel/core.rb +2 -2
  33. data/lib/sequel/database/connecting.rb +5 -5
  34. data/lib/sequel/database/dataset.rb +6 -3
  35. data/lib/sequel/database/misc.rb +1 -1
  36. data/lib/sequel/database/query.rb +3 -0
  37. data/lib/sequel/database/schema_methods.rb +1 -1
  38. data/lib/sequel/dataset/actions.rb +18 -10
  39. data/lib/sequel/dataset/graph.rb +1 -1
  40. data/lib/sequel/dataset/misc.rb +1 -0
  41. data/lib/sequel/dataset/prepared_statements.rb +3 -3
  42. data/lib/sequel/dataset/query.rb +19 -8
  43. data/lib/sequel/extensions/core_extensions.rb +4 -1
  44. data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -1
  45. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
  46. data/lib/sequel/extensions/filter_having.rb +2 -0
  47. data/lib/sequel/extensions/freeze_datasets.rb +2 -0
  48. data/lib/sequel/extensions/from_block.rb +1 -1
  49. data/lib/sequel/extensions/graph_each.rb +2 -2
  50. data/lib/sequel/extensions/hash_aliases.rb +2 -0
  51. data/lib/sequel/extensions/identifier_mangling.rb +0 -7
  52. data/lib/sequel/extensions/meta_def.rb +2 -0
  53. data/lib/sequel/extensions/migration.rb +6 -6
  54. data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
  55. data/lib/sequel/extensions/pagination.rb +1 -1
  56. data/lib/sequel/extensions/pg_array.rb +207 -130
  57. data/lib/sequel/extensions/pg_hstore.rb +38 -20
  58. data/lib/sequel/extensions/pg_inet.rb +18 -6
  59. data/lib/sequel/extensions/pg_interval.rb +19 -12
  60. data/lib/sequel/extensions/pg_json.rb +25 -14
  61. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  62. data/lib/sequel/extensions/pg_range.rb +133 -100
  63. data/lib/sequel/extensions/pg_range_ops.rb +4 -3
  64. data/lib/sequel/extensions/pg_row.rb +68 -39
  65. data/lib/sequel/extensions/pg_row_ops.rb +11 -5
  66. data/lib/sequel/extensions/query_literals.rb +2 -0
  67. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
  68. data/lib/sequel/extensions/s.rb +1 -1
  69. data/lib/sequel/extensions/schema_dumper.rb +24 -24
  70. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
  71. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
  72. data/lib/sequel/extensions/set_overrides.rb +2 -2
  73. data/lib/sequel/extensions/string_agg.rb +0 -1
  74. data/lib/sequel/extensions/symbol_aref.rb +0 -4
  75. data/lib/sequel/model.rb +25 -57
  76. data/lib/sequel/model/associations.rb +14 -5
  77. data/lib/sequel/model/base.rb +96 -32
  78. data/lib/sequel/plugins/association_pks.rb +73 -46
  79. data/lib/sequel/plugins/association_proxies.rb +1 -1
  80. data/lib/sequel/plugins/auto_validations.rb +6 -2
  81. data/lib/sequel/plugins/boolean_readers.rb +1 -1
  82. data/lib/sequel/plugins/caching.rb +19 -13
  83. data/lib/sequel/plugins/class_table_inheritance.rb +19 -10
  84. data/lib/sequel/plugins/column_conflicts.rb +7 -2
  85. data/lib/sequel/plugins/column_select.rb +1 -1
  86. data/lib/sequel/plugins/csv_serializer.rb +8 -8
  87. data/lib/sequel/plugins/defaults_setter.rb +10 -0
  88. data/lib/sequel/plugins/eager_each.rb +1 -1
  89. data/lib/sequel/plugins/force_encoding.rb +2 -2
  90. data/lib/sequel/plugins/hook_class_methods.rb +9 -12
  91. data/lib/sequel/plugins/identifier_columns.rb +2 -0
  92. data/lib/sequel/plugins/instance_filters.rb +3 -1
  93. data/lib/sequel/plugins/instance_hooks.rb +17 -9
  94. data/lib/sequel/plugins/json_serializer.rb +17 -10
  95. data/lib/sequel/plugins/lazy_attributes.rb +8 -7
  96. data/lib/sequel/plugins/modification_detection.rb +3 -0
  97. data/lib/sequel/plugins/nested_attributes.rb +5 -1
  98. data/lib/sequel/plugins/pg_array_associations.rb +5 -0
  99. data/lib/sequel/plugins/prepared_statements.rb +1 -0
  100. data/lib/sequel/plugins/rcte_tree.rb +4 -4
  101. data/lib/sequel/plugins/serialization.rb +3 -10
  102. data/lib/sequel/plugins/single_table_inheritance.rb +2 -2
  103. data/lib/sequel/plugins/split_values.rb +6 -5
  104. data/lib/sequel/plugins/static_cache.rb +31 -25
  105. data/lib/sequel/plugins/subset_conditions.rb +3 -1
  106. data/lib/sequel/plugins/table_select.rb +1 -1
  107. data/lib/sequel/plugins/touch.rb +2 -1
  108. data/lib/sequel/plugins/validation_class_methods.rb +5 -6
  109. data/lib/sequel/plugins/validation_helpers.rb +2 -4
  110. data/lib/sequel/plugins/xml_serializer.rb +4 -4
  111. data/lib/sequel/sql.rb +2 -2
  112. data/lib/sequel/version.rb +1 -1
  113. data/spec/adapters/db2_spec.rb +115 -14
  114. data/spec/adapters/mysql_spec.rb +78 -28
  115. data/spec/adapters/oracle_spec.rb +24 -24
  116. data/spec/adapters/postgres_spec.rb +38 -24
  117. data/spec/adapters/sqlanywhere_spec.rb +88 -86
  118. data/spec/adapters/sqlite_spec.rb +29 -24
  119. data/spec/core/connection_pool_spec.rb +17 -0
  120. data/spec/core/database_spec.rb +6 -0
  121. data/spec/core/dataset_spec.rb +46 -36
  122. data/spec/core/schema_spec.rb +16 -0
  123. data/spec/core/spec_helper.rb +1 -0
  124. data/spec/core_extensions_spec.rb +6 -2
  125. data/spec/extensions/active_model_spec.rb +1 -1
  126. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  127. data/spec/extensions/association_pks_spec.rb +34 -2
  128. data/spec/extensions/auto_literal_strings_spec.rb +5 -1
  129. data/spec/extensions/auto_validations_spec.rb +2 -0
  130. data/spec/extensions/boolean_readers_spec.rb +1 -1
  131. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  132. data/spec/extensions/class_table_inheritance_spec.rb +48 -2
  133. data/spec/extensions/column_conflicts_spec.rb +11 -0
  134. data/spec/extensions/connection_validator_spec.rb +1 -1
  135. data/spec/extensions/dataset_associations_spec.rb +8 -8
  136. data/spec/extensions/defaults_setter_spec.rb +1 -1
  137. data/spec/extensions/filter_having_spec.rb +5 -3
  138. data/spec/extensions/hash_aliases_spec.rb +3 -1
  139. data/spec/extensions/identifier_columns_spec.rb +3 -1
  140. data/spec/extensions/implicit_subquery_spec.rb +4 -2
  141. data/spec/extensions/json_serializer_spec.rb +18 -0
  142. data/spec/extensions/lazy_attributes_spec.rb +3 -3
  143. data/spec/extensions/meta_def_spec.rb +9 -0
  144. data/spec/extensions/migration_spec.rb +3 -3
  145. data/spec/extensions/nested_attributes_spec.rb +14 -3
  146. data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
  147. data/spec/extensions/pg_array_associations_spec.rb +29 -18
  148. data/spec/extensions/pg_array_spec.rb +44 -25
  149. data/spec/extensions/pg_hstore_spec.rb +10 -0
  150. data/spec/extensions/pg_inet_spec.rb +26 -0
  151. data/spec/extensions/pg_interval_spec.rb +20 -0
  152. data/spec/extensions/pg_json_spec.rb +24 -0
  153. data/spec/extensions/pg_range_spec.rb +98 -14
  154. data/spec/extensions/pg_row_spec.rb +14 -4
  155. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  156. data/spec/extensions/query_literals_spec.rb +3 -1
  157. data/spec/extensions/schema_dumper_spec.rb +96 -98
  158. data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
  159. data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
  160. data/spec/extensions/single_table_inheritance_spec.rb +1 -1
  161. data/spec/extensions/spec_helper.rb +7 -1
  162. data/spec/extensions/static_cache_spec.rb +75 -24
  163. data/spec/extensions/string_agg_spec.rb +1 -1
  164. data/spec/extensions/touch_spec.rb +9 -0
  165. data/spec/extensions/validation_helpers_spec.rb +9 -3
  166. data/spec/extensions/whitelist_security_spec.rb +26 -0
  167. data/spec/integration/dataset_test.rb +45 -44
  168. data/spec/integration/plugin_test.rb +20 -0
  169. data/spec/integration/prepared_statement_test.rb +3 -0
  170. data/spec/integration/schema_test.rb +21 -1
  171. data/spec/integration/transaction_test.rb +40 -40
  172. data/spec/model/class_dataset_methods_spec.rb +14 -4
  173. data/spec/model/dataset_methods_spec.rb +12 -3
  174. data/spec/model/model_spec.rb +8 -0
  175. metadata +6 -4
  176. data/spec/adapters/firebird_spec.rb +0 -405
  177. data/spec/adapters/informix_spec.rb +0 -100
@@ -49,18 +49,18 @@
49
49
  #
50
50
  # * \[\]
51
51
  # * \[\]=
52
- # * assoc (ruby 1.9 only)
52
+ # * assoc
53
53
  # * delete
54
54
  # * fetch
55
55
  # * has_key?
56
56
  # * has_value?
57
57
  # * include?
58
- # * key (ruby 1.9 only)
58
+ # * key
59
59
  # * key?
60
60
  # * member?
61
61
  # * merge
62
62
  # * merge!
63
- # * rassoc (ruby 1.9 only)
63
+ # * rassoc
64
64
  # * replace
65
65
  # * store
66
66
  # * update
@@ -70,10 +70,7 @@
70
70
  #
71
71
  # DB[:table].insert(:column=>Sequel.hstore('foo'=>'bar'))
72
72
  #
73
- # If you would like to use hstore columns in your model objects, you
74
- # probably want to modify the schema parsing/typecasting so that it
75
- # recognizes and correctly handles the hstore columns, which you can
76
- # do by:
73
+ # To use this extension, first load it into your Sequel::Database instance:
77
74
  #
78
75
  # DB.extension :pg_hstore
79
76
  #
@@ -95,12 +92,19 @@ module Sequel
95
92
  # Parser for PostgreSQL hstore output format.
96
93
  class Parser < StringScanner
97
94
  QUOTE_RE = /"/.freeze
95
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
98
96
  KV_SEP_RE = /"\s*=>\s*/.freeze
97
+ Sequel::Deprecation.deprecate_constant(self, :KV_SEP_RE)
99
98
  NULL_RE = /NULL/.freeze
99
+ Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
100
100
  SEP_RE = /,\s*/.freeze
101
+ Sequel::Deprecation.deprecate_constant(self, :SEP_RE)
101
102
  QUOTED_RE = /(\\"|[^"])*/.freeze
103
+ Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
102
104
  REPLACE_RE = /\\(.)/.freeze
105
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
103
106
  REPLACE_WITH = '\1'.freeze
107
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
104
108
 
105
109
  # Parse the output format that PostgreSQL uses for hstore
106
110
  # columns. Note that this does not attempt to parse all
@@ -114,17 +118,17 @@ module Sequel
114
118
  return @result if @result
115
119
  hash = {}
116
120
  while !eos?
117
- skip(QUOTE_RE)
121
+ skip(/"/)
118
122
  k = parse_quoted
119
- skip(KV_SEP_RE)
120
- if skip(QUOTE_RE)
123
+ skip(/"\s*=>\s*/)
124
+ if skip(/"/)
121
125
  v = parse_quoted
122
- skip(QUOTE_RE)
126
+ skip(/"/)
123
127
  else
124
- scan(NULL_RE)
128
+ scan(/NULL/)
125
129
  v = nil
126
130
  end
127
- skip(SEP_RE)
131
+ skip(/,\s*/)
128
132
  hash[k] = v
129
133
  end
130
134
  @result = hash
@@ -134,7 +138,7 @@ module Sequel
134
138
 
135
139
  # Parse and unescape a quoted key/value.
136
140
  def parse_quoted
137
- scan(QUOTED_RE).gsub(REPLACE_RE, REPLACE_WITH)
141
+ scan(/(\\"|[^"])*/).gsub(/\\(.)/, '\1')
138
142
  end
139
143
  end
140
144
 
@@ -158,6 +162,13 @@ module Sequel
158
162
  end
159
163
  end
160
164
 
165
+ # SEQUEL5: Remove
166
+ def reset_conversion_procs
167
+ procs = super
168
+ add_named_conversion_proc(:hstore, &HStore.method(:parse))
169
+ procs
170
+ end
171
+
161
172
  private
162
173
 
163
174
  # Recognize the hstore database type.
@@ -188,12 +199,19 @@ module Sequel
188
199
  DEFAULT_PROC = lambda{|h, k| h[k.to_s] unless k.is_a?(String)}
189
200
 
190
201
  QUOTE = '"'.freeze
202
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE)
191
203
  COMMA = ",".freeze
204
+ Sequel::Deprecation.deprecate_constant(self, :COMMA)
192
205
  KV_SEP = "=>".freeze
206
+ Sequel::Deprecation.deprecate_constant(self, :KV_SEP)
193
207
  NULL = "NULL".freeze
208
+ Sequel::Deprecation.deprecate_constant(self, :NULL)
194
209
  ESCAPE_RE = /("|\\)/.freeze
210
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
195
211
  ESCAPE_REPLACE = '\\\\\1'.freeze
212
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
196
213
  HSTORE_CAST = '::hstore'.freeze
214
+ Sequel::Deprecation.deprecate_constant(self, :HSTORE_CAST)
197
215
 
198
216
  if RUBY_VERSION >= '1.9'
199
217
  # Undef 1.9 marshal_{dump,load} methods in the delegate class,
@@ -258,7 +276,7 @@ module Sequel
258
276
  # Append a literalize version of the hstore to the sql.
259
277
  def sql_literal_append(ds, sql)
260
278
  ds.literal_append(sql, unquoted_literal)
261
- sql << HSTORE_CAST
279
+ sql << '::hstore'
262
280
  end
263
281
 
264
282
  # Return a string containing the unquoted, unstring-escaped
@@ -267,10 +285,10 @@ module Sequel
267
285
  def unquoted_literal
268
286
  str = String.new
269
287
  comma = false
270
- commas = COMMA
271
- quote = QUOTE
272
- kv_sep = KV_SEP
273
- null = NULL
288
+ commas = ","
289
+ quote = '"'
290
+ kv_sep = "=>"
291
+ null = "NULL"
274
292
  each do |k, v|
275
293
  str << commas if comma
276
294
  str << quote << escape_value(k) << quote
@@ -303,7 +321,7 @@ module Sequel
303
321
  # Escape key/value strings when literalizing to
304
322
  # correctly handle backslash and quote characters.
305
323
  def escape_value(k)
306
- k.to_s.gsub(ESCAPE_RE, ESCAPE_REPLACE)
324
+ k.to_s.gsub(/("|\\)/, '\\\\\1')
307
325
  end
308
326
  end
309
327
  end
@@ -29,7 +29,7 @@
29
29
  # Related module: Sequel::Postgres::InetDatabaseMethods
30
30
 
31
31
  require 'ipaddr'
32
- Sequel.require 'adapters/utils/pg_types'
32
+ Sequel.require 'adapters/shared/postgres'
33
33
 
34
34
  module Sequel
35
35
  module Postgres
@@ -41,7 +41,14 @@ module Sequel
41
41
  def self.extended(db)
42
42
  db.instance_eval do
43
43
  extend_datasets(InetDatasetMethods)
44
- copy_conversion_procs([869, 650, 1041, 651, 1040])
44
+ meth = IPAddr.method(:new)
45
+ add_conversion_proc(869, meth)
46
+ add_conversion_proc(650, meth)
47
+ if respond_to?(:register_array_type)
48
+ register_array_type('inet', :oid=>1041, :scalar_oid=>869)
49
+ register_array_type('cidr', :oid=>651, :scalar_oid=>650)
50
+ register_array_type('macaddr', :oid=>1040)
51
+ end
45
52
  @schema_type_classes[:ipaddr] = IPAddr
46
53
  end
47
54
  end
@@ -106,11 +113,16 @@ module Sequel
106
113
  end
107
114
  end
108
115
 
109
- PG_TYPES[869] = PG_TYPES[650] = IPAddr.method(:new)
116
+ # SEQUEL5: Remove
117
+ meth = IPAddr.method(:new)
118
+ PG__TYPES[869] = PG__TYPES[650] = lambda do |s|
119
+ Sequel::Deprecation.deprecate("Conversion proc for inet/cidr added globally by pg_inet extension", "Load the pg_inet extension into the Database instance")
120
+ IPAddr.new(s)
121
+ end
110
122
  if defined?(PGArray) && PGArray.respond_to?(:register)
111
- PGArray.register('inet', :oid=>1041, :scalar_oid=>869)
112
- PGArray.register('cidr', :oid=>651, :scalar_oid=>650)
113
- PGArray.register('macaddr', :oid=>1040)
123
+ PGArray.register('inet', :oid=>1041, :scalar_oid=>869, :skip_deprecation_warning=>true)
124
+ PGArray.register('cidr', :oid=>651, :scalar_oid=>650, :skip_deprecation_warning=>true)
125
+ PGArray.register('macaddr', :oid=>1040, :skip_deprecation_warning=>true)
114
126
  end
115
127
  end
116
128
 
@@ -10,10 +10,7 @@
10
10
  # ActiveSupport::Duration that use the standard Sequel literalization
11
11
  # callbacks, so they work on all adapters.
12
12
  #
13
- # If you would like to use interval columns in your model objects, you
14
- # probably want to modify the typecasting so that it
15
- # recognizes and correctly handles the interval columns, which you can
16
- # do by:
13
+ # To use this extension, load it into the Database instance:
17
14
  #
18
15
  # DB.extension :pg_interval
19
16
  #
@@ -36,12 +33,13 @@
36
33
  # Related module: Sequel::Postgres::IntervalDatabaseMethods
37
34
 
38
35
  require 'active_support/duration'
39
- Sequel.require 'adapters/utils/pg_types'
36
+ Sequel.require 'adapters/shared/postgres'
40
37
 
41
38
  module Sequel
42
39
  module Postgres
43
40
  module IntervalDatabaseMethods
44
41
  EMPTY_INTERVAL = '0'.freeze
42
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_INTERVAL)
45
43
  DURATION_UNITS = [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
46
44
 
47
45
  # Return an unquoted string version of the duration object suitable for
@@ -58,7 +56,7 @@ module Sequel
58
56
  end
59
57
 
60
58
  if s.empty?
61
- EMPTY_INTERVAL
59
+ '0'
62
60
  else
63
61
  s
64
62
  end
@@ -67,11 +65,12 @@ module Sequel
67
65
  # Creates callable objects that convert strings into ActiveSupport::Duration instances.
68
66
  class Parser
69
67
  # Regexp that parses the full range of PostgreSQL interval type output.
70
- PARSER = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/o
68
+ PARSER = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/
69
+ Sequel::Deprecation.deprecate_constant(self, :PARSER)
71
70
 
72
71
  # Parse the interval input string into an ActiveSupport::Duration instance.
73
72
  def call(string)
74
- raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = PARSER.match(string)
73
+ raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string)
75
74
 
76
75
  value = 0
77
76
  parts = []
@@ -124,7 +123,10 @@ module Sequel
124
123
  def self.extended(db)
125
124
  db.instance_eval do
126
125
  extend_datasets(IntervalDatasetMethods)
127
- copy_conversion_procs([1186, 1187])
126
+ add_conversion_proc(1186, Postgres::IntervalDatabaseMethods::PARSER)
127
+ if respond_to?(:register_array_type)
128
+ register_array_type('interval', :oid=>1187, :scalar_oid=>1186)
129
+ end
128
130
  @schema_type_classes[:interval] = ActiveSupport::Duration
129
131
  end
130
132
  end
@@ -174,6 +176,7 @@ module Sequel
174
176
 
175
177
  module IntervalDatasetMethods
176
178
  CAST_INTERVAL = '::interval'.freeze
179
+ Sequel::Deprecation.deprecate_constant(self, :CAST_INTERVAL)
177
180
 
178
181
  # Handle literalization of ActiveSupport::Duration objects, treating them as
179
182
  # PostgreSQL intervals.
@@ -181,16 +184,20 @@ module Sequel
181
184
  case v
182
185
  when ActiveSupport::Duration
183
186
  literal_append(sql, IntervalDatabaseMethods.literal_duration(v))
184
- sql << CAST_INTERVAL
187
+ sql << '::interval'
185
188
  else
186
189
  super
187
190
  end
188
191
  end
189
192
  end
190
193
 
191
- PG_TYPES[1186] = Postgres::IntervalDatabaseMethods::PARSER
194
+ # SEQUEL5: Remove
195
+ PG__TYPES[1186] = lambda do |s|
196
+ Sequel::Deprecation.deprecate("Conversion proc for interval added globally by pg_interval extension", "Load the pg_interval extension into the Database instance")
197
+ Postgres::IntervalDatabaseMethods::PARSER.call(s)
198
+ end
192
199
  if defined?(PGArray) && PGArray.respond_to?(:register)
193
- PGArray.register('interval', :oid=>1187, :scalar_oid=>1186)
200
+ PGArray.register('interval', :oid=>1187, :scalar_oid=>1186, :skip_deprecation_warning=>true)
194
201
  end
195
202
  end
196
203
 
@@ -38,10 +38,7 @@
38
38
  # DB[:table].insert(:column=>Sequel.pg_json([1, 2, 3]))
39
39
  # DB[:table].insert(:column=>Sequel.pg_json({'a'=>1, 'b'=>2}))
40
40
  #
41
- # If you would like to use PostgreSQL json columns in your model
42
- # objects, you probably want to modify the schema parsing/typecasting
43
- # so that it recognizes and correctly handles the json type, which
44
- # you can do by:
41
+ # To use this extension, please load it into the Database instance:
45
42
  #
46
43
  # DB.extension :pg_json
47
44
  #
@@ -65,12 +62,14 @@
65
62
 
66
63
  require 'delegate'
67
64
  require 'json'
68
- Sequel.require 'adapters/utils/pg_types'
65
+ Sequel.require 'adapters/shared/postgres'
69
66
 
70
67
  module Sequel
71
68
  module Postgres
72
69
  CAST_JSON = '::json'.freeze
70
+ Sequel::Deprecation.deprecate_constant(self, :CAST_JSON)
73
71
  CAST_JSONB = '::jsonb'.freeze
72
+ Sequel::Deprecation.deprecate_constant(self, :CAST_JSONB)
74
73
 
75
74
  # Class representing PostgreSQL JSON/JSONB column array values.
76
75
  class JSONArrayBase < DelegateClass(Array)
@@ -88,7 +87,7 @@ module Sequel
88
87
  # Cast as json
89
88
  def sql_literal_append(ds, sql)
90
89
  super
91
- sql << CAST_JSON
90
+ sql << '::json'
92
91
  end
93
92
  end
94
93
 
@@ -96,7 +95,7 @@ module Sequel
96
95
  # Cast as jsonb
97
96
  def sql_literal_append(ds, sql)
98
97
  super
99
- sql << CAST_JSONB
98
+ sql << '::jsonb'
100
99
  end
101
100
  end
102
101
 
@@ -119,7 +118,7 @@ module Sequel
119
118
  # Cast as json
120
119
  def sql_literal_append(ds, sql)
121
120
  super
122
- sql << CAST_JSON
121
+ sql << '::json'
123
122
  end
124
123
  end
125
124
 
@@ -127,7 +126,7 @@ module Sequel
127
126
  # Cast as jsonb
128
127
  def sql_literal_append(ds, sql)
129
128
  super
130
- sql << CAST_JSONB
129
+ sql << '::jsonb'
131
130
  end
132
131
  end
133
132
 
@@ -135,7 +134,12 @@ module Sequel
135
134
  module JSONDatabaseMethods
136
135
  def self.extended(db)
137
136
  db.instance_eval do
138
- copy_conversion_procs([114, 199, 3802, 3807])
137
+ add_conversion_proc(114, JSONDatabaseMethods.method(:db_parse_json))
138
+ add_conversion_proc(3802, JSONDatabaseMethods.method(:db_parse_jsonb))
139
+ if respond_to?(:register_array_type)
140
+ register_array_type('json', :oid=>199, :scalar_oid=>114)
141
+ register_array_type('jsonb', :oid=>3807, :scalar_oid=>3802)
142
+ end
139
143
  @schema_type_classes[:json] = [JSONHash, JSONArray]
140
144
  @schema_type_classes[:jsonb] = [JSONBHash, JSONBArray]
141
145
  end
@@ -257,11 +261,18 @@ module Sequel
257
261
  end
258
262
  end
259
263
 
260
- PG_TYPES[114] = JSONDatabaseMethods.method(:db_parse_json)
261
- PG_TYPES[3802] = JSONDatabaseMethods.method(:db_parse_jsonb)
264
+ # SEQUEL5: Remove
265
+ PG__TYPES[114] = lambda do |s|
266
+ Sequel::Deprecation.deprecate("Conversion proc for json added globally by pg_json extension", "Load the pg_json extension into the Database instance")
267
+ JSONDatabaseMethods.db_parse_json(s)
268
+ end
269
+ PG__TYPES[3802] = lambda do |s|
270
+ Sequel::Deprecation.deprecate("Conversion proc for jsonb added globally by pg_json extension", "Load the pg_json extension into the Database instance")
271
+ JSONDatabaseMethods.db_parse_jsonb(s)
272
+ end
262
273
  if defined?(PGArray) && PGArray.respond_to?(:register)
263
- PGArray.register('json', :oid=>199, :scalar_oid=>114)
264
- PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802)
274
+ PGArray.register('json', :oid=>199, :scalar_oid=>114, :skip_deprecation_warning=>true)
275
+ PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802, :skip_deprecation_warning=>true)
265
276
  end
266
277
  end
267
278
 
@@ -3,7 +3,7 @@
3
3
  # The pg_json_ops extension adds support to Sequel's DSL to make
4
4
  # it easier to call PostgreSQL JSON functions and operators (added
5
5
  # first in PostgreSQL 9.3). It also supports the JSONB functions
6
- # and operators added in PostgreSQL 9.4).
6
+ # and operators added in PostgreSQL 9.4.
7
7
  #
8
8
  # To load the extension:
9
9
  #
@@ -22,7 +22,7 @@
22
22
  # jb = Sequel.pg_jsonb(:jsonb_column)
23
23
  #
24
24
  # Also, on most Sequel expression objects, you can call the pg_json
25
- # or pg_jsonb # method:
25
+ # or pg_jsonb method:
26
26
  #
27
27
  # j = Sequel[:json_column].pg_json
28
28
  # jb = Sequel[:jsonb_column].pg_jsonb
@@ -40,10 +40,7 @@
40
40
  # If you specify the range database type, Sequel will automatically cast
41
41
  # the value to that type when literalizing.
42
42
  #
43
- # If you would like to use range columns in your model objects, you
44
- # probably want to modify the schema parsing/typecasting so that it
45
- # recognizes and correctly handles the range type columns, which you can
46
- # do by:
43
+ # To use this extension, load it into the Database instance:
47
44
  #
48
45
  # DB.extension :pg_range
49
46
  #
@@ -52,11 +49,10 @@
52
49
  #
53
50
  # This extension makes it easy to add support for other range types. In
54
51
  # general, you just need to make sure that the subtype is handled and has the
55
- # appropriate converter installed in Sequel::Postgres::PG_TYPES or the Database
56
- # instance's conversion_procs usingthe appropriate type OID. For user defined
52
+ # appropriate converter installed. For user defined
57
53
  # types, you can do this via:
58
54
  #
59
- # DB.conversion_procs[subtype_oid] = lambda{|string| }
55
+ # DB.add_conversion_proc(subtype_oid){|string| }
60
56
  #
61
57
  # Then you can call
62
58
  # Sequel::Postgres::PGRange::DatabaseMethods#register_range_type
@@ -66,18 +62,6 @@
66
62
  #
67
63
  # DB.register_range_type('timerange')
68
64
  #
69
- # You can also register range types on a global basis using
70
- # Sequel::Postgres::PGRange.register. In this case, you'll have
71
- # to specify the type oids:
72
- #
73
- # Sequel::Postgres::PG_TYPES[1234] = lambda{|string| }
74
- # Sequel::Postgres::PGRange.register('foo', :oid=>4321, :subtype_oid=>1234)
75
- #
76
- # Both Sequel::Postgres::PGRange::DatabaseMethods#register_range_type
77
- # and Sequel::Postgres::PGRange.register support many options to
78
- # customize the range type handling. See the Sequel::Postgres::PGRange.register
79
- # method documentation.
80
- #
81
65
  # This extension integrates with the pg_array extension. If you plan
82
66
  # to use arrays of range types, load the pg_array extension before the
83
67
  # pg_range extension:
@@ -86,54 +70,45 @@
86
70
  #
87
71
  # Related module: Sequel::Postgres::PGRange
88
72
 
89
- Sequel.require 'adapters/utils/pg_types'
73
+ Sequel.require 'adapters/shared/postgres'
90
74
 
91
75
  module Sequel
92
76
  module Postgres
93
77
  class PGRange
94
78
  include Sequel::SQL::AliasMethods
95
79
 
96
- # Map of string database type names to type symbols (e.g. 'int4range' => :int4range),
97
- # used in the schema parsing.
80
+ # SEQUEL5: Remove
98
81
  RANGE_TYPES = {}
99
82
 
100
83
  EMPTY = 'empty'.freeze
84
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY)
101
85
  EMPTY_STRING = ''.freeze
86
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
102
87
  COMMA = ','.freeze
88
+ Sequel::Deprecation.deprecate_constant(self, :COMMA)
103
89
  QUOTED_EMPTY_STRING = '""'.freeze
90
+ Sequel::Deprecation.deprecate_constant(self, :QUOTED_EMPTY_STRING)
104
91
  OPEN_PAREN = "(".freeze
92
+ Sequel::Deprecation.deprecate_constant(self, :OPEN_PAREN)
105
93
  CLOSE_PAREN = ")".freeze
94
+ Sequel::Deprecation.deprecate_constant(self, :CLOSE_PAREN)
106
95
  OPEN_BRACKET = "[".freeze
96
+ Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACKET)
107
97
  CLOSE_BRACKET = "]".freeze
98
+ Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACKET)
108
99
  ESCAPE_RE = /("|,|\\|\[|\]|\(|\))/.freeze
100
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
109
101
  ESCAPE_REPLACE = '\\\\\1'.freeze
102
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
110
103
  CAST = '::'.freeze
104
+ Sequel::Deprecation.deprecate_constant(self, :CAST)
111
105
 
112
- # Registers a range type that the extension should handle. Makes a Database instance that
113
- # has been extended with DatabaseMethods recognize the range type given and set up the
114
- # appropriate typecasting. Also sets up automatic typecasting for the native postgres
115
- # adapter, so that on retrieval, the values are automatically converted to PGRange instances.
116
- # The db_type argument should be the name of the range type. Accepts the following options:
117
- #
118
- # :converter :: A callable object (e.g. Proc), that is called with the start or end of the range
119
- # (usually a string), and should return the appropriate typecasted object.
120
- # :oid :: The PostgreSQL OID for the range type. This is used by the Sequel postgres adapter
121
- # to set up automatic type conversion on retrieval from the database.
122
- # :subtype_oid :: Should be the PostgreSQL OID for the range's subtype. If given,
123
- # automatically sets the :converter option by looking for scalar conversion
124
- # proc.
125
- # :type_procs :: A hash mapping oids to conversion procs, used for setting the default :converter
126
- # for :subtype_oid. Defaults to the global Sequel::Postgres::PG_TYPES.
127
- # :typecast_method_map :: The map in which to place the database type string to type symbol mapping.
128
- # Defaults to RANGE_TYPES.
129
- # :typecast_methods_module :: If given, a module object to add the typecasting method to. Defaults
130
- # to DatabaseMethods.
131
- #
132
- # If a block is given, it is treated as the :converter option.
106
+ # SEQUEL5: Remove
133
107
  def self.register(db_type, opts=OPTS, &block)
108
+ Sequel::Deprecation.deprecate("Sequel::Postgres::PGRange.register", "Use Database#register_range_type on a Database instance using the pg_range extension") unless opts[:skip_deprecation_warning]
134
109
  db_type = db_type.to_s.dup.freeze
135
110
 
136
- type_procs = opts[:type_procs] || PG_TYPES
111
+ type_procs = opts[:type_procs] || PG__TYPES
137
112
  mod = opts[:typecast_methods_module] || DatabaseMethods
138
113
  typecast_method_map = opts[:typecast_method_map] || RANGE_TYPES
139
114
 
@@ -155,14 +130,19 @@ module Sequel
155
130
  define_range_typecast_method(mod, db_type, parser)
156
131
 
157
132
  if oid = opts[:oid]
133
+ if opts[:skip_deprecation_warning]
134
+ def parser.call(s)
135
+ Sequel::Deprecation.deprecate("Conversion proc for #{db_type} added globally by pg_range extension", "Load the pg_range extension into the Database instance")
136
+ super
137
+ end
138
+ end
158
139
  type_procs[oid] = parser
159
140
  end
160
141
 
161
142
  nil
162
143
  end
163
144
 
164
- # Define a private range typecasting method for the given type that uses
165
- # the parser argument to do the type conversion.
145
+ # SEQUEL5: Remove
166
146
  def self.define_range_typecast_method(mod, type, parser)
167
147
  mod.class_eval do
168
148
  meth = :"typecast_value_#{type}"
@@ -174,12 +154,12 @@ module Sequel
174
154
 
175
155
  # Creates callable objects that convert strings into PGRange instances.
176
156
  class Parser
177
- # Regexp that parses the full range of PostgreSQL range type output,
178
- # except for empty ranges.
179
- PARSER = /\A(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))\z/o
180
-
157
+ PARSER = /\A(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))\z/
158
+ Sequel::Deprecation.deprecate_constant(self, :PARSER)
181
159
  REPLACE_RE = /\\(.)/.freeze
160
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
182
161
  REPLACE_WITH = '\1'.freeze
162
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
183
163
 
184
164
  # The database range type for this parser (e.g. 'int4range'),
185
165
  # automatically setting the db_type for the returned PGRange instances.
@@ -197,11 +177,11 @@ module Sequel
197
177
 
198
178
  # Parse the range type input string into a PGRange value.
199
179
  def call(string)
200
- if string == EMPTY
180
+ if string == 'empty'
201
181
  return PGRange.empty(db_type)
202
182
  end
203
183
 
204
- raise(InvalidValue, "invalid or unhandled range format: #{string.inspect}") unless matches = PARSER.match(string)
184
+ raise(InvalidValue, "invalid or unhandled range format: #{string.inspect}") unless matches = /\A(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))\z/.match(string)
205
185
 
206
186
  exclude_begin = matches[1] == '('
207
187
  exclude_end = matches[6] == ')'
@@ -215,12 +195,12 @@ module Sequel
215
195
  # to always use the quoted output form when characters need to be escaped, so
216
196
  # there isn't a need to unescape unquoted output.
217
197
  if beg = matches[3]
218
- beg.gsub!(REPLACE_RE, REPLACE_WITH)
198
+ beg.gsub!(/\\(.)/, '\1')
219
199
  else
220
200
  beg = matches[2] unless matches[2].empty?
221
201
  end
222
202
  if en = matches[5]
223
- en.gsub!(REPLACE_RE, REPLACE_WITH)
203
+ en.gsub!(/\\(.)/, '\1')
224
204
  else
225
205
  en = matches[4] unless matches[4].empty?
226
206
  end
@@ -241,20 +221,32 @@ module Sequel
241
221
  db.instance_eval do
242
222
  @pg_range_schema_types ||= {}
243
223
  extend_datasets(DatasetMethods)
244
- copy_conversion_procs([3904, 3906, 3912, 3926, 3905, 3907, 3913, 3927])
224
+ register_range_type('int4range', :oid=>3904, :subtype_oid=>23)
225
+ register_range_type('numrange', :oid=>3906, :subtype_oid=>1700)
226
+ register_range_type('tsrange', :oid=>3908, :subtype_oid=>1114)
227
+ register_range_type('tstzrange', :oid=>3910, :subtype_oid=>1184)
228
+ register_range_type('daterange', :oid=>3912, :subtype_oid=>1082)
229
+ register_range_type('int8range', :oid=>3926, :subtype_oid=>20)
230
+ if respond_to?(:register_array_type)
231
+ register_array_type('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range)
232
+ register_array_type('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange)
233
+ register_array_type('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange)
234
+ register_array_type('tstzrange', :oid=>3911, :scalar_oid=>3910, :scalar_typecast=>:tstzrange)
235
+ register_array_type('daterange', :oid=>3913, :scalar_oid=>3912, :scalar_typecast=>:daterange)
236
+ register_array_type('int8range', :oid=>3927, :scalar_oid=>3926, :scalar_typecast=>:int8range)
237
+ end
245
238
  [:int4range, :numrange, :tsrange, :tstzrange, :daterange, :int8range].each do |v|
246
239
  @schema_type_classes[v] = PGRange
247
240
  end
248
- end
249
241
 
250
- procs = db.conversion_procs
251
- procs[3908] = Parser.new("tsrange", procs[1114])
252
- procs[3910] = Parser.new("tstzrange", procs[1184])
253
- if defined?(PGArray::Creator)
254
- procs[3909] = PGArray::Creator.new("tsrange", procs[3908])
255
- procs[3911] = PGArray::Creator.new("tstzrange", procs[3910])
242
+ procs = conversion_procs
243
+ add_conversion_proc(3908, Parser.new("tsrange", procs[1114]))
244
+ add_conversion_proc(3910, Parser.new("tstzrange", procs[1184]))
245
+ if defined?(PGArray::Creator)
246
+ add_conversion_proc(3909, PGArray::Creator.new("tsrange", procs[3908]))
247
+ add_conversion_proc(3911, PGArray::Creator.new("tstzrange", procs[3910]))
248
+ end
256
249
  end
257
-
258
250
  end
259
251
 
260
252
  # Handle Range and PGRange values in bound variables
@@ -276,20 +268,62 @@ module Sequel
276
268
  end
277
269
 
278
270
  # Register a database specific range type. This can be used to support
279
- # different range types per Database. Use of this method does not
280
- # affect global state, unlike PGRange.register. See PGRange.register for
281
- # possible options.
271
+ # different range types per Database. Options:
272
+ #
273
+ # :converter :: A callable object (e.g. Proc), that is called with the start or end of the range
274
+ # (usually a string), and should return the appropriate typecasted object.
275
+ # :oid :: The PostgreSQL OID for the range type. This is used by the Sequel postgres adapter
276
+ # to set up automatic type conversion on retrieval from the database.
277
+ # :subtype_oid :: Should be the PostgreSQL OID for the range's subtype. If given,
278
+ # automatically sets the :converter option by looking for scalar conversion
279
+ # proc.
280
+ #
281
+ # If a block is given, it is treated as the :converter option.
282
282
  def register_range_type(db_type, opts=OPTS, &block)
283
- opts = {:type_procs=>conversion_procs, :typecast_method_map=>@pg_range_schema_types, :typecast_methods_module=>(class << self; self; end)}.merge!(opts)
284
- unless (opts.has_key?(:subtype_oid) || block) && opts.has_key?(:oid)
283
+ oid = opts[:oid]
284
+ soid = opts[:subtype_oid]
285
+
286
+ if has_converter = opts.has_key?(:converter)
287
+ raise Error, "can't provide both a block and :converter option to register_range_type" if block
288
+ converter = opts[:converter]
289
+ else
290
+ has_converter = true if block
291
+ converter = block
292
+ end
293
+
294
+ unless (soid || has_converter) && oid
285
295
  range_oid, subtype_oid = from(:pg_range).join(:pg_type, :oid=>:rngtypid).where(:typname=>db_type.to_s).get([:rngtypid, :rngsubtype])
286
- opts[:subtype_oid] = subtype_oid unless opts.has_key?(:subtype_oid) || block
287
- opts[:oid] = range_oid unless opts.has_key?(:oid)
296
+ soid ||= subtype_oid unless has_converter
297
+ oid ||= range_oid
298
+ end
299
+
300
+ db_type = db_type.to_s.dup.freeze
301
+
302
+ if converter = opts[:converter]
303
+ raise Error, "can't provide both a block and :converter option to register" if block
304
+ else
305
+ converter = block
306
+ end
307
+
308
+ if soid
309
+ raise Error, "can't provide both a converter and :subtype_oid option to register" if has_converter
310
+ raise Error, "no conversion proc for :subtype_oid=>#{soid.inspect} in conversion_procs" unless converter = conversion_procs[soid]
311
+ end
312
+
313
+ parser = Parser.new(db_type, converter)
314
+ add_conversion_proc(oid, parser)
315
+
316
+ @pg_range_schema_types[db_type] = db_type.to_sym
317
+
318
+ (class << self; self end).class_eval do
319
+ meth = :"typecast_value_#{db_type}"
320
+ define_method(meth){|v| typecast_value_pg_range(v, parser)}
321
+ private meth
288
322
  end
289
323
 
290
- PGRange.register(db_type, opts, &block)
291
324
  @schema_type_classes[:"#{opts[:type_symbol] || db_type}"] = PGRange
292
- conversion_procs_updated
325
+ conversion_procs_updated # SEQUEL5: Remove
326
+ nil
293
327
  end
294
328
 
295
329
  private
@@ -304,9 +338,7 @@ module Sequel
304
338
  end
305
339
  end
306
340
 
307
- # Manually override the typecasting for tsrange and tstzrange types so that
308
- # they use the database's timezone instead of the global Sequel
309
- # timezone.
341
+ # SEQUEL5: Remove
310
342
  def get_conversion_procs
311
343
  procs = super
312
344
 
@@ -322,7 +354,7 @@ module Sequel
322
354
 
323
355
  # Recognize the registered database range types.
324
356
  def schema_column_type(db_type)
325
- if type = @pg_range_schema_types[db_type] || RANGE_TYPES[db_type]
357
+ if type = @pg_range_schema_types[db_type] || RANGE_TYPES[db_type] # SEQUEL5: Remove || RANGE_TYPES[db_type]
326
358
  type
327
359
  else
328
360
  super
@@ -490,17 +522,17 @@ module Sequel
490
522
  # Append a literalize version of the receiver to the sql.
491
523
  def sql_literal_append(ds, sql)
492
524
  if (s = @db_type) && !empty?
493
- sql << s.to_s << OPEN_PAREN
525
+ sql << s.to_s << "("
494
526
  ds.literal_append(sql, self.begin)
495
- sql << COMMA
527
+ sql << ','
496
528
  ds.literal_append(sql, self.end)
497
- sql << COMMA
498
- ds.literal_append(sql, "#{exclude_begin? ? OPEN_PAREN : OPEN_BRACKET}#{exclude_end? ? CLOSE_PAREN : CLOSE_BRACKET}")
499
- sql << CLOSE_PAREN
529
+ sql << ','
530
+ ds.literal_append(sql, "#{exclude_begin? ? "(" : "["}#{exclude_end? ? ")" : "]"}")
531
+ sql << ")"
500
532
  else
501
533
  ds.literal_append(sql, unquoted_literal(ds))
502
534
  if s
503
- sql << CAST << s.to_s
535
+ sql << '::' << s.to_s
504
536
  end
505
537
  end
506
538
  end
@@ -536,9 +568,9 @@ module Sequel
536
568
  # Separated out for use by the bound argument code.
537
569
  def unquoted_literal(ds)
538
570
  if empty?
539
- EMPTY
571
+ 'empty'
540
572
  else
541
- "#{exclude_begin? ? OPEN_PAREN : OPEN_BRACKET}#{escape_value(self.begin, ds)},#{escape_value(self.end, ds)}#{exclude_end? ? CLOSE_PAREN : CLOSE_BRACKET}"
573
+ "#{exclude_begin? ? "(" : "["}#{escape_value(self.begin, ds)},#{escape_value(self.end, ds)}#{exclude_end? ? ")" : "]"}"
542
574
  end
543
575
  end
544
576
 
@@ -549,7 +581,7 @@ module Sequel
549
581
  def escape_value(k, ds)
550
582
  case k
551
583
  when nil
552
- EMPTY_STRING
584
+ ''
553
585
  when Date, Time
554
586
  ds.literal(k)[1...-1]
555
587
  when Integer, Float
@@ -560,29 +592,30 @@ module Sequel
560
592
  k
561
593
  when String
562
594
  if k.empty?
563
- QUOTED_EMPTY_STRING
595
+ '""'
564
596
  else
565
- k.gsub(ESCAPE_RE, ESCAPE_REPLACE)
597
+ k.gsub(/("|,|\\|\[|\]|\(|\))/, '\\\\\1')
566
598
  end
567
599
  else
568
- ds.literal(k).gsub(ESCAPE_RE, ESCAPE_REPLACE)
600
+ ds.literal(k).gsub(/("|,|\\|\[|\]|\(|\))/, '\\\\\1')
569
601
  end
570
602
  end
571
603
  end
572
604
 
573
- PGRange.register('int4range', :oid=>3904, :subtype_oid=>23)
574
- PGRange.register('numrange', :oid=>3906, :subtype_oid=>1700)
575
- PGRange.register('tsrange', :oid=>3908, :subtype_oid=>1114)
576
- PGRange.register('tstzrange', :oid=>3910, :subtype_oid=>1184)
577
- PGRange.register('daterange', :oid=>3912, :subtype_oid=>1082)
578
- PGRange.register('int8range', :oid=>3926, :subtype_oid=>20)
605
+ # SEQUEL5: Remove
606
+ PGRange.register('int4range', :oid=>3904, :subtype_oid=>23, :skip_deprecation_warning=>true)
607
+ PGRange.register('numrange', :oid=>3906, :subtype_oid=>1700, :skip_deprecation_warning=>true)
608
+ PGRange.register('tsrange', :oid=>3908, :subtype_oid=>1114, :skip_deprecation_warning=>true)
609
+ PGRange.register('tstzrange', :oid=>3910, :subtype_oid=>1184, :skip_deprecation_warning=>true)
610
+ PGRange.register('daterange', :oid=>3912, :subtype_oid=>1082, :skip_deprecation_warning=>true)
611
+ PGRange.register('int8range', :oid=>3926, :subtype_oid=>20, :skip_deprecation_warning=>true)
579
612
  if defined?(PGArray) && PGArray.respond_to?(:register)
580
- PGArray.register('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range)
581
- PGArray.register('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange)
582
- PGArray.register('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange)
583
- PGArray.register('tstzrange', :oid=>3911, :scalar_oid=>3910, :scalar_typecast=>:tstzrange)
584
- PGArray.register('daterange', :oid=>3913, :scalar_oid=>3912, :scalar_typecast=>:daterange)
585
- PGArray.register('int8range', :oid=>3927, :scalar_oid=>3926, :scalar_typecast=>:int8range)
613
+ PGArray.register('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range, :skip_deprecation_warning=>true)
614
+ PGArray.register('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange, :skip_deprecation_warning=>true)
615
+ PGArray.register('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange, :skip_deprecation_warning=>true)
616
+ PGArray.register('tstzrange', :oid=>3911, :scalar_oid=>3910, :scalar_typecast=>:tstzrange, :skip_deprecation_warning=>true)
617
+ PGArray.register('daterange', :oid=>3913, :scalar_oid=>3912, :scalar_typecast=>:daterange, :skip_deprecation_warning=>true)
618
+ PGArray.register('int8range', :oid=>3927, :scalar_oid=>3926, :scalar_typecast=>:int8range, :skip_deprecation_warning=>true)
586
619
  end
587
620
  end
588
621