31 lines
857 B
Ruby
31 lines
857 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class NextTraversalIdsSiblingFunction < Gitlab::Database::Migration[1.0]
|
||
|
include Gitlab::Database::SchemaHelpers
|
||
|
|
||
|
FUNCTION_NAME = 'next_traversal_ids_sibling'
|
||
|
|
||
|
def up
|
||
|
# Given array [1,2,3,4,5], concatenate the first part of the array [1,2,3,4]
|
||
|
# with the last element in the array (5) after being incremented ([6]).
|
||
|
#
|
||
|
# [1,2,3,4,5] => [1,2,3,4,6]
|
||
|
execute(<<~SQL)
|
||
|
CREATE OR REPLACE FUNCTION #{FUNCTION_NAME}(traversal_ids INT[]) RETURNS INT[]
|
||
|
AS $$
|
||
|
BEGIN
|
||
|
return traversal_ids[1:array_length(traversal_ids, 1)-1] ||
|
||
|
ARRAY[traversal_ids[array_length(traversal_ids, 1)]+1];
|
||
|
END;
|
||
|
$$
|
||
|
LANGUAGE plpgsql
|
||
|
IMMUTABLE
|
||
|
RETURNS NULL ON NULL INPUT;
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
execute("DROP FUNCTION #{FUNCTION_NAME}(traversal_ids INT[])")
|
||
|
end
|
||
|
end
|