From 3bb798756e52368ae2ae4a512e86a543dea8ca21 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Mon, 15 Jan 2018 17:05:51 +0000 Subject: [PATCH] Support PostgreSQL 10 --- changelogs/unreleased/42047-pg-10-support.yml | 5 ++ config/initializers/ar5_pg_10_support.rb | 48 +++++++++++++++++++ doc/install/requirements.md | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/42047-pg-10-support.yml create mode 100644 config/initializers/ar5_pg_10_support.rb diff --git a/changelogs/unreleased/42047-pg-10-support.yml b/changelogs/unreleased/42047-pg-10-support.yml new file mode 100644 index 00000000000..f98e59329c3 --- /dev/null +++ b/changelogs/unreleased/42047-pg-10-support.yml @@ -0,0 +1,5 @@ +--- +title: Support PostgreSQL 10 +merge_request: 16471 +author: +type: added diff --git a/config/initializers/ar5_pg_10_support.rb b/config/initializers/ar5_pg_10_support.rb new file mode 100644 index 00000000000..3d8ccd814a8 --- /dev/null +++ b/config/initializers/ar5_pg_10_support.rb @@ -0,0 +1,48 @@ +raise "Vendored ActiveRecord 5 code! Delete #{__FILE__}!" if ActiveRecord::VERSION::MAJOR >= 5 + +require 'active_record/connection_adapters/postgresql/schema_statements' + +# +# Monkey-patch the refused Rails 4.2 patch at https://github.com/rails/rails/pull/31330 +# +# Updates sequence logic to support PostgreSQL 10. +# +# rubocop:disable all +module ActiveRecord + module ConnectionAdapters + module PostgreSQL + module SchemaStatements + # Resets the sequence of a table's primary key to the maximum value. + def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc: + unless pk and sequence + default_pk, default_sequence = pk_and_sequence_for(table) + + pk ||= default_pk + sequence ||= default_sequence + end + + if @logger && pk && !sequence + @logger.warn "#{table} has primary key #{pk} with no default sequence" + end + + if pk && sequence + quoted_sequence = quote_table_name(sequence) + max_pk = select_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}") + if max_pk.nil? + if postgresql_version >= 100000 + minvalue = select_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass") + else + minvalue = select_value("SELECT min_value FROM #{quoted_sequence}") + end + end + + select_value <<-end_sql, 'SCHEMA' + SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false}) + end_sql + end + end + end + end + end +end +# rubocop:enable all diff --git a/doc/install/requirements.md b/doc/install/requirements.md index baecf9455b0..272148033b5 100644 --- a/doc/install/requirements.md +++ b/doc/install/requirements.md @@ -121,7 +121,7 @@ Existing users using GitLab with MySQL/MariaDB are advised to ### PostgreSQL Requirements -As of GitLab 10.0, PostgreSQL 9.6 or newer (but less than 10) is required, and earlier versions are +As of GitLab 10.0, PostgreSQL 9.6 or newer is required, and earlier versions are not supported. We highly recommend users to use PostgreSQL 9.6 as this is the PostgreSQL version used for development and testing.