sequel 5.32.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +84 -0
- data/README.rdoc +1 -1
- data/doc/association_basics.rdoc +7 -2
- data/doc/dataset_filtering.rdoc +2 -2
- data/doc/model_plugins.rdoc +1 -1
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +2 -1
- data/lib/sequel/adapters/shared/mssql.rb +14 -4
- data/lib/sequel/adapters/shared/oracle.rb +12 -6
- data/lib/sequel/adapters/shared/postgres.rb +39 -1
- data/lib/sequel/adapters/shared/sqlite.rb +13 -3
- data/lib/sequel/adapters/tinytds.rb +1 -0
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +10 -10
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +1 -1
- data/lib/sequel/core.rb +5 -6
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/misc.rb +16 -10
- data/lib/sequel/database/query.rb +2 -0
- data/lib/sequel/database/schema_generator.rb +0 -1
- data/lib/sequel/database/schema_methods.rb +15 -16
- data/lib/sequel/database/transactions.rb +8 -5
- data/lib/sequel/dataset/actions.rb +10 -6
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/query.rb +5 -4
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/migration.rb +8 -2
- data/lib/sequel/extensions/pg_array_ops.rb +4 -0
- data/lib/sequel/extensions/pg_enum.rb +2 -0
- data/lib/sequel/extensions/pg_extended_date_support.rb +1 -1
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +2 -0
- data/lib/sequel/extensions/pg_json_ops.rb +46 -2
- data/lib/sequel/extensions/pg_range.rb +3 -7
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +0 -1
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +1 -1
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +3 -3
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +54 -25
- data/lib/sequel/model/base.rb +13 -5
- data/lib/sequel/model/plugins.rb +3 -3
- data/lib/sequel/plugins/association_pks.rb +60 -18
- data/lib/sequel/plugins/association_proxies.rb +1 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/class_table_inheritance.rb +3 -3
- data/lib/sequel/plugins/csv_serializer.rb +2 -0
- data/lib/sequel/plugins/dirty.rb +45 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +2 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/pg_array_associations.rb +2 -3
- data/lib/sequel/plugins/prepared_statements.rb +5 -11
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +10 -16
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/version.rb +1 -1
- metadata +13 -2
@@ -114,10 +114,8 @@ module Sequel
|
|
114
114
|
prepared_sql << sql
|
115
115
|
prepared_sql << "$#{prepared_args[i]}"
|
116
116
|
end
|
117
|
-
|
118
|
-
|
119
|
-
prepared_sql << final_sql
|
120
|
-
end
|
117
|
+
frags << final_sql
|
118
|
+
prepared_sql << final_sql
|
121
119
|
|
122
120
|
[prepared_sql, frags]
|
123
121
|
end
|
@@ -213,9 +211,7 @@ module Sequel
|
|
213
211
|
end
|
214
212
|
ds.literal_append(s, v)
|
215
213
|
end
|
216
|
-
|
217
|
-
s << sql
|
218
|
-
end
|
214
|
+
s << @final_sql
|
219
215
|
s
|
220
216
|
end
|
221
217
|
end
|
data/lib/sequel/dataset/query.rb
CHANGED
@@ -81,7 +81,7 @@ module Sequel
|
|
81
81
|
# If the options changed include options in COLUMN_CHANGE_OPTS, the cached
|
82
82
|
# columns are deleted. This method should generally not be called
|
83
83
|
# directly by user code.
|
84
|
-
def clone(opts = (return self
|
84
|
+
def clone(opts = nil || (return self))
|
85
85
|
# return self used above because clone is called by almost all
|
86
86
|
# other query methods, and it is the fastest approach
|
87
87
|
c = super(:freeze=>false)
|
@@ -330,16 +330,17 @@ module Sequel
|
|
330
330
|
# # SELECT * FROM a WHERE ((a LIKE '%foo%' ESCAPE '\') AND (b LIKE '%foo%' ESCAPE '\')
|
331
331
|
# # AND (a LIKE '%bar%' ESCAPE '\') AND (b LIKE '%bar%' ESCAPE '\'))
|
332
332
|
def grep(columns, patterns, opts=OPTS)
|
333
|
+
column_op = opts[:all_columns] ? :AND : :OR
|
333
334
|
if opts[:all_patterns]
|
334
335
|
conds = Array(patterns).map do |pat|
|
335
|
-
SQL::BooleanExpression.new(
|
336
|
+
SQL::BooleanExpression.new(column_op, *Array(columns).map{|c| SQL::StringExpression.like(c, pat, opts)})
|
336
337
|
end
|
337
|
-
where(SQL::BooleanExpression.new(
|
338
|
+
where(SQL::BooleanExpression.new(:AND, *conds))
|
338
339
|
else
|
339
340
|
conds = Array(columns).map do |c|
|
340
341
|
SQL::BooleanExpression.new(:OR, *Array(patterns).map{|pat| SQL::StringExpression.like(c, pat, opts)})
|
341
342
|
end
|
342
|
-
where(SQL::BooleanExpression.new(
|
343
|
+
where(SQL::BooleanExpression.new(column_op, *conds))
|
343
344
|
end
|
344
345
|
end
|
345
346
|
|
data/lib/sequel/deprecated.rb
CHANGED
@@ -39,7 +39,7 @@ module Sequel
|
|
39
39
|
# Print the message and possibly backtrace to the output.
|
40
40
|
def self.deprecate(method, instead=nil)
|
41
41
|
return unless output
|
42
|
-
message = instead ? "#{method} is deprecated and will be removed in Sequel
|
42
|
+
message = instead ? "#{method} is deprecated and will be removed in Sequel 6. #{instead}." : method
|
43
43
|
message = "#{prefix}#{message}" if prefix
|
44
44
|
output.puts(message)
|
45
45
|
case b = backtrace_filter
|
@@ -60,7 +60,9 @@ module Sequel
|
|
60
60
|
# If using ruby 2.3+, use Module#deprecate_constant to deprecate the constant,
|
61
61
|
# otherwise do nothing as the ruby implementation does not support constant deprecation.
|
62
62
|
def self.deprecate_constant(mod, constant)
|
63
|
+
# :nocov:
|
63
64
|
if RUBY_VERSION > '2.3'
|
65
|
+
# :nocov:
|
64
66
|
mod.deprecate_constant(constant)
|
65
67
|
end
|
66
68
|
end
|
data/lib/sequel/exceptions.rb
CHANGED
@@ -75,8 +75,7 @@ module Sequel
|
|
75
75
|
when SQL::Identifier
|
76
76
|
c.value.to_sym
|
77
77
|
when SQL::QualifiedIdentifier
|
78
|
-
|
79
|
-
col.is_a?(SQL::Identifier) ? col.value.to_sym : col.to_sym
|
78
|
+
c.column.to_sym
|
80
79
|
when SQL::AliasedExpression
|
81
80
|
a = c.alias
|
82
81
|
a.is_a?(SQL::Identifier) ? a.value.to_sym : a.to_sym
|
@@ -39,7 +39,9 @@
|
|
39
39
|
|
40
40
|
module Sequel
|
41
41
|
module DuplicateColumnsHandler
|
42
|
+
# :nocov:
|
42
43
|
CALLER_ARGS = (RUBY_VERSION >= '2.0' ? [0,1] : [0]).freeze
|
44
|
+
# :nocov:
|
43
45
|
|
44
46
|
# Customize handling of duplicate columns for this dataset.
|
45
47
|
def on_duplicate_columns(handler = (raise Error, "Must provide either an argument or a block to on_duplicate_columns" unless block_given?; nil), &block)
|
@@ -68,6 +68,7 @@ module Sequel
|
|
68
68
|
# Allow calling private methods for backwards compatibility
|
69
69
|
@db.send(method_sym, *args, &block)
|
70
70
|
end
|
71
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
71
72
|
|
72
73
|
# This object responds to all methods the database responds to.
|
73
74
|
def respond_to_missing?(meth, include_private)
|
@@ -329,7 +330,8 @@ module Sequel
|
|
329
330
|
# schema_migrations for timestamped migrations). in the database to keep track
|
330
331
|
# of the current migration version. If no migration version is stored in the
|
331
332
|
# database, the version is considered to be 0. If no target version is
|
332
|
-
# specified, the
|
333
|
+
# specified, or the target version specified is greater than the latest
|
334
|
+
# version available, the database is migrated to the latest version available in the
|
333
335
|
# migration directory.
|
334
336
|
#
|
335
337
|
# For example, to migrate the database to the latest version:
|
@@ -518,7 +520,6 @@ module Sequel
|
|
518
520
|
def initialize(db, directory, opts=OPTS)
|
519
521
|
super
|
520
522
|
@current = opts[:current] || current_migration_version
|
521
|
-
raise(Error, "No current version available") unless current
|
522
523
|
|
523
524
|
latest_version = latest_migration_version
|
524
525
|
@target = if opts[:target]
|
@@ -538,6 +539,11 @@ module Sequel
|
|
538
539
|
end
|
539
540
|
|
540
541
|
@direction = current < target ? :up : :down
|
542
|
+
|
543
|
+
if @direction == :down && @current >= @files.length
|
544
|
+
raise Migrator::Error, "Missing migration version(s) needed to migrate down to target version (current: #{current}, target: #{target})"
|
545
|
+
end
|
546
|
+
|
541
547
|
@migrations = get_migrations
|
542
548
|
end
|
543
549
|
|
@@ -157,7 +157,9 @@ module Sequel
|
|
157
157
|
else
|
158
158
|
Sequel.function(:hstore, self, wrap_array(arg))
|
159
159
|
end
|
160
|
+
# :nocov:
|
160
161
|
if Sequel.respond_to?(:hstore_op)
|
162
|
+
# :nocov:
|
161
163
|
v = Sequel.hstore_op(v)
|
162
164
|
end
|
163
165
|
v
|
@@ -283,7 +285,9 @@ module Sequel
|
|
283
285
|
end
|
284
286
|
end
|
285
287
|
|
288
|
+
# :nocov:
|
286
289
|
if defined?(PGArray)
|
290
|
+
# :nocov:
|
287
291
|
class PGArray
|
288
292
|
# Wrap the PGArray instance in an ArrayOp, allowing you to easily use
|
289
293
|
# the PostgreSQL array functions and operators with literal arrays.
|
@@ -189,7 +189,7 @@ module Sequel
|
|
189
189
|
if date < DATETIME_YEAR_1
|
190
190
|
date <<= ((date.year) * 24 - 12)
|
191
191
|
date = db.from_application_timestamp(date)
|
192
|
-
minutes = (date.
|
192
|
+
minutes = (date.offset * 1440).to_i
|
193
193
|
date.strftime("'%Y-%m-%d %H:%M:%S.%N#{format_timestamp_offset(*minutes.divmod(60))} BC'")
|
194
194
|
else
|
195
195
|
super
|
@@ -41,7 +41,9 @@ module Sequel
|
|
41
41
|
db.instance_exec do
|
42
42
|
extend_datasets(InetDatasetMethods)
|
43
43
|
|
44
|
+
# :nocov:
|
44
45
|
if !defined?(SEQUEL_PG_VERSION_INTEGER) || SEQUEL_PG_VERSION_INTEGER >= 11300
|
46
|
+
# :nocov:
|
45
47
|
# sequel_pg 1.13.0+ will use inet/cidr conversion procs, but doing so is
|
46
48
|
# slower, so don't add the conversion procs if using sequel_pg 1.13.0+.
|
47
49
|
meth = IPAddr.method(:new)
|
@@ -73,7 +73,10 @@
|
|
73
73
|
# j.pretty # jsonb_pretty(jsonb_column)
|
74
74
|
# j.set(%w'0 a', :h) # jsonb_set(jsonb_column, ARRAY['0','a'], h, true)
|
75
75
|
#
|
76
|
-
#
|
76
|
+
# j.set_lax(%w'0 a', :h, false, 'raise_exception')
|
77
|
+
# # jsonb_set_lax(jsonb_column, ARRAY['0','a'], h, false, 'raise_exception')
|
78
|
+
#
|
79
|
+
# On PostgreSQL 12+ SQL/JSON path functions and operators are supported:
|
77
80
|
#
|
78
81
|
# j.path_exists('$.foo') # (jsonb_column @? '$.foo')
|
79
82
|
# j.path_match('$.foo') # (jsonb_column @@ '$.foo')
|
@@ -84,7 +87,15 @@
|
|
84
87
|
# j.path_query_array('$.foo') # jsonb_path_query_array(jsonb_column, '$.foo')
|
85
88
|
# j.path_query_first('$.foo') # jsonb_path_query_first(jsonb_column, '$.foo')
|
86
89
|
#
|
87
|
-
#
|
90
|
+
# On PostgreSQL 13+ timezone-aware SQL/JSON path functions and operators are supported:
|
91
|
+
#
|
92
|
+
# j.path_exists_tz!('$.foo') # jsonb_path_exists_tz(jsonb_column, '$.foo')
|
93
|
+
# j.path_match_tz!('$.foo') # jsonb_path_match_tz(jsonb_column, '$.foo')
|
94
|
+
# j.path_query_tz('$.foo') # jsonb_path_query_tz(jsonb_column, '$.foo')
|
95
|
+
# j.path_query_array_tz('$.foo') # jsonb_path_query_array_tz(jsonb_column, '$.foo')
|
96
|
+
# j.path_query_first_tz('$.foo') # jsonb_path_query_first_tz(jsonb_column, '$.foo')
|
97
|
+
#
|
98
|
+
# For the PostgreSQL 12+ SQL/JSON path functions, one argument is required (+path+) and
|
88
99
|
# two more arguments are optional (+vars+ and +silent+). +path+ specifies the JSON path.
|
89
100
|
# +vars+ specifies a hash or a string in JSON format of named variables to be
|
90
101
|
# substituted in +path+. +silent+ specifies whether errors are suppressed. By default,
|
@@ -402,6 +413,11 @@ module Sequel
|
|
402
413
|
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists, path, vars, silent))
|
403
414
|
end
|
404
415
|
|
416
|
+
# The same as #path_exists!, except that timezone-aware conversions are used for date/time values.
|
417
|
+
def path_exists_tz!(path, vars=nil, silent=nil)
|
418
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists_tz, path, vars, silent))
|
419
|
+
end
|
420
|
+
|
405
421
|
# Returns the first item of the result of JSON path predicate check for the json object.
|
406
422
|
# Returns nil if the first item is not true or false.
|
407
423
|
#
|
@@ -425,6 +441,11 @@ module Sequel
|
|
425
441
|
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match, path, vars, silent))
|
426
442
|
end
|
427
443
|
|
444
|
+
# The same as #path_match!, except that timezone-aware conversions are used for date/time values.
|
445
|
+
def path_match_tz!(path, vars=nil, silent=nil)
|
446
|
+
Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match_tz, path, vars, silent))
|
447
|
+
end
|
448
|
+
|
428
449
|
# Returns a set of all jsonb values specified by the JSON path
|
429
450
|
# for the json object.
|
430
451
|
#
|
@@ -440,6 +461,11 @@ module Sequel
|
|
440
461
|
_path_function(:jsonb_path_query, path, vars, silent)
|
441
462
|
end
|
442
463
|
|
464
|
+
# The same as #path_query, except that timezone-aware conversions are used for date/time values.
|
465
|
+
def path_query_tz(path, vars=nil, silent=nil)
|
466
|
+
_path_function(:jsonb_path_query_tz, path, vars, silent)
|
467
|
+
end
|
468
|
+
|
443
469
|
# Returns a jsonb array of all values specified by the JSON path
|
444
470
|
# for the json object.
|
445
471
|
#
|
@@ -455,6 +481,11 @@ module Sequel
|
|
455
481
|
JSONBOp.new(_path_function(:jsonb_path_query_array, path, vars, silent))
|
456
482
|
end
|
457
483
|
|
484
|
+
# The same as #path_query_array, except that timezone-aware conversions are used for date/time values.
|
485
|
+
def path_query_array_tz(path, vars=nil, silent=nil)
|
486
|
+
JSONBOp.new(_path_function(:jsonb_path_query_array_tz, path, vars, silent))
|
487
|
+
end
|
488
|
+
|
458
489
|
# Returns the first item of the result specified by the JSON path
|
459
490
|
# for the json object.
|
460
491
|
#
|
@@ -470,6 +501,11 @@ module Sequel
|
|
470
501
|
JSONBOp.new(_path_function(:jsonb_path_query_first, path, vars, silent))
|
471
502
|
end
|
472
503
|
|
504
|
+
# The same as #path_query_first, except that timezone-aware conversions are used for date/time values.
|
505
|
+
def path_query_first_tz(path, vars=nil, silent=nil)
|
506
|
+
JSONBOp.new(_path_function(:jsonb_path_query_first_tz, path, vars, silent))
|
507
|
+
end
|
508
|
+
|
473
509
|
# Return the receiver, since it is already a JSONBOp.
|
474
510
|
def pg_jsonb
|
475
511
|
self
|
@@ -492,6 +528,12 @@ module Sequel
|
|
492
528
|
self.class.new(function(:set, wrap_input_array(path), wrap_input_jsonb(other), create_missing))
|
493
529
|
end
|
494
530
|
|
531
|
+
# The same as #set, except if +other+ is +nil+, then behaves according to +null_value_treatment+,
|
532
|
+
# which can be one of 'raise_exception', 'use_json_null' (default), 'delete_key', or 'return_target'.
|
533
|
+
def set_lax(path, other, create_missing=true, null_value_treatment='use_json_null')
|
534
|
+
self.class.new(function(:set_lax, wrap_input_array(path), wrap_input_jsonb(other), create_missing, null_value_treatment))
|
535
|
+
end
|
536
|
+
|
495
537
|
private
|
496
538
|
|
497
539
|
# Internals of the jsonb SQL/JSON path functions.
|
@@ -554,7 +596,9 @@ module Sequel
|
|
554
596
|
end
|
555
597
|
end
|
556
598
|
|
599
|
+
# :nocov:
|
557
600
|
if defined?(JSONArray)
|
601
|
+
# :nocov:
|
558
602
|
class JSONArray
|
559
603
|
# Wrap the JSONArray instance in an JSONOp, allowing you to easily use
|
560
604
|
# the PostgreSQL json functions and operators with literal jsons.
|
@@ -158,7 +158,7 @@ module Sequel
|
|
158
158
|
procs = conversion_procs
|
159
159
|
add_conversion_proc(3908, Parser.new("tsrange", procs[1114]))
|
160
160
|
add_conversion_proc(3910, Parser.new("tstzrange", procs[1184]))
|
161
|
-
if defined?(PGArray::Creator)
|
161
|
+
if respond_to?(:register_array_type) && defined?(PGArray::Creator)
|
162
162
|
add_conversion_proc(3909, PGArray::Creator.new("tsrange", procs[3908]))
|
163
163
|
add_conversion_proc(3911, PGArray::Creator.new("tstzrange", procs[3910]))
|
164
164
|
end
|
@@ -215,12 +215,6 @@ module Sequel
|
|
215
215
|
|
216
216
|
db_type = db_type.to_s.dup.freeze
|
217
217
|
|
218
|
-
if converter = opts[:converter]
|
219
|
-
raise Error, "can't provide both a block and :converter option to register" if block
|
220
|
-
else
|
221
|
-
converter = block
|
222
|
-
end
|
223
|
-
|
224
218
|
if soid
|
225
219
|
raise Error, "can't provide both a converter and :subtype_oid option to register" if has_converter
|
226
220
|
raise Error, "no conversion proc for :subtype_oid=>#{soid.inspect} in conversion_procs" unless converter = conversion_procs[soid]
|
@@ -471,8 +465,10 @@ module Sequel
|
|
471
465
|
return @range if @range
|
472
466
|
raise(Error, "cannot create ruby range for an empty PostgreSQL range") if empty?
|
473
467
|
raise(Error, "cannot create ruby range when PostgreSQL range excludes beginning element") if exclude_begin?
|
468
|
+
# :nocov:
|
474
469
|
raise(Error, "cannot create ruby range when PostgreSQL range has unbounded beginning") if STARTLESS_RANGE_NOT_SUPPORTED && !self.begin
|
475
470
|
raise(Error, "cannot create ruby range when PostgreSQL range has unbounded ending") if ENDLESS_RANGE_NOT_SUPPORTED && !self.end
|
471
|
+
# :nocov:
|
476
472
|
@range = Range.new(self.begin, self.end, exclude_end?)
|
477
473
|
end
|
478
474
|
|
@@ -116,7 +116,9 @@ module Sequel
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
+
# :nocov:
|
119
120
|
if defined?(PGRange)
|
121
|
+
# :nocov:
|
120
122
|
class PGRange
|
121
123
|
# Wrap the PGRange instance in an RangeOp, allowing you to easily use
|
122
124
|
# the PostgreSQL range functions and operators with literal ranges.
|
@@ -158,6 +158,30 @@ module Sequel
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
# :nocov:
|
163
|
+
if defined?(PGRow::ArrayRow)
|
164
|
+
# :nocov:
|
165
|
+
class PGRow::ArrayRow
|
166
|
+
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
167
|
+
# the PostgreSQL row functions and operators with literal rows.
|
168
|
+
def op
|
169
|
+
Sequel.pg_row_op(self)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# :nocov:
|
175
|
+
if defined?(PGRow::HashRow)
|
176
|
+
# :nocov:
|
177
|
+
class PGRow::HashRow
|
178
|
+
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
179
|
+
# the PostgreSQL row functions and operators with literal rows.
|
180
|
+
def op
|
181
|
+
Sequel.pg_row_op(self)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
161
185
|
end
|
162
186
|
|
163
187
|
module SQL::Builders
|
@@ -48,7 +48,7 @@ class Sequel::Database
|
|
48
48
|
def _run_transaction_hooks(type, opts)
|
49
49
|
synchronize(opts[:server]) do |conn|
|
50
50
|
unless h = _trans(conn)
|
51
|
-
raise Error, "Cannot call run_#{type}_hooks outside of a transaction"
|
51
|
+
raise Sequel::Error, "Cannot call run_#{type}_hooks outside of a transaction"
|
52
52
|
end
|
53
53
|
|
54
54
|
if hooks = h[type]
|