From 8370980b12f59d5439344d4de89d4552f05a3d13 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 1 Nov 2017 18:40:45 +0100 Subject: [PATCH] Make Database#reset_primary_key_sequence work on PostgreSQL 10+ Selecting directly from the sequence no longer provides the increment and min value, so the new pg_sequence catalog table needs to be used. --- CHANGELOG | 2 ++ lib/sequel/adapters/shared/postgres.rb | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d184dc5e44..cb4c889c8d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ === master +* Make Database#reset_primary_key_sequence work on PostgreSQL 10+ (jeremyevans) + * Support :connect_sqls Database option for easily issuing sql commands on all new connections (jeremyevans) * Support :extensions Database option for loading extensions when initializing, useful in connection strings (jeremyevans) diff --git a/lib/sequel/adapters/shared/postgres.rb b/lib/sequel/adapters/shared/postgres.rb index 10a47b2ec2..067854f8cb 100644 --- a/lib/sequel/adapters/shared/postgres.rb +++ b/lib/sequel/adapters/shared/postgres.rb @@ -506,10 +506,20 @@ def reset_primary_key_sequence(table) return unless seq = primary_key_sequence(table) pk = SQL::Identifier.new(primary_key(table)) db = self - seq_ds = db.from(LiteralString.new(seq)) s, t = schema_and_table(table) table = Sequel.qualify(s, t) if s - get{setval(seq, db[table].select{coalesce(max(pk)+seq_ds.select{:increment_by}, seq_ds.select(:min_value))}, false)} + + if server_version >= 100000 + seq_ds = metadata_dataset.from(:pg_sequence).where(:seqrelid=>regclass_oid(LiteralString.new(seq))) + increment_by = :seqincrement + min_value = :seqmin + else + seq_ds = metadata_dataset.from(LiteralString.new(seq)) + increment_by = :increment_by + min_value = :min_value + end + + get{setval(seq, db[table].select(coalesce(max(pk)+seq_ds.select(increment_by), seq_ds.select(min_value))), false)} end def rollback_prepared_transaction(transaction_id, opts=OPTS)