sequel 5.2.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +32 -0
  3. data/bin/sequel +5 -6
  4. data/doc/release_notes/5.3.0.txt +121 -0
  5. data/doc/schema_modification.rdoc +15 -4
  6. data/doc/testing.rdoc +1 -0
  7. data/lib/sequel/adapters/jdbc.rb +4 -0
  8. data/lib/sequel/adapters/jdbc/postgresql.rb +15 -0
  9. data/lib/sequel/adapters/oracle.rb +2 -1
  10. data/lib/sequel/adapters/postgres.rb +4 -0
  11. data/lib/sequel/adapters/shared/mysql.rb +38 -3
  12. data/lib/sequel/adapters/shared/postgres.rb +15 -6
  13. data/lib/sequel/adapters/shared/sqlite.rb +10 -0
  14. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -0
  15. data/lib/sequel/connection_pool.rb +12 -0
  16. data/lib/sequel/database/misc.rb +13 -0
  17. data/lib/sequel/dataset/dataset_module.rb +1 -1
  18. data/lib/sequel/dataset/features.rb +5 -0
  19. data/lib/sequel/dataset/query.rb +20 -6
  20. data/lib/sequel/dataset/sql.rb +3 -0
  21. data/lib/sequel/extensions/pg_extended_date_support.rb +15 -0
  22. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  23. data/lib/sequel/model/associations.rb +1 -0
  24. data/lib/sequel/model/base.rb +4 -11
  25. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  26. data/lib/sequel/version.rb +1 -1
  27. data/spec/adapters/postgres_spec.rb +5 -34
  28. data/spec/core/database_spec.rb +32 -0
  29. data/spec/core/dataset_spec.rb +19 -0
  30. data/spec/core/mock_adapter_spec.rb +65 -0
  31. data/spec/extensions/association_pks_spec.rb +26 -33
  32. data/spec/extensions/class_table_inheritance_spec.rb +18 -32
  33. data/spec/extensions/composition_spec.rb +7 -23
  34. data/spec/extensions/list_spec.rb +4 -5
  35. data/spec/extensions/many_through_many_spec.rb +24 -32
  36. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  37. data/spec/extensions/pg_array_associations_spec.rb +18 -25
  38. data/spec/extensions/pg_extended_date_support_spec.rb +13 -0
  39. data/spec/extensions/pg_hstore_spec.rb +2 -2
  40. data/spec/extensions/prepared_statements_safe_spec.rb +6 -6
  41. data/spec/extensions/pretty_table_spec.rb +39 -8
  42. data/spec/extensions/rcte_tree_spec.rb +22 -33
  43. data/spec/extensions/schema_dumper_spec.rb +42 -31
  44. data/spec/extensions/serialization_spec.rb +3 -3
  45. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  46. data/spec/extensions/timestamps_spec.rb +2 -4
  47. data/spec/extensions/update_or_create_spec.rb +11 -15
  48. data/spec/extensions/uuid_spec.rb +2 -3
  49. data/spec/extensions/xml_serializer_spec.rb +5 -10
  50. data/spec/integration/database_test.rb +1 -1
  51. data/spec/integration/dataset_test.rb +7 -0
  52. data/spec/integration/plugin_test.rb +1 -1
  53. data/spec/integration/schema_test.rb +3 -3
  54. data/spec/integration/spec_helper.rb +4 -0
  55. data/spec/model/base_spec.rb +6 -0
  56. data/spec/model/eager_loading_spec.rb +31 -6
  57. data/spec/model/model_spec.rb +9 -19
  58. data/spec/model/record_spec.rb +4 -8
  59. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef9b7568e8d79bc20f28c50164f3f51da9882fa6
4
- data.tar.gz: 24f2cda374fdc6e9b2e552d69cdad19542a9a06f
3
+ metadata.gz: ac284f3deba98d7ef4b7213b3f6d17c9df344333
4
+ data.tar.gz: 3396c7263e758fa01b6820cd1eed79e9f1676be0
5
5
  SHA512:
