sequel 4.47.0 → 4.48.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +134 -0
- data/Rakefile +1 -1
- data/doc/release_notes/4.48.0.txt +293 -0
- data/lib/sequel/adapters/ado/access.rb +2 -1
- data/lib/sequel/adapters/do/postgres.rb +5 -2
- data/lib/sequel/adapters/ibmdb.rb +24 -7
- data/lib/sequel/adapters/jdbc.rb +36 -22
- data/lib/sequel/adapters/jdbc/db2.rb +12 -3
- data/lib/sequel/adapters/jdbc/derby.rb +4 -5
- data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +43 -18
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +11 -4
- data/lib/sequel/adapters/mock.rb +24 -19
- data/lib/sequel/adapters/mysql.rb +17 -16
- data/lib/sequel/adapters/mysql2.rb +4 -5
- data/lib/sequel/adapters/oracle.rb +5 -9
- data/lib/sequel/adapters/postgres.rb +89 -102
- data/lib/sequel/adapters/shared/db2.rb +22 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -4
- data/lib/sequel/adapters/shared/mysql.rb +75 -24
- data/lib/sequel/adapters/shared/postgres.rb +196 -94
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +72 -82
- data/lib/sequel/adapters/sqlanywhere.rb +4 -1
- data/lib/sequel/adapters/sqlite.rb +5 -3
- data/lib/sequel/adapters/swift/postgres.rb +5 -2
- data/lib/sequel/adapters/tinytds.rb +0 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/adapters/utils/pg_types.rb +2 -76
- data/lib/sequel/core.rb +2 -2
- data/lib/sequel/database/connecting.rb +5 -5
- data/lib/sequel/database/dataset.rb +6 -3
- data/lib/sequel/database/misc.rb +1 -1
- data/lib/sequel/database/query.rb +3 -0
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset/actions.rb +18 -10
- data/lib/sequel/dataset/graph.rb +1 -1
- data/lib/sequel/dataset/misc.rb +1 -0
- data/lib/sequel/dataset/prepared_statements.rb +3 -3
- data/lib/sequel/dataset/query.rb +19 -8
- data/lib/sequel/extensions/core_extensions.rb +4 -1
- data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -1
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
- data/lib/sequel/extensions/filter_having.rb +2 -0
- data/lib/sequel/extensions/freeze_datasets.rb +2 -0
- data/lib/sequel/extensions/from_block.rb +1 -1
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/hash_aliases.rb +2 -0
- data/lib/sequel/extensions/identifier_mangling.rb +0 -7
- data/lib/sequel/extensions/meta_def.rb +2 -0
- data/lib/sequel/extensions/migration.rb +6 -6
- data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +207 -130
- data/lib/sequel/extensions/pg_hstore.rb +38 -20
- data/lib/sequel/extensions/pg_inet.rb +18 -6
- data/lib/sequel/extensions/pg_interval.rb +19 -12
- data/lib/sequel/extensions/pg_json.rb +25 -14
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/extensions/pg_range.rb +133 -100
- data/lib/sequel/extensions/pg_range_ops.rb +4 -3
- data/lib/sequel/extensions/pg_row.rb +68 -39
- data/lib/sequel/extensions/pg_row_ops.rb +11 -5
- data/lib/sequel/extensions/query_literals.rb +2 -0
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
- data/lib/sequel/extensions/s.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +24 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
- data/lib/sequel/extensions/set_overrides.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +0 -1
- data/lib/sequel/extensions/symbol_aref.rb +0 -4
- data/lib/sequel/model.rb +25 -57
- data/lib/sequel/model/associations.rb +14 -5
- data/lib/sequel/model/base.rb +96 -32
- data/lib/sequel/plugins/association_pks.rb +73 -46
- data/lib/sequel/plugins/association_proxies.rb +1 -1
- data/lib/sequel/plugins/auto_validations.rb +6 -2
- data/lib/sequel/plugins/boolean_readers.rb +1 -1
- data/lib/sequel/plugins/caching.rb +19 -13
- data/lib/sequel/plugins/class_table_inheritance.rb +19 -10
- data/lib/sequel/plugins/column_conflicts.rb +7 -2
- data/lib/sequel/plugins/column_select.rb +1 -1
- data/lib/sequel/plugins/csv_serializer.rb +8 -8
- data/lib/sequel/plugins/defaults_setter.rb +10 -0
- data/lib/sequel/plugins/eager_each.rb +1 -1
- data/lib/sequel/plugins/force_encoding.rb +2 -2
- data/lib/sequel/plugins/hook_class_methods.rb +9 -12
- data/lib/sequel/plugins/identifier_columns.rb +2 -0
- data/lib/sequel/plugins/instance_filters.rb +3 -1
- data/lib/sequel/plugins/instance_hooks.rb +17 -9
- data/lib/sequel/plugins/json_serializer.rb +17 -10
- data/lib/sequel/plugins/lazy_attributes.rb +8 -7
- data/lib/sequel/plugins/modification_detection.rb +3 -0
- data/lib/sequel/plugins/nested_attributes.rb +5 -1
- data/lib/sequel/plugins/pg_array_associations.rb +5 -0
- data/lib/sequel/plugins/prepared_statements.rb +1 -0
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/serialization.rb +3 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/split_values.rb +6 -5
- data/lib/sequel/plugins/static_cache.rb +31 -25
- data/lib/sequel/plugins/subset_conditions.rb +3 -1
- data/lib/sequel/plugins/table_select.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -6
- data/lib/sequel/plugins/validation_helpers.rb +2 -4
- data/lib/sequel/plugins/xml_serializer.rb +4 -4
- data/lib/sequel/sql.rb +2 -2
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +115 -14
- data/spec/adapters/mysql_spec.rb +78 -28
- data/spec/adapters/oracle_spec.rb +24 -24
- data/spec/adapters/postgres_spec.rb +38 -24
- data/spec/adapters/sqlanywhere_spec.rb +88 -86
- data/spec/adapters/sqlite_spec.rb +29 -24
- data/spec/core/connection_pool_spec.rb +17 -0
- data/spec/core/database_spec.rb +6 -0
- data/spec/core/dataset_spec.rb +46 -36
- data/spec/core/schema_spec.rb +16 -0
- data/spec/core/spec_helper.rb +1 -0
- data/spec/core_extensions_spec.rb +6 -2
- data/spec/extensions/active_model_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +34 -2
- data/spec/extensions/auto_literal_strings_spec.rb +5 -1
- data/spec/extensions/auto_validations_spec.rb +2 -0
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +48 -2
- data/spec/extensions/column_conflicts_spec.rb +11 -0
- data/spec/extensions/connection_validator_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +8 -8
- data/spec/extensions/defaults_setter_spec.rb +1 -1
- data/spec/extensions/filter_having_spec.rb +5 -3
- data/spec/extensions/hash_aliases_spec.rb +3 -1
- data/spec/extensions/identifier_columns_spec.rb +3 -1
- data/spec/extensions/implicit_subquery_spec.rb +4 -2
- data/spec/extensions/json_serializer_spec.rb +18 -0
- data/spec/extensions/lazy_attributes_spec.rb +3 -3
- data/spec/extensions/meta_def_spec.rb +9 -0
- data/spec/extensions/migration_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +14 -3
- data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
- data/spec/extensions/pg_array_associations_spec.rb +29 -18
- data/spec/extensions/pg_array_spec.rb +44 -25
- data/spec/extensions/pg_hstore_spec.rb +10 -0
- data/spec/extensions/pg_inet_spec.rb +26 -0
- data/spec/extensions/pg_interval_spec.rb +20 -0
- data/spec/extensions/pg_json_spec.rb +24 -0
- data/spec/extensions/pg_range_spec.rb +98 -14
- data/spec/extensions/pg_row_spec.rb +14 -4
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +3 -1
- data/spec/extensions/schema_dumper_spec.rb +96 -98
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
- data/spec/extensions/single_table_inheritance_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/static_cache_spec.rb +75 -24
- data/spec/extensions/string_agg_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +9 -0
- data/spec/extensions/validation_helpers_spec.rb +9 -3
- data/spec/extensions/whitelist_security_spec.rb +26 -0
- data/spec/integration/dataset_test.rb +45 -44
- data/spec/integration/plugin_test.rb +20 -0
- data/spec/integration/prepared_statement_test.rb +3 -0
- data/spec/integration/schema_test.rb +21 -1
- data/spec/integration/transaction_test.rb +40 -40
- data/spec/model/class_dataset_methods_spec.rb +14 -4
- data/spec/model/dataset_methods_spec.rb +12 -3
- data/spec/model/model_spec.rb +8 -0
- metadata +6 -4
- data/spec/adapters/firebird_spec.rb +0 -405
- data/spec/adapters/informix_spec.rb +0 -100
@@ -6,11 +6,17 @@ module Sequel
|
|
6
6
|
module DB2
|
7
7
|
Sequel::Database.set_shared_adapter_scheme(:db2, self)
|
8
8
|
|
9
|
+
# SEQUEL5: Remove
|
9
10
|
@use_clob_as_blob = false
|
10
|
-
|
11
11
|
class << self
|
12
|
-
|
13
|
-
|
12
|
+
def use_clob_as_blob
|
13
|
+
Sequel::Deprecation.deprecate("Sequel::DB2.use_clob_as_blob", "Call this method on the Database instance")
|
14
|
+
@use_clob_as_blob
|
15
|
+
end
|
16
|
+
def use_clob_as_blob=(v)
|
17
|
+
Sequel::Deprecation.deprecate("Sequel::DB2.use_clob_as_blob=", "Call this method on the Database instance")
|
18
|
+
@use_clob_as_blob = v
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
module DatabaseMethods
|
@@ -21,6 +27,16 @@ module Sequel
|
|
21
27
|
NULL = ''.freeze
|
22
28
|
Sequel::Deprecation.deprecate_constant(self, :NULL)
|
23
29
|
|
30
|
+
# Whether to use clob as the generic File type, false by default.
|
31
|
+
#attr_accessor :use_clob_as_blob # SEQUEL5
|
32
|
+
|
33
|
+
# SEQUEL5: Remove
|
34
|
+
attr_writer :use_clob_as_blob
|
35
|
+
def use_clob_as_blob
|
36
|
+
v = @use_clob_as_blob
|
37
|
+
v.nil? ? Sequel::DB2.instance_variable_get(:@use_clob_as_blob) : v
|
38
|
+
end
|
39
|
+
|
24
40
|
# DB2 always uses :db2 as it's database type
|
25
41
|
def database_type
|
26
42
|
:db2
|
@@ -250,7 +266,7 @@ module Sequel
|
|
250
266
|
|
251
267
|
# Treat clob as blob if use_clob_as_blob is true
|
252
268
|
def schema_column_type(db_type)
|
253
|
-
(
|
269
|
+
(use_clob_as_blob && db_type.downcase == 'clob') ? :blob : super
|
254
270
|
end
|
255
271
|
|
256
272
|
# SQL to set the transaction isolation level
|
@@ -263,7 +279,7 @@ module Sequel
|
|
263
279
|
# use this for blob value:
|
264
280
|
# cast(X'fffefdfcfbfa' as blob(2G))
|
265
281
|
def type_literal_generic_file(column)
|
266
|
-
|
282
|
+
use_clob_as_blob ? :clob : :blob
|
267
283
|
end
|
268
284
|
|
269
285
|
# DB2 uses smallint to store booleans.
|
@@ -433,7 +449,7 @@ module Sequel
|
|
433
449
|
|
434
450
|
# DB2 uses a literal hexidecimal number for blob strings
|
435
451
|
def literal_blob_append(sql, v)
|
436
|
-
if
|
452
|
+
if db.use_clob_as_blob
|
437
453
|
super
|
438
454
|
else
|
439
455
|
sql << "BLOB(X'" << v.unpack("H*").first << "')"
|
@@ -540,7 +540,6 @@ module Sequel
|
|
540
540
|
CONSTANT_MAP = {:CURRENT_DATE=>'CAST(CURRENT_TIMESTAMP AS DATE)'.freeze, :CURRENT_TIME=>'CAST(CURRENT_TIMESTAMP AS TIME)'.freeze}#.freeze # SEQUEL5
|
541
541
|
EXTRACT_MAP = {:year=>"yy", :month=>"m", :day=>"d", :hour=>"hh", :minute=>"n", :second=>"s"}#.freeze # SEQUEL5
|
542
542
|
#EXTRACT_MAP.each_value(&:freeze) # SEQUEL5
|
543
|
-
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:disable_insert_output, :mssql_unicode_strings]).freeze
|
544
543
|
LIMIT_ALL = Object.new.freeze
|
545
544
|
|
546
545
|
BOOL_TRUE = '1'.freeze
|
@@ -629,6 +628,8 @@ module Sequel
|
|
629
628
|
Sequel::Deprecation.deprecate_constant(self, :ROWS_ONLY)
|
630
629
|
FETCH_NEXT = " FETCH NEXT ".freeze
|
631
630
|
Sequel::Deprecation.deprecate_constant(self, :FETCH_NEXT)
|
631
|
+
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:disable_insert_output, :mssql_unicode_strings]).freeze
|
632
|
+
Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
|
632
633
|
|
633
634
|
Dataset.def_mutation_method(:disable_insert_output, :output, :module=>self)
|
634
635
|
Dataset.def_sql_method(self, :delete, %w'with delete limit from output from2 where')
|
@@ -637,6 +638,7 @@ module Sequel
|
|
637
638
|
|
638
639
|
# Allow overriding of the mssql_unicode_strings option at the dataset level.
|
639
640
|
def mssql_unicode_strings=(v)
|
641
|
+
Sequel::Deprecation.deprecate("Dataset#mssql_unicode_strings=", "Switch to using with_mssql_unicode_strings, which returns a modified copy")
|
640
642
|
@opts[:mssql_unicode_strings] = v
|
641
643
|
end
|
642
644
|
|
@@ -1048,9 +1050,8 @@ module Sequel
|
|
1048
1050
|
is_2008_or_later? ? :values : :union
|
1049
1051
|
end
|
1050
1052
|
|
1051
|
-
|
1052
|
-
|
1053
|
-
NON_SQL_OPTIONS
|
1053
|
+
def non_sql_option?(key)
|
1054
|
+
super || key == :disable_insert_output || key == :mssql_unicode_strings
|
1054
1055
|
end
|
1055
1056
|
|
1056
1057
|
def select_into_sql(sql)
|
@@ -12,32 +12,54 @@ module Sequel
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
# SEQUEL5: Remove
|
15
16
|
@convert_tinyint_to_bool = true
|
16
|
-
|
17
|
+
@default_charset = nil
|
18
|
+
@default_collate = nil
|
19
|
+
@default_engine = nil
|
17
20
|
class << self
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def convert_tinyint_to_bool
|
22
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool", "Call this method on the Database instance")
|
23
|
+
@convert_tinyint_to_bool
|
24
|
+
end
|
25
|
+
def convert_tinyint_to_bool=(v)
|
26
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool=", "Call this method on the Database instance")
|
27
|
+
@convert_tinyint_to_bool = v
|
28
|
+
end
|
23
29
|
|
24
|
-
|
25
|
-
|
26
|
-
|
30
|
+
def default_charset
|
31
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset", "Call this method on the Database instance")
|
32
|
+
@default_charset
|
33
|
+
end
|
34
|
+
def default_charset=(v)
|
35
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset=", "Call this method on the Database instance")
|
36
|
+
@default_charset = v
|
37
|
+
end
|
27
38
|
|
28
|
-
|
29
|
-
|
30
|
-
|
39
|
+
def default_collate
|
40
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate", "Call this method on the Database instance")
|
41
|
+
@default_collate
|
42
|
+
end
|
43
|
+
def default_collate=(v)
|
44
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate=", "Call this method on the Database instance")
|
45
|
+
@default_collate = v
|
46
|
+
end
|
31
47
|
|
32
|
-
|
33
|
-
|
34
|
-
|
48
|
+
def default_engine
|
49
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine", "Call this method on the Database instance")
|
50
|
+
@default_engine
|
51
|
+
end
|
52
|
+
def default_engine=(v)
|
53
|
+
Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine=", "Call this method on the Database instance")
|
54
|
+
@default_engine = v
|
55
|
+
end
|
35
56
|
end
|
36
57
|
|
37
58
|
# Methods shared by Database instances that connect to MySQL,
|
38
59
|
# currently supported by the native and JDBC adapters.
|
39
60
|
module DatabaseMethods
|
40
61
|
include UnmodifiedIdentifiers::DatabaseMethods
|
62
|
+
include Sequel::Database::SplitAlterTable
|
41
63
|
|
42
64
|
AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
|
43
65
|
Sequel::Deprecation.deprecate_constant(self, :AUTO_INCREMENT)
|
@@ -49,8 +71,36 @@ module Sequel
|
|
49
71
|
CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}#.freeze # SEQUEL5
|
50
72
|
COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]#.freeze # SEQUEL5
|
51
73
|
|
52
|
-
include Sequel::Database::SplitAlterTable
|
53
74
|
|
75
|
+
# Set the default charset used for CREATE TABLE. You can pass the
|
76
|
+
# :charset option to create_table to override this setting.
|
77
|
+
#attr_accessor :default_charset # SEQUEL5
|
78
|
+
|
79
|
+
# Set the default collation used for CREATE TABLE. You can pass the
|
80
|
+
# :collate option to create_table to override this setting.
|
81
|
+
#attr_accessor :default_collate # SEQUEL5
|
82
|
+
|
83
|
+
# Set the default engine used for CREATE TABLE. You can pass the
|
84
|
+
# :engine option to create_table to override this setting.
|
85
|
+
#attr_accessor :default_engine # SEQUEL5
|
86
|
+
|
87
|
+
# SEQUEL5: Remove
|
88
|
+
attr_writer :default_charset
|
89
|
+
def default_charset
|
90
|
+
v = @default_charset
|
91
|
+
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_charset) : v
|
92
|
+
end
|
93
|
+
attr_writer :default_collate
|
94
|
+
def default_collate
|
95
|
+
v = @default_collate
|
96
|
+
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_collate) : v
|
97
|
+
end
|
98
|
+
attr_writer :default_engine
|
99
|
+
def default_engine
|
100
|
+
v = @default_engine
|
101
|
+
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_engine) : v
|
102
|
+
end
|
103
|
+
|
54
104
|
# MySQL's cast rules are restrictive in that you can't just cast to any possible
|
55
105
|
# database type.
|
56
106
|
def cast_type_literal(type)
|
@@ -375,9 +425,9 @@ module Sequel
|
|
375
425
|
|
376
426
|
# Use MySQL specific syntax for engine type and character encoding
|
377
427
|
def create_table_sql(name, generator, options = OPTS)
|
378
|
-
engine = options.fetch(:engine,
|
379
|
-
charset = options.fetch(:charset,
|
380
|
-
collate = options.fetch(:collate,
|
428
|
+
engine = options.fetch(:engine, default_engine)
|
429
|
+
charset = options.fetch(:charset, default_charset)
|
430
|
+
collate = options.fetch(:collate, default_collate)
|
381
431
|
generator.constraints.sort_by{|c| (c[:type] == :primary_key) ? -1 : 1}
|
382
432
|
|
383
433
|
# Proc for figuring out the primary key for a given table.
|
@@ -669,10 +719,11 @@ module Sequel
|
|
669
719
|
Sequel::Deprecation.deprecate_constant(self, :CURRENT_TIMESTAMP_56)
|
670
720
|
ONLY_OFFSET = ",18446744073709551615".freeze
|
671
721
|
Sequel::Deprecation.deprecate_constant(self, :ONLY_OFFSET)
|
722
|
+
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:insert_ignore, :update_ignore, :on_duplicate_key_update]).freeze
|
723
|
+
Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
|
672
724
|
|
673
725
|
MATCH_AGAINST = ["MATCH ".freeze, " AGAINST (".freeze, ")".freeze].freeze
|
674
726
|
MATCH_AGAINST_BOOLEAN = ["MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE)".freeze].freeze
|
675
|
-
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:insert_ignore, :update_ignore, :on_duplicate_key_update]).freeze
|
676
727
|
|
677
728
|
Dataset.def_sql_method(self, :delete, %w'delete from where order limit')
|
678
729
|
Dataset.def_sql_method(self, :insert, %w'insert ignore into columns values on_duplicate_key_update')
|
@@ -791,7 +842,7 @@ module Sequel
|
|
791
842
|
# Raises an error on use of :full_outer type, since MySQL doesn't support it.
|
792
843
|
def join_table(type, table, expr=nil, opts=OPTS, &block)
|
793
844
|
type = :inner if (type == :cross) && !expr.nil?
|
794
|
-
raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN") if type == :full_outer
|
845
|
+
raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN or NATURAL FULL JOIN") if type == :full_outer || type == :natural_full
|
795
846
|
super(type, table, expr, opts, &block)
|
796
847
|
end
|
797
848
|
|
@@ -802,6 +853,7 @@ module Sequel
|
|
802
853
|
when :straight
|
803
854
|
'STRAIGHT_JOIN'
|
804
855
|
when :natural_inner
|
856
|
+
Sequel::Deprecation.deprecate(":natural_inner join type being converted to NATURAL LEFT JOIN on MySQL", "Use :natural_left join type for NATURAL LEFT JOIN, or :natural join type for NATURAL JOIN")
|
805
857
|
'NATURAL LEFT JOIN'
|
806
858
|
else
|
807
859
|
super
|
@@ -1055,9 +1107,8 @@ module Sequel
|
|
1055
1107
|
:values
|
1056
1108
|
end
|
1057
1109
|
|
1058
|
-
|
1059
|
-
|
1060
|
-
NON_SQL_OPTIONS
|
1110
|
+
def non_sql_option?(key)
|
1111
|
+
super || key == :insert_ignore || key == :update_ignore || key == :on_duplicate_key_update
|
1061
1112
|
end
|
1062
1113
|
|
1063
1114
|
def select_only_offset_sql(sql)
|
@@ -1,25 +1,17 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel.require %w'
|
3
|
+
Sequel.require %w'adapters/utils/unmodified_identifiers'
|
4
4
|
|
5
5
|
module Sequel
|
6
6
|
# Top level module for holding all PostgreSQL-related modules and classes
|
7
|
-
# for Sequel.
|
8
|
-
# metaprogramming. These are:
|
9
|
-
#
|
10
|
-
# client_min_messages :: Change the minimum level of messages that PostgreSQL will send to the
|
11
|
-
# the client. The PostgreSQL default is NOTICE, the Sequel default is
|
12
|
-
# WARNING. Set to nil to not change the server default. Overridable on
|
13
|
-
# a per instance basis via the :client_min_messages option.
|
14
|
-
# force_standard_strings :: Set to false to not force the use of standard strings. Overridable
|
15
|
-
# on a per instance basis via the :force_standard_strings option.
|
16
|
-
#
|
17
|
-
# It is not recommened you use these module-level accessors. Instead,
|
18
|
-
# use the database option to make the setting per-Database.
|
19
|
-
#
|
20
|
-
# All adapters that connect to PostgreSQL support the following option in
|
21
|
-
# addition to those mentioned above:
|
7
|
+
# for Sequel. All adapters that connect to PostgreSQL support the following options:
|
22
8
|
#
|
9
|
+
# :client_min_messages :: Change the minimum level of messages that PostgreSQL will send to the
|
10
|
+
# the client. The PostgreSQL default is NOTICE, the Sequel default is
|
11
|
+
# WARNING. Set to nil to not change the server default. Overridable on
|
12
|
+
# a per instance basis via the :client_min_messages option.
|
13
|
+
# :force_standard_strings :: Set to false to not force the use of standard strings. Overridable
|
14
|
+
# on a per instance basis via the :force_standard_strings option.
|
23
15
|
# :search_path :: Set the schema search_path for this Database's connections.
|
24
16
|
# Allows to to set which schemas do not need explicit
|
25
17
|
# qualification, and in which order to check the schemas when
|
@@ -27,6 +19,88 @@ module Sequel
|
|
27
19
|
module Postgres
|
28
20
|
Sequel::Database.set_shared_adapter_scheme(:postgres, self)
|
29
21
|
|
22
|
+
NAN = 0.0/0.0
|
23
|
+
PLUS_INFINITY = 1.0/0.0
|
24
|
+
MINUS_INFINITY = -1.0/0.0
|
25
|
+
|
26
|
+
NAN_STR = 'NaN'.freeze
|
27
|
+
Sequel::Deprecation.deprecate_constant(self, :NAN_STR)
|
28
|
+
PLUS_INFINITY_STR = 'Infinity'.freeze
|
29
|
+
Sequel::Deprecation.deprecate_constant(self, :PLUS_INFINITY_STR)
|
30
|
+
MINUS_INFINITY_STR = '-Infinity'.freeze
|
31
|
+
Sequel::Deprecation.deprecate_constant(self, :MINUS_INFINITY_STR)
|
32
|
+
TRUE_STR = 't'.freeze
|
33
|
+
Sequel::Deprecation.deprecate_constant(self, :TRUE_STR)
|
34
|
+
DASH_STR = '-'.freeze
|
35
|
+
Sequel::Deprecation.deprecate_constant(self, :DASH_STR)
|
36
|
+
|
37
|
+
TYPE_TRANSLATOR = tt = Class.new do
|
38
|
+
def boolean(s) s == 't' end
|
39
|
+
def integer(s) s.to_i end
|
40
|
+
def float(s)
|
41
|
+
case s
|
42
|
+
when 'NaN'
|
43
|
+
NAN
|
44
|
+
when 'Infinity'
|
45
|
+
PLUS_INFINITY
|
46
|
+
when '-Infinity'
|
47
|
+
MINUS_INFINITY
|
48
|
+
else
|
49
|
+
s.to_f
|
50
|
+
end
|
51
|
+
end
|
52
|
+
def date(s) ::Date.new(*s.split('-').map(&:to_i)) end
|
53
|
+
def bytea(str)
|
54
|
+
str = if str =~ /\A\\x/
|
55
|
+
# PostgreSQL 9.0+ bytea hex format
|
56
|
+
str[2..-1].gsub(/(..)/){|s| s.to_i(16).chr}
|
57
|
+
else
|
58
|
+
# Historical PostgreSQL bytea escape format
|
59
|
+
str.gsub(/\\(\\|'|[0-3][0-7][0-7])/) {|s|
|
60
|
+
if s.size == 2 then s[1,1] else s[1,3].oct.chr end
|
61
|
+
}
|
62
|
+
end
|
63
|
+
::Sequel::SQL::Blob.new(str)
|
64
|
+
end
|
65
|
+
end.new#.freeze # SEQUEL5
|
66
|
+
|
67
|
+
# Type OIDs for string types used by PostgreSQL. These types don't
|
68
|
+
# have conversion procs associated with them (since the data is
|
69
|
+
# already in the form of a string).
|
70
|
+
STRING_TYPES = [18, 19, 25, 1042, 1043] # SEQUEL5: Remove
|
71
|
+
|
72
|
+
# Hash with type name strings/symbols and callable values for converting PostgreSQL types.
|
73
|
+
# Non-builtin types that don't have fixed numbers should use this to register
|
74
|
+
# conversion procs.
|
75
|
+
PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
|
76
|
+
PG_NAMED__TYPES = PG_NAMED_TYPES
|
77
|
+
Sequel::Deprecation.deprecate_constant(self, :PG_NAMED_TYPES)
|
78
|
+
|
79
|
+
# Hash with integer keys and callable values for converting PostgreSQL types.
|
80
|
+
PG_TYPES = {} unless defined?(PG_TYPES)
|
81
|
+
|
82
|
+
#CONVERSION_PROCS = {} # SEQUEL5
|
83
|
+
|
84
|
+
{
|
85
|
+
[16] => tt.method(:boolean),
|
86
|
+
[17] => tt.method(:bytea),
|
87
|
+
[20, 21, 23, 26] => tt.method(:integer),
|
88
|
+
[700, 701] => tt.method(:float),
|
89
|
+
[1700] => ::BigDecimal.method(:new),
|
90
|
+
[1083, 1266] => ::Sequel.method(:string_to_time),
|
91
|
+
[1082] => ::Sequel.method(:string_to_date),
|
92
|
+
[1184, 1114] => ::Sequel.method(:database_to_application_timestamp),
|
93
|
+
}.each do |k,v|
|
94
|
+
k.each do |n|
|
95
|
+
PG_TYPES[n] = v
|
96
|
+
#CONVERSION_PROCS[n] = v # SEQUEL5
|
97
|
+
end
|
98
|
+
end
|
99
|
+
PG__TYPES = PG_TYPES
|
100
|
+
Sequel::Deprecation.deprecate_constant(self, :PG_TYPES)
|
101
|
+
|
102
|
+
#CONVERSION_PROCS.freeze # SEQUEL5
|
103
|
+
|
30
104
|
module MockAdapterDatabaseMethods
|
31
105
|
def bound_variable_arg(arg, conn)
|
32
106
|
arg
|
@@ -45,26 +119,30 @@ module Sequel
|
|
45
119
|
end
|
46
120
|
end
|
47
121
|
|
48
|
-
# Array of exceptions that need to be converted. JDBC
|
49
|
-
# uses NativeExceptions, the native adapter uses PGError.
|
50
122
|
CONVERTED_EXCEPTIONS = []
|
123
|
+
Sequel::Deprecation.deprecate_constant(self, :CONVERTED_EXCEPTIONS)
|
51
124
|
|
125
|
+
# SEQUEL5: Remove
|
52
126
|
@client_min_messages = :warning
|
53
127
|
@force_standard_strings = true
|
54
|
-
|
55
128
|
class << self
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
129
|
+
def client_min_messages
|
130
|
+
Sequel::Deprecation.deprecate("Sequel::Postgres.client_min_messages", "Use the :client_min_messages Database option instead")
|
131
|
+
@client_min_messages
|
132
|
+
end
|
133
|
+
def client_min_messages=(v)
|
134
|
+
Sequel::Deprecation.deprecate("Sequel::Postgres.client_min_messages=", "Use the :client_min_messages Database option instead")
|
135
|
+
@client_min_messages = v
|
136
|
+
end
|
137
|
+
|
138
|
+
def force_standard_strings
|
139
|
+
Sequel::Deprecation.deprecate("Sequel::Postgres.force_standard_strings", "Use the :force_standard_strings Database option instead")
|
140
|
+
@force_standard_strings
|
141
|
+
end
|
142
|
+
def force_standard_strings=(v)
|
143
|
+
Sequel::Deprecation.deprecate("Sequel::Postgres.force_standard_strings=", "Use the :force_standard_strings Database option instead")
|
144
|
+
@force_standard_strings = v
|
145
|
+
end
|
68
146
|
end
|
69
147
|
|
70
148
|
class CreateTableGenerator < Sequel::Schema::CreateTableGenerator
|
@@ -179,6 +257,12 @@ module Sequel
|
|
179
257
|
# having callable values for the conversion proc for that type.
|
180
258
|
attr_reader :conversion_procs
|
181
259
|
|
260
|
+
# Set a conversion proc for the given oid. The callable can
|
261
|
+
# be passed either as a argument or a block.
|
262
|
+
def add_conversion_proc(oid, callable=Proc.new)
|
263
|
+
conversion_procs[oid] = callable
|
264
|
+
end
|
265
|
+
|
182
266
|
# Add a conversion proc for a named type. This should be used
|
183
267
|
# for types without fixed OIDs, which includes all types that
|
184
268
|
# are not included in a default PostgreSQL installation. If
|
@@ -190,7 +274,12 @@ module Sequel
|
|
190
274
|
Sequel::Deprecation.deprecate("Sequel::PG_NAMED_TYPES", "Call Database#add_named_conversion_proc directly for each database you want to support the #{name} type")
|
191
275
|
end
|
192
276
|
end
|
193
|
-
add_named_conversion_procs(conversion_procs, name=>block)
|
277
|
+
add_named_conversion_procs(conversion_procs, name=>block) # SEQUEL5: Remove
|
278
|
+
# SEQUEL5:
|
279
|
+
#unless oid = from(:pg_type).where(:typtype=>['b', 'e'], :typname=>name.to_s).get(:oid)
|
280
|
+
# raise Error, "No matching type in pg_type for #{name.inspect}"
|
281
|
+
#end
|
282
|
+
#add_conversion_proc(oid, block) # SEQUEL5
|
194
283
|
end
|
195
284
|
|
196
285
|
# Commit an existing prepared transaction with the given transaction
|
@@ -316,68 +405,67 @@ module Sequel
|
|
316
405
|
def foreign_key_list(table, opts=OPTS)
|
317
406
|
m = output_identifier_meth
|
318
407
|
schema, _ = opts.fetch(:schema, schema_and_table(table))
|
319
|
-
range = 0...32
|
320
408
|
oid = regclass_oid(table)
|
321
409
|
|
322
|
-
|
410
|
+
if server_version >= 90500
|
411
|
+
cpos = Sequel.expr{array_position(co[:conkey], att[:attnum])}
|
412
|
+
rpos = Sequel.expr{array_position(co[:confkey], att2[:attnum])}
|
413
|
+
else
|
414
|
+
range = 0...32
|
415
|
+
cpos = Sequel.expr{SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(co[:conkey], [x]), x]}, 32, att[:attnum])}
|
416
|
+
rpos = Sequel.expr{SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(co[:confkey], [x]), x]}, 32, att2[:attnum])}
|
417
|
+
end
|
418
|
+
|
419
|
+
ds = metadata_dataset.
|
323
420
|
from{pg_constraint.as(:co)}.
|
324
421
|
join(Sequel[:pg_class].as(:cl), :oid=>:conrelid).
|
422
|
+
join(Sequel[:pg_attribute].as(:att), :attrelid=>:oid, :attnum=>SQL::Function.new(:ANY, Sequel[:co][:conkey])).
|
423
|
+
join(Sequel[:pg_class].as(:cl2), :oid=>Sequel[:co][:confrelid]).
|
424
|
+
join(Sequel[:pg_attribute].as(:att2), :attrelid=>:oid, :attnum=>SQL::Function.new(:ANY, Sequel[:co][:confkey])).
|
425
|
+
order{[co[:conname], cpos]}.
|
325
426
|
where{{
|
326
427
|
cl[:relkind]=>'r',
|
327
428
|
co[:contype]=>'f',
|
328
|
-
cl[:oid]=>oid
|
329
|
-
|
330
|
-
|
331
|
-
# This is because PostgreSQL stores both the referencing and referenced columns in
|
332
|
-
# arrays, and I don't know a simple way to not create a cross product, as PostgreSQL
|
333
|
-
# doesn't appear to have a function that takes an array and element and gives you
|
334
|
-
# the index of that element in the array.
|
335
|
-
|
336
|
-
ds = base_ds.
|
337
|
-
join(Sequel[:pg_attribute].as(:att), :attrelid=>:oid, :attnum=>SQL::Function.new(:ANY, Sequel[:co][:conkey])).
|
338
|
-
order{[
|
339
|
-
co[:conname],
|
340
|
-
SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(co[:conkey], [x]), x]}, 32, att[:attnum])]}.
|
429
|
+
cl[:oid]=>oid,
|
430
|
+
cpos=>rpos
|
431
|
+
}}.
|
341
432
|
select{[
|
342
433
|
co[:conname].as(:name),
|
343
434
|
att[:attname].as(:column),
|
344
435
|
co[:confupdtype].as(:on_update),
|
345
436
|
co[:confdeltype].as(:on_delete),
|
346
|
-
SQL::BooleanExpression.new(:AND, co[:condeferrable], co[:condeferred]).as(:deferrable)]}
|
347
|
-
|
348
|
-
ref_ds = base_ds.
|
349
|
-
join(Sequel[:pg_class].as(:cl2), :oid=>Sequel[:co][:confrelid]).
|
350
|
-
join(Sequel[:pg_attribute].as(:att2), :attrelid=>:oid, :attnum=>SQL::Function.new(:ANY, Sequel[:co][:confkey])).
|
351
|
-
order{[
|
352
|
-
co[:conname],
|
353
|
-
SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(co[:confkey], [x]), x]}, 32, att2[:attnum])]}.
|
354
|
-
select{[
|
355
|
-
co[:conname].as(:name),
|
356
437
|
cl2[:relname].as(:table),
|
357
|
-
att2[:attname].as(:refcolumn)
|
438
|
+
att2[:attname].as(:refcolumn),
|
439
|
+
SQL::BooleanExpression.new(:AND, co[:condeferrable], co[:condeferred]).as(:deferrable)
|
440
|
+
]}
|
358
441
|
|
359
442
|
# If a schema is given, we only search in that schema, and the returned :table
|
360
443
|
# entry is schema qualified as well.
|
361
444
|
if schema
|
362
|
-
|
445
|
+
ds = ds.join(Sequel[:pg_namespace].as(:nsp2), :oid=>Sequel[:cl2][:relnamespace]).
|
363
446
|
select_append{nsp2[:nspname].as(:schema)}
|
364
447
|
end
|
365
448
|
|
366
449
|
h = {}
|
367
450
|
fklod_map = FOREIGN_KEY_LIST_ON_DELETE_MAP
|
451
|
+
|
368
452
|
ds.each do |row|
|
369
453
|
if r = h[row[:name]]
|
370
454
|
r[:columns] << m.call(row[:column])
|
455
|
+
r[:key] << m.call(row[:refcolumn])
|
371
456
|
else
|
372
|
-
h[row[:name]] = {
|
457
|
+
h[row[:name]] = {
|
458
|
+
:name=>m.call(row[:name]),
|
459
|
+
:columns=>[m.call(row[:column])],
|
460
|
+
:key=>[m.call(row[:refcolumn])],
|
461
|
+
:on_update=>fklod_map[row[:on_update]],
|
462
|
+
:on_delete=>fklod_map[row[:on_delete]],
|
463
|
+
:deferrable=>row[:deferrable],
|
464
|
+
:table=>schema ? SQL::QualifiedIdentifier.new(m.call(row[:schema]), m.call(row[:table])) : m.call(row[:table])
|
465
|
+
}
|
373
466
|
end
|
374
467
|
end
|
375
|
-
|
376
|
-
r = h[row[:name]]
|
377
|
-
r[:table] ||= schema ? SQL::QualifiedIdentifier.new(m.call(row[:schema]), m.call(row[:table])) : m.call(row[:table])
|
378
|
-
r[:key] ||= []
|
379
|
-
r[:key] << m.call(row[:refcolumn])
|
380
|
-
end
|
468
|
+
|
381
469
|
h.values
|
382
470
|
end
|
383
471
|
|
@@ -391,9 +479,18 @@ module Sequel
|
|
391
479
|
# Use the pg_* system tables to determine indexes on a table
|
392
480
|
def indexes(table, opts=OPTS)
|
393
481
|
m = output_identifier_meth
|
394
|
-
range = 0...32
|
395
|
-
attnums = server_version >= 80100 ? SQL::Function.new(:ANY, Sequel[:ind][:indkey]) : range.map{|x| SQL::Subscript.new(Sequel[:ind][:indkey], [x])}
|
396
482
|
oid = regclass_oid(table, opts)
|
483
|
+
|
484
|
+
if server_version >= 90500
|
485
|
+
order = [Sequel[:indc][:relname], Sequel.function(:array_position, Sequel[:ind][:indkey], Sequel[:att][:attnum])]
|
486
|
+
else
|
487
|
+
range = 0...32
|
488
|
+
order = [Sequel[:indc][:relname], SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(Sequel[:ind][:indkey], [x]), x]}, 32, Sequel[:att][:attnum])]
|
489
|
+
attnums = range.map{|x| SQL::Subscript.new(Sequel[:ind][:indkey], [x])} unless server_version >= 80100
|
490
|
+
end
|
491
|
+
|
492
|
+
attnums ||= SQL::Function.new(:ANY, Sequel[:ind][:indkey])
|
493
|
+
|
397
494
|
ds = metadata_dataset.
|
398
495
|
from{pg_class.as(:tab)}.
|
399
496
|
join(Sequel[:pg_index].as(:ind), :indrelid=>:oid).
|
@@ -407,7 +504,7 @@ module Sequel
|
|
407
504
|
:indpred=>nil,
|
408
505
|
:indisvalid=>true,
|
409
506
|
tab[:oid]=>oid}}.
|
410
|
-
order
|
507
|
+
order(*order).
|
411
508
|
select{[indc[:relname].as(:name), ind[:indisunique].as(:unique), att[:attname].as(:column), con[:condeferrable].as(:deferrable)]}
|
412
509
|
|
413
510
|
ds = ds.where(:indisready=>true, :indcheckxmin=>false) if server_version >= 80300
|
@@ -478,9 +575,9 @@ module Sequel
|
|
478
575
|
run "REFRESH MATERIALIZED VIEW#{' CONCURRENTLY' if opts[:concurrently]} #{quote_schema_table(name)}"
|
479
576
|
end
|
480
577
|
|
481
|
-
#
|
482
|
-
# any named types.
|
578
|
+
# SEQUEL5: Remove
|
483
579
|
def reset_conversion_procs
|
580
|
+
Sequel::Deprecation.deprecate('Database#reset_conversion_procs', 'There should no longer be a need to reset conversion procs')
|
484
581
|
@conversion_procs = get_conversion_procs
|
485
582
|
conversion_procs_updated
|
486
583
|
@conversion_procs
|
@@ -626,8 +723,7 @@ module Sequel
|
|
626
723
|
|
627
724
|
private
|
628
725
|
|
629
|
-
#
|
630
|
-
# with the related proc if the database supports the type.
|
726
|
+
# SEQUEL5: Remove
|
631
727
|
def add_named_conversion_procs(procs, named_procs)
|
632
728
|
unless (named_procs).empty?
|
633
729
|
convert_named_procs_to_procs(named_procs).each do |oid, pr|
|
@@ -730,9 +826,10 @@ module Sequel
|
|
730
826
|
def connection_configuration_sqls
|
731
827
|
sqls = []
|
732
828
|
|
733
|
-
sqls << "SET standard_conforming_strings = ON" if typecast_value_boolean(@opts.fetch(:force_standard_strings, Postgres.force_standard_strings))
|
829
|
+
sqls << "SET standard_conforming_strings = ON" if typecast_value_boolean(@opts.fetch(:force_standard_strings, Postgres.instance_variable_get(:@force_standard_strings))) # , true)) # SEQUEL5
|
734
830
|
|
735
|
-
|
831
|
+
cmm = @opts.fetch(:client_min_messages, Postgres.instance_variable_get(:@client_min_messages)) # , :warning) # SEQUEL5
|
832
|
+
if cmm && !cmm.to_s.empty?
|
736
833
|
cmm = cmm.to_s.upcase.strip
|
737
834
|
unless VALID_CLIENT_MIN_MESSAGES.include?(cmm)
|
738
835
|
raise Error, "Unsupported client_min_messages setting: #{cmm}"
|
@@ -775,12 +872,12 @@ module Sequel
|
|
775
872
|
end
|
776
873
|
end
|
777
874
|
|
778
|
-
#
|
875
|
+
# SEQUEL5: Remove
|
779
876
|
def conversion_procs_updated
|
780
877
|
nil
|
781
878
|
end
|
782
879
|
|
783
|
-
#
|
880
|
+
# SEQUEL5: Remove
|
784
881
|
def convert_named_procs_to_procs(named_procs)
|
785
882
|
h = {}
|
786
883
|
from(:pg_type).where(:typtype=>['b', 'e'], :typname=>named_procs.keys.map(&:to_s)).select_map([:oid, :typname]).each do |oid, name|
|
@@ -789,12 +886,12 @@ module Sequel
|
|
789
886
|
h
|
790
887
|
end
|
791
888
|
|
792
|
-
#
|
793
|
-
# the conversion procs for this instance.
|
889
|
+
# SEQUEL5: Remove
|
794
890
|
def copy_conversion_procs(oids)
|
891
|
+
Sequel::Deprecation.deprecate("Database#copy_conversion_procs", "There is no reason to use this anymore")
|
795
892
|
procs = conversion_procs
|
796
893
|
oids.each do |oid|
|
797
|
-
procs[oid] =
|
894
|
+
procs[oid] = PG__TYPES[oid]
|
798
895
|
end
|
799
896
|
conversion_procs_updated
|
800
897
|
end
|
@@ -965,11 +1062,6 @@ module Sequel
|
|
965
1062
|
create_view_sql_append_columns("CREATE #{'OR REPLACE 'if options[:replace]}#{'TEMPORARY 'if options[:temp]}#{'RECURSIVE ' if options[:recursive]}#{'MATERIALIZED ' if options[:materialized]}VIEW #{quote_schema_table(name)}", options[:columns] || options[:recursive])
|
966
1063
|
end
|
967
1064
|
|
968
|
-
# The errors that the main adapters can raise, depends on the adapter being used
|
969
|
-
def database_error_classes
|
970
|
-
CONVERTED_EXCEPTIONS
|
971
|
-
end
|
972
|
-
|
973
1065
|
# SQL for dropping a function from the database.
|
974
1066
|
def drop_function_sql(name, opts=OPTS)
|
975
1067
|
"DROP FUNCTION#{' IF EXISTS' if opts[:if_exists]} #{name}#{sql_function_args(opts[:args])}#{' CASCADE' if opts[:cascade]}"
|
@@ -1017,9 +1109,9 @@ module Sequel
|
|
1017
1109
|
ds.where{{pg_namespace[:nspname]=>expr}}
|
1018
1110
|
end
|
1019
1111
|
|
1020
|
-
#
|
1112
|
+
# SEQUEL5: Remove
|
1021
1113
|
def get_conversion_procs
|
1022
|
-
procs =
|
1114
|
+
procs = PG__TYPES.dup
|
1023
1115
|
procs[1184] = procs[1114] = method(:to_application_timestamp)
|
1024
1116
|
unless PG_NAMED__TYPES.empty?
|
1025
1117
|
Sequel::Deprecation.deprecate("Sequel::PG_NAMED_TYPES", "Call Database#add_named_conversion_proc directly for each Database instance where you want to support the following type(s): #{PG_NAMED__TYPES.keys.join(', ')}")
|
@@ -1056,8 +1148,10 @@ module Sequel
|
|
1056
1148
|
@primary_keys = {}
|
1057
1149
|
@primary_key_sequences = {}
|
1058
1150
|
@supported_types = {}
|
1059
|
-
@conversion_procs =
|
1060
|
-
|
1151
|
+
@conversion_procs = get_conversion_procs # SEQUEL5: Remove
|
1152
|
+
conversion_procs_updated # SEQUEL5: Remove
|
1153
|
+
# @conversion_procs = CONVERSION_PROCS.dup # SEQUEL5
|
1154
|
+
# procs[1184] = procs[1114] = method(:to_application_timestamp) # SEQUEL5
|
1061
1155
|
end
|
1062
1156
|
|
1063
1157
|
# Backbone of the tables and views support.
|
@@ -1299,16 +1393,24 @@ module Sequel
|
|
1299
1393
|
AS = ' AS '.freeze
|
1300
1394
|
Sequel::Deprecation.deprecate_constant(self, :AS)
|
1301
1395
|
XOR_OP = ' # '.freeze
|
1396
|
+
Sequel::Deprecation.deprecate_constant(self, :XOR_OP)
|
1302
1397
|
CRLF = "\r\n".freeze
|
1398
|
+
Sequel::Deprecation.deprecate_constant(self, :CRLF)
|
1303
1399
|
BLOB_RE = /[\000-\037\047\134\177-\377]/n.freeze
|
1400
|
+
Sequel::Deprecation.deprecate_constant(self, :BLOB_RE)
|
1304
1401
|
WINDOW = " WINDOW ".freeze
|
1402
|
+
Sequel::Deprecation.deprecate_constant(self, :WINDOW)
|
1305
1403
|
SELECT_VALUES = "VALUES ".freeze
|
1404
|
+
Sequel::Deprecation.deprecate_constant(self, :SELECT_VALUES)
|
1306
1405
|
EMPTY_STRING = ''.freeze
|
1406
|
+
Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
|
1307
1407
|
SKIP_LOCKED = " SKIP LOCKED".freeze
|
1408
|
+
Sequel::Deprecation.deprecate_constant(self, :SKIP_LOCKED)
|
1409
|
+
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:cursor, :insert_conflict]).freeze
|
1410
|
+
Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
|
1308
1411
|
|
1309
1412
|
NULL = LiteralString.new('NULL').freeze
|
1310
|
-
LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each(&:freeze)
|
1311
|
-
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:cursor, :insert_conflict]).freeze
|
1413
|
+
LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each(&:freeze)#.freeze # SEQUEL5
|
1312
1414
|
|
1313
1415
|
Dataset.def_sql_method(self, :delete, [['if server_version >= 90100', %w'with delete from using where returning'], ['else', %w'delete from using where returning']])
|
1314
1416
|
Dataset.def_sql_method(self, :insert, [['if server_version >= 90500', %w'with insert into columns values conflict returning'], ['elsif server_version >= 90100', %w'with insert into columns values returning'], ['else', %w'insert into columns values returning']])
|
@@ -1768,7 +1870,7 @@ module Sequel
|
|
1768
1870
|
sql << "'" << v.gsub("'", "''") << "'"
|
1769
1871
|
end
|
1770
1872
|
|
1771
|
-
# PostgreSQL uses
|
1873
|
+
# PostgreSQL uses true for true values
|
1772
1874
|
def literal_true
|
1773
1875
|
'true'
|
1774
1876
|
end
|
@@ -1779,8 +1881,8 @@ module Sequel
|
|
1779
1881
|
end
|
1780
1882
|
|
1781
1883
|
# Dataset options that do not affect the generated SQL.
|
1782
|
-
def
|
1783
|
-
|
1884
|
+
def non_sql_option?(key)
|
1885
|
+
super || key == :cursor || key == :insert_conflict
|
1784
1886
|
end
|
1785
1887
|
|
1786
1888
|
# PostgreSQL requires parentheses around compound datasets if they use
|