sequel 5.2.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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)