6
- metadata.gz: 142a793eec4984fb6e83637758cb2211981199caa498b8bcee98cc87c0e4facf16b2c6829df0fc5cd8a783c99a728eefb84b53fb36d49d312815f712c6cdb667
7
- data.tar.gz: '083f6448c19ec9d55567954c316b6a14934f1743e599ccf459b276485064f0af749a7492f42b728ee70df38bf61589775cdd77157b7fee3fcfdf5518d9719f3f'
6
+ metadata.gz: c0c7a62b97b76a7a10a8ebe6df53c17de99efb70a2403a18362a32bb11a66b736885430911e982a834d60013ba84c154ebb7609c0b1d7d8c103fe8d4000cb549
7
+ data.tar.gz: 9cffa3dd8f2c87aec5598a5ac14676d061c6214f24f1851f721952c3b9c90a263dd2c4d220dfc828f87181faafe9a4d61fe7daf3d82861db0f752871450611f6
data/CHANGELOG CHANGED
@@ -1,3 +1,35 @@
1
+ === 5.3.0 (2017-12-01)
2
+
3
+ * Add logger to Database instance before making first connection in bin/sequel (jeremyevans)
4
+
5
+ * Drop support for PostgreSQL <8.1 in Database#indexes (jeremyevans)
6
+
7
+ * Add synchronize_sql extension, for checking out a connection around SQL generation (KJTsanaktsidis, jeremyevans) (#1451)
8
+
9
+ * Deprecate Dataset#where calls with no existing filter, no argument, and where the virtual row block returns nil (jeremyevans) (#1454)
10
+
11
+ * Add DatasetModule#reverse for simpler use of descending orders (jeremyevans)
12
+
13
+ * Support WITH clauses in subqueries on SQLite, but not in UNION/INTERSECT/EXCEPT (jeremyevans)
14
+
15
+ * Hoist WITH clauses to INSERT statement level if INSERT subquery uses a CTE on MSSQL (jeremyevans)
16
+
17
+ * Respect indislive and ignore indcheckxmin index attributes when using Database#indexes on PostgreSQL (jeremyevans)
18
+
19
+ * Explicitly disallow use of server-side prepared statements when using Dataset#call in the jdbc/postgresql adapter (jeremyevans) (#1448)
20
+
21
+ * Support common table expressions, window functions, dropping CHECK constraints, and recognizing CURRENT_DATE defaults on MariaDB 10.2+ (jeremyevans)
22
+
23
+ * Make Database#reset_primary_key_sequence work on PostgreSQL 10+ (jeremyevans)
24
+
25
+ * Support :connect_sqls Database option for easily issuing sql commands on all new connections (jeremyevans)
26
+
27
+ * Support :extensions Database option for loading extensions when initializing, useful in connection strings (jeremyevans)
28
+
29
+ * Avoid warning if trying to rollback after a commit or rollback raises an exception in the postgres adapter (jeremyevans)
30
+
31
+ * Support Date::Infinity values in the pg_extended_date_support extension (jeremyevans)
32
+
1
33
  === 5.2.0 (2017-10-27)
2
34
 
3
35
  * Fix type conversion for smallint unsigned and integer unsigned types on jdbc/mysql (jeremyevans) (#1443)
data/bin/sequel CHANGED
@@ -124,20 +124,19 @@ error_proc["Error: Must specify -m if using -M"] if migrate_ver && !migrate_dir
124
124
  error_proc["Error: Cannot specify #{exclusive_options.map{|v| "-#{v}"}.join(' and ')} together"] if exclusive_options.length > 1
125
125
 
126
126
  connect_proc = lambda do |database|
127
- db = if database.nil? || database.empty?
128
- Sequel.connect('mock:///')
127
+ db_opts = {:test=>test, :loggers=>loggers}
128
+ if database.nil? || database.empty?
129
+ Sequel.connect('mock:///', db_opts)
129
130
  elsif File.exist?(database)
130
131
  require 'yaml'
131
132
  env ||= "development"
132
133
  db_config = YAML.load_file(database)
133
134
  db_config = db_config[env] || db_config[env.to_sym] || db_config
134
135
  db_config.keys.each{|k| db_config[k.to_sym] = db_config.delete(k)}
135
- Sequel.connect(db_config, :test=>test)
136
+ Sequel.connect(db_config, db_opts)
136
137
  else
137
- Sequel.connect(database, :test=>test)
138
+ Sequel.connect(database, db_opts)
138
139
  end
139
- db.loggers = loggers
140
- db
141
140
  end
142
141
 
143
142
  begin
@@ -0,0 +1,121 @@
1
+ = New Features
2
+
3
+ * An :extensions Database option is now supported, which will load the
4
+ named extensions into the Database before any connections are
5
+ initiated:
6
+
7
+ DB = Sequel.connect('mock:///', :extensions=>[:error_sql, :synchronize_sql])
8
+ DB = Sequel.connect('mock:///?extensions=error_sql,synchronize_sql')
9
+
10
+ * A :connect_sqls Database option is now supported, which will issue
11
+ the given queries on all new connections:
12
+
13
+ DB = Sequel.connect('postgres:///', :connect_sqls=>[
14
+ 'SET random_page_cost = 1.0',
15
+ "SET default_tablespace = 'foo'"
16
+ ])
17
+
18
+ * DatasetModule#reverse has been added for simpler use of descending
19
+ orders:
20
+
21
+ class Foo < Sequel::Model
22
+ dataset_module do
23
+ reverse :newest_first, :created_at
24
+ end
25
+ end
26
+ Foo.newest_first.first(10)
27
+
28
+ * A synchronize_sql extension has been added. This extension checks
29
+ out a connection around SQL string creation, and is useful in the
30
+ cases where escaping values in the query requires a connection and
31
+ a large number of values need to be escaped.
32
+
33
+ * The following features are now supported on MariaDB 10.2+:
34
+
35
+ * Common table expressions.
36
+
37
+ * Window functions.
38
+
39
+ * Dropping CHECK constraints. Older versions of MariaDB/MySQL
40
+ ignored CHECK constraints that were added, and Sequel did not
41
+ attempt to filter them out, so Sequel did not require changes to
42
+ add CHECK constraints. MariaDB 10.2 CHECK constraints work
43
+ correctly with Sequel's constraint_validations extension/plugin.
44
+
45
+ * Raising CHECK constraint violations as
46
+ Sequel::CheckConstraintViolation instances.
47
+
48
+ * Recognizing curdate() as Sequel::CURRENT_DATE when used as the
49
+ default value for a date column.
50
+
51
+ * Date::Infinity values are now supported in the
52
+ pg_extended_date_support extension:
53
+
54
+ DB.convert_infinite_timestamps = :date
55
+
56
+ This returns infinite dates/timestamps as Date::Infinity instances,
57
+ and literalizes Date::Infinity instances correctly.
58
+
59
+ = Improvements
60
+
61
+ * Database#reset_primary_key_sequence now works correctly on
62
+ PostgreSQL 10.
63
+
64
+ * If a commit or rollback raises an exception when using the postgres
65
+ adapter, Sequel will check the connection's current transaction
66
+ status and only send another rollback if the connection is currently
67
+ inside a transaction. This fixes a warning that is issued in most
68
+ cases if a commit or rollback fails.
69
+
70
+ * The jdbc/postgresql adapter now forces JDBC PreparedStatement
71
+ instances created by Dataset#call to never be prepared server side,
72
+ working around an caching issue in the jdbc-postgres drier in
73
+ versions greater than 9.4.1200.
74
+
75
+ * Database#indexes will no longer return indexes which are in the
76
+ process of being dropped on PostgreSQL 9.3+. Additionally,
77
+ Database#indexes will now return indexes that have indcheckxmin
78
+ set. The previous removal of indexes with indcheckxmin set is
79
+ more likely to cause false negatives than correctly remove
80
+ indexes not yet valid.
81
+
82
+ * Common table expressions are no longer hoisted from subqueries on
83
+ SQLite. They are still hoisted from queries used in
84
+ UNION/INSERT/EXCEPT, since SQLite does not support common table
85
+ expressions at that level.
86
+
87
+ * On Microsoft SQL Server, using an INSERT query with a subquery that
88
+ uses a common table expression now hoists the common table
89
+ expression from subquery level to main query level, allowing such
90
+ queries to work.
91
+
92
+ * An additional disconnect error is now recognized in the oracle
93
+ adapter.
94
+
95
+ * bin/sequel now adds a Database logger before the initial
96
+ connection is made, allowing you to see any connection setup
97
+ statements issued to the database.
98
+
99
+ = Backwards Compatibility
100
+
101
+ * Calling a filtering method with no argument and a virtual row
102
+ block that returns nil on a dataset with no existing filter is
103
+ deprecated in this version and will emit a warning. The behavior
104
+ in this version remains the same, where the dataset is not
105
+ modified. The behavior will change in Sequel 5.4.0 so that a
106
+ WHERE NULL filter will be added in that case, instead of the
107
+ filter being ignored, so that the behavior is similar to calling
108
+ the filtering method with a nil argument.
109
+
110
+ # Sequel 5.3.0
111
+ DB[:a].where{nil}
112
+ # SELECT * FROM a
113
+
114
+ # Sequel 5.4.0
115
+ DB[:a].where{nil}
116
+ # SELECT * FROM a WHERE NULL
117
+
118
+ * Support for PostgreSQL <8.1 has been dropped from Database#indexes.
119
+ Sequel's PostgreSQL support requires >=8.2 for Dataset#insert to
120
+ work, so it doesn't make sense to support earlier versions in other
121
+ cases.
@@ -398,15 +398,26 @@ creates a new column:
398
398
  end
399
399
 
400
400
  If you want to add a new foreign key constraint to an existing column, you provide an
401
- array with a single element. It's encouraged to provide a name when adding the constraint,
402
- via the :name option:
401
+ array with a single element:
402
+
403
+ alter_table(:albums) do
404
+ add_foreign_key [:artist_id], :artists
405
+ end
406
+
407
+ It's encouraged to provide a name when adding the constraint, via the :foreign_key_constraint_name
408
+ option if adding the column and the constraint:
409
+
410
+ alter_table(:albums) do
411
+ add_foreign_key :artist_id, :artists, foreign_key_constraint_name: :albums_artist_id_fkey
412
+ end
413
+
414
+ or via the :name option if just adding the constraint:
403
415
 
404
416
  alter_table(:albums) do
405
417
  add_foreign_key [:artist_id], :artists, name: :albums_artist_id_fkey
406
418
  end
407
419
 
408
- To set up a multiple column foreign key constraint, use an array with multiple column
409
- symbols:
420
+ To set up a multiple column foreign key constraint, use an array with multiple column symbols:
410
421
 
411
422
  alter_table(:albums) do
412
423
  add_foreign_key [:artist_name, :artist_location], :artists, name: :albums_artist_name_location_fkey
@@ -164,3 +164,4 @@ SEQUEL_NO_CHECK_SQLS :: Don't check for specific SQL syntax when running the spe
164
164
  SEQUEL_CHECK_PENDING :: Try running all specs (note, can cause lockups for some adapters), and raise errors for skipped specs that don't fail
165
165
  SEQUEL_NO_PENDING :: Don't skip any specs, try running all specs (note, can cause lockups for some adapters)
166
166
  SEQUEL_SPLIT_SYMBOLS :: Turn on symbol splitting when running the adapter and integration specs
167
+ SEQUEL_SYNCHRONIZE_SQL :: Use the synchronize_sql extension when running the specs
@@ -404,6 +404,10 @@ module Sequel
404
404
  cps = cps[1]
405
405
  else
406
406
  log_connection_yield("CLOSE #{name}", conn){cps[1].close} if cps
407
+ if name
408
+ opts = Hash[opts]
409
+ opts[:name] = name
410
+ end
407
411
  cps = log_connection_yield("PREPARE#{" #{name}:" if name} #{sql}", conn){prepare_jdbc_statement(conn, sql, opts)}
408
412
  if size = fetch_size
409
413
  cps.setFetchSize(size)
@@ -151,6 +151,21 @@ module Sequel
151
151
  nil
152
152
  end
153
153
 
154
+ # Work around issue when using Sequel's bound variable support where the
155
+ # same SQL is used in different bound variable calls, but the schema has
156
+ # changed between the calls. This is necessary as jdbc-postgres versions
157
+ # after 9.4.1200 violate the JDBC API. These versions cache separate
158
+ # PreparedStatement instances, which are eventually prepared server side after the
159
+ # prepareThreshold is met. The JDBC API violation is that PreparedStatement#close
160
+ # does not release the server side prepared statement.
161
+ def prepare_jdbc_statement(conn, sql, opts)
162
+ ps = super
163
+ unless opts[:name]
164
+ ps.prepare_threshold = 0
165
+ end
166
+ ps
167
+ end
168
+
154
169
  # If the given argument is a recognized PostgreSQL-specific type, create
155
170
  # a PGObject instance with unknown type and the bound argument string value,
156
171
  # and set that as the prepared statement argument.
@@ -11,9 +11,10 @@ module Sequel
11
11
 
12
12
  # ORA-00028: your session has been killed
13
13
  # ORA-01012: not logged on
14
+ # ORA-02396: exceeded maximum idle time, please connect again
14
15
  # ORA-03113: end-of-file on communication channel
15
16
  # ORA-03114: not connected to ORACLE
16
- CONNECTION_ERROR_CODES = [ 28, 1012, 3113, 3114 ].freeze
17
+ CONNECTION_ERROR_CODES = [ 28, 1012, 2396, 3113, 3114 ].freeze
17
18
 
18
19
  ORACLE_TYPES = {
19
20
  :blob=>lambda{|b| Sequel::SQL::Blob.new(b.read)},
@@ -549,6 +549,10 @@ module Sequel
549
549
  def log_connection_execute(conn, sql)
550
550
  conn.execute(sql)
551
551
  end
552
+
553
+ def rollback_transaction(conn, opts=OPTS)
554
+ super unless conn.transaction_status == 0
555
+ end
552
556
  end
553
557
 
554
558
  class Dataset < Sequel::Dataset
@@ -74,6 +74,7 @@ module Sequel
74
74
 
75
75
  def freeze
76
76
  server_version
77
+ mariadb?
77
78
  supports_timestamp_usecs?
78
79
  super
79
80
  end
@@ -116,10 +117,16 @@ module Sequel
116
117
  run("XA ROLLBACK #{literal(transaction_id)}", opts)
117
118
  end
118
119
 
120
+ # Whether the database is MariaDB and not MySQL
121
+ def mariadb?
122
+ return @is_mariadb if defined?(@is_mariadb)
123
+ @is_mariadb = !(fetch('SELECT version()').single_value! !~ /mariadb/i)
124
+ end
125
+
119
126
  # Get version of MySQL server, used for determined capabilities.
120
127
  def server_version
121
128
  @server_version ||= begin
122
- m = /(\d+)\.(\d+)\.(\d+)/.match(get(SQL::Function.new(:version)))
129
+ m = /(\d+)\.(\d+)\.(\d+)/.match(fetch('SELECT version()').single_value!)
123
130
  (m[1].to_i * 10000) + (m[2].to_i * 100) + m[3].to_i
124
131
  end
125
132
  end
@@ -237,6 +244,10 @@ module Sequel
237
244
  "DROP FOREIGN KEY #{quote_identifier(name)}"
238
245
  when :unique
239
246
  "DROP INDEX #{quote_identifier(op[:name])}"
247
+ when :check, nil
248
+ if supports_check_constraints?
249
+ "DROP CONSTRAINT #{quote_identifier(op[:name])}"
250
+ end
240
251
  end
241
252
  end
242
253
 
@@ -265,6 +276,11 @@ module Sequel
265
276
  super(default, type)
266
277
  end
267
278
 
279
+ def column_schema_to_ruby_default(default, type)
280
+ return Sequel::CURRENT_DATE if mariadb? && server_version >= 100200 && default == 'curdate()'
281
+ super
282
+ end
283
+
268
284
  # Don't allow combining adding foreign key operations with other
269
285
  # operations, since in some cases adding a foreign key constraint in
270
286
  # the same query as other operations results in MySQL error 150.
@@ -390,6 +406,7 @@ module Sequel
390
406
  /foreign key constraint fails/ => ForeignKeyConstraintViolation,
391
407
  /cannot be null/ => NotNullConstraintViolation,
392
408
  /Deadlock found when trying to get lock; try restarting transaction/ => SerializationFailure,
409
+ /CONSTRAINT .+ failed for/ => CheckConstraintViolation,
393
410
  }.freeze
394
411
  def database_error_regexps
395
412
  DATABASE_ERROR_REGEXPS
@@ -470,6 +487,11 @@ module Sequel
470
487
  server_version >= 50600 && (op[:op] == :drop_index || (op[:op] == :drop_constraint && op[:type] == :unique))
471
488
  end
472
489
 
490
+ # Whether the database supports CHECK constraints
491
+ def supports_check_constraints?
492
+ mariadb? && server_version >= 100200
493
+ end
494
+
473
495
  # MySQL can combine multiple alter table ops into a single query.
474
496
  def supports_combining_alter_table_ops?
475
497
  true
@@ -545,7 +567,7 @@ module Sequel
545
567
 
546
568
  Dataset.def_sql_method(self, :delete, %w'delete from where order limit')
547
569
  Dataset.def_sql_method(self, :insert, %w'insert ignore into columns values on_duplicate_key_update')
548
- Dataset.def_sql_method(self, :select, %w'select distinct calc_found_rows columns from join where group having compounds order limit lock')
570
+ Dataset.def_sql_method(self, :select, %w'with select distinct calc_found_rows columns from join where group having compounds order limit lock')
549
571
  Dataset.def_sql_method(self, :update, %w'update ignore table set where order limit')
550
572
 
551
573
  include Sequel::Dataset::Replace
@@ -713,6 +735,10 @@ module Sequel
713
735
  sql << '`' << c.to_s.gsub('`', '``') << '`'
714
736
  end
715
737
 
738
+ def supports_cte?(type=:select)
739
+ type == :select && db.mariadb? && db.server_version >= 100200
740
+ end
741
+
716
742
  # MySQL does not support derived column lists
717
743
  def supports_derived_column_lists?
718
744
  false
@@ -760,7 +786,11 @@ module Sequel
760
786
  def supports_timestamp_usecs?
761
787
  db.supports_timestamp_usecs?
762
788
  end
763
-
789
+
790
+ def supports_window_functions?
791
+ db.mariadb? && db.server_version >= 100200
792
+ end
793
+
764
794
  # Sets up the update methods to use UPDATE IGNORE.
765
795
  # Useful if you have a unique key and want to just skip
766
796
  # updating rows that violate the unique key restriction.
@@ -929,6 +959,11 @@ module Sequel
929
959
  sql << ' SQL_CALC_FOUND_ROWS' if opts[:calc_found_rows]
930
960
  end
931
961
 
962
+ # Use WITH RECURSIVE instead of WITH if any of the CTEs is recursive
963
+ def select_with_sql_base
964
+ opts[:with].any?{|w| w[:recursive]} ? "WITH RECURSIVE " : super
965
+ end
966
+
932
967
  # MySQL uses WITH ROLLUP syntax.
933
968
  def uses_with_rollup?
934
969
  true
@@ -203,7 +203,6 @@ module Sequel
203
203
  # This should be used for types without fixed OIDs, which includes all types that
204
204
  # are not included in a default PostgreSQL installation.
205
205
  def add_named_conversion_proc(name, &block)
206
- name = name.to_s if name.is_a?(Symbol)
207
206
  unless oid = from(:pg_type).where(:typtype=>['b', 'e'], :typname=>name.to_s).get(:oid)
208
207
  raise Error, "No matching type in pg_type for #{name.inspect}"
209
208
  end
@@ -411,10 +410,9 @@ module Sequel
411
410
  else
412
411
  range = 0...32
413
412
  order = [Sequel[:indc][:relname], SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(Sequel[:ind][:indkey], [x]), x]}, 32, Sequel[:att][:attnum])]
414
- attnums = range.map{|x| SQL::Subscript.new(Sequel[:ind][:indkey], [x])} unless server_version >= 80100
415
413
  end
416
414
 
417
- attnums ||= SQL::Function.new(:ANY, Sequel[:ind][:indkey])
415
+ attnums = SQL::Function.new(:ANY, Sequel[:ind][:indkey])
418
416
 
419
417
  ds = metadata_dataset.
420
418
  from{pg_class.as(:tab)}.
@@ -432,7 +430,8 @@ module Sequel
432
430
  order(*order).
433
431
  select{[indc[:relname].as(:name), ind[:indisunique].as(:unique), att[:attname].as(:column), con[:condeferrable].as(:deferrable)]}
434
432
 
435
- ds = ds.where(:indisready=>true, :indcheckxmin=>false) if server_version >= 80300
433
+ ds = ds.where(:indisready=>true) if server_version >= 80300
434
+ ds = ds.where(:indislive=>true) if server_version >= 90300
436
435
 
437
436
  indexes = {}
438
437
  ds.each do |r|
@@ -506,10 +505,20 @@ module Sequel
506
505
  return unless seq = primary_key_sequence(table)
507
506
  pk = SQL::Identifier.new(primary_key(table))
508
507
  db = self
509
- seq_ds = db.from(LiteralString.new(seq))
510
508
  s, t = schema_and_table(table)
511
509
  table = Sequel.qualify(s, t) if s
512
- get{setval(seq, db[table].select{coalesce(max(pk)+seq_ds.select{:increment_by}, seq_ds.select(:min_value))}, false)}
510
+
511
+ if server_version >= 100000
512
+ seq_ds = metadata_dataset.from(:pg_sequence).where(:seqrelid=>regclass_oid(LiteralString.new(seq)))
513
+ increment_by = :seqincrement
514
+ min_value = :seqmin
515
+ else
516
+ seq_ds = metadata_dataset.from(LiteralString.new(seq))
517
+ increment_by = :increment_by
518
+ min_value = :min_value
519
+ end
520
+
521
+ get{setval(seq, db[table].select(coalesce(max(pk)+seq_ds.select(increment_by), seq_ds.select(min_value))), false)}
513
522
  end
514
523
 
515
524
  def rollback_prepared_transaction(transaction_id, opts=OPTS)