# If we're on MySQL then the existing index on path is ok. But on
# If we're on MySQL then the existing index on path is ok. But on
# Postgres we need to clean things up:
# Postgres we need to clean things up:
returnunlessGitlab::Database.postgresql?
returnunlessGitlab::Database.postgresql?
if_not_exists=Gitlab::Database.version.to_f>=9.5?"IF NOT EXISTS":""
if_not_exists=Gitlab::Database.version.to_f>=9.5?"IF NOT EXISTS":""
# Unique index on lower(path) across both types of redirect_routes:
# Unique index on lower(path) across both types of redirect_routes:
execute("CREATE UNIQUE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_UNIQUE} ON redirect_routes (lower(path) varchar_pattern_ops);")
execute("CREATE UNIQUE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_UNIQUE} ON redirect_routes (lower(path) varchar_pattern_ops);")
# Make two indexes on path -- one for permanent and one for temporary routes:
# Make two indexes on path -- one for permanent and one for temporary routes:
execute("CREATE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_PERM} ON redirect_routes (lower(path) varchar_pattern_ops) where (permanent);")
execute("CREATE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_PERM} ON redirect_routes (lower(path) varchar_pattern_ops) where (permanent);")
execute("CREATE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_TEMP} ON redirect_routes (lower(path) varchar_pattern_ops) where (not permanent or permanent is null) ;")
execute("CREATE INDEX CONCURRENTLY #{if_not_exists}#{INDEX_NAME_TEMP} ON redirect_routes (lower(path) varchar_pattern_ops) where (not permanent or permanent is null) ;")
# Remove the old indexes:
# Remove the old indexes:
# This one needed to be on lower(path) but wasn't so it's replaced with the two above
# This one needed to be on lower(path) but wasn't so it's replaced with the two above
execute"DROP INDEX CONCURRENTLY IF EXISTS #{OLD_INDEX_NAME_PATH_TPOPS};"
execute"DROP INDEX CONCURRENTLY IF EXISTS #{OLD_INDEX_NAME_PATH_TPOPS};"
# This one isn't needed because we only ever do = and LIKE on this
# This one isn't needed because we only ever do = and LIKE on this
# column so the varchar_pattern_ops index is sufficient
# column so the varchar_pattern_ops index is sufficient
execute"DROP INDEX CONCURRENTLY IF EXISTS #{OLD_INDEX_NAME_PATH_LOWER};"
execute"DROP INDEX CONCURRENTLY IF EXISTS #{OLD_INDEX_NAME_PATH_LOWER};"
end
end
end
defdown
defdown
disable_statement_timeout
disable_statement_timeout(transaction: false)do
add_concurrent_index(:redirect_routes,:permanent)
add_concurrent_index(:redirect_routes,:permanent)
returnunlessGitlab::Database.postgresql?
returnunlessGitlab::Database.postgresql?
execute("CREATE INDEX CONCURRENTLY #{OLD_INDEX_NAME_PATH_TPOPS} ON redirect_routes (path varchar_pattern_ops);")
execute("CREATE INDEX CONCURRENTLY #{OLD_INDEX_NAME_PATH_LOWER} ON redirect_routes (LOWER(path));")
execute("CREATE INDEX CONCURRENTLY #{OLD_INDEX_NAME_PATH_TPOPS} ON redirect_routes (path varchar_pattern_ops);")
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_UNIQUE};")
execute("CREATE INDEX CONCURRENTLY #{OLD_INDEX_NAME_PATH_LOWER} ON redirect_routes (LOWER(path));")
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_PERM};")
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_TEMP};")
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_UNIQUE};")
end
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_PERM};")
execute("DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_TEMP};")
execute"DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_PERM};"
execute"DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_PERM};"
execute"DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_TEMP};"
execute"DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME_TEMP};"
end
end
end
remove_column(:redirect_routes,:permanent)
remove_column(:redirect_routes,:permanent)
...
@@ -28,10 +28,10 @@ class RemovePermanentFromRedirectRoutes < ActiveRecord::Migration
...
@@ -28,10 +28,10 @@ class RemovePermanentFromRedirectRoutes < ActiveRecord::Migration
add_column(:redirect_routes,:permanent,:boolean)
add_column(:redirect_routes,:permanent,:boolean)
ifGitlab::Database.postgresql?
ifGitlab::Database.postgresql?
disable_statement_timeout
disable_statement_timeout(transaction: false)do
execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME_PERM} ON redirect_routes (lower(path) varchar_pattern_ops) where (permanent);")
execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME_PERM} ON redirect_routes (lower(path) varchar_pattern_ops) where (permanent);")
execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME_TEMP} ON redirect_routes (lower(path) varchar_pattern_ops) where (not permanent or permanent is null) ;")
execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME_TEMP} ON redirect_routes (lower(path) varchar_pattern_ops) where (not permanent or permanent is null) ;")