Rename table helper raises DMLNotAllowedError

Summary

We implement a database migration helper to rename database tables safely and without downtime. This method is currently non-functional, as the CREATE VIEW ... SELECT gets identified as a SELECT query and is disallowed (because we disallow SELECT and DML in standard migrations). A DMLNotAllowedError is raised instead.

Steps to reproduce

The documented example reproduces this behavior directly:

class TestRenameTableHelper < Gitlab::Database::Migration[2.2]
  enable_lock_retries!

  milestone '16.8'

  def up
    rename_table_safely(:issues, :tickets)
  end
end

When applying this migration, we can see this error:

➜  gitlab git:(master) ✗ bundle exec rake db:migrate
main: == [advisory_lock_connection] object_id: 182800, pg_backend_pid: 312342
main: == 20240102083237 TestRenameTableHelper: migrating ============================
main: -- transaction(nil)
main: -- rename_table(:issues, :tickets)
main:    -> 0.0418s
main: -- execute("CREATE VIEW issues AS SELECT * FROM tickets")
main: == [advisory_lock_connection] object_id: 182800, pg_backend_pid: 312342
rake aborted!
Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DMLNotAllowedError: Select/DML queries (SELECT/UPDATE/DELETE) are disallowed in the DDL (structure) mode. Modifying of '["tickets"]' ([:gitlab_main]) with 'CREATE VIEW issues AS SELECT * FROM tickets /*application:web,db_config_name:main,line:/lib/gitlab/database/rename_table_helpers.rb:9:in `block in rename_table_safely'*/'. For more information visit: https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb:123:in `raise_dml_not_allowed_error'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb:68:in `restrict_to_ddl_only'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb:44:in `analyze'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:89:in `block in process_sql'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:86:in `each'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:86:in `process_sql'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:28:in `block (2 levels) in hook!'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:114:in `with_ignored_recursive_calls'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:27:in `block in hook!'
gitlab-development-kit/gitlab/lib/gitlab/database/rename_table_helpers.rb:9:in `block in rename_table_safely' 
gitlab-development-kit/gitlab/lib/gitlab/database/rename_table_helpers.rb:7:in `rename_table_safely'
gitlab-development-kit/gitlab/db/migrate/20240102083237_test_rename_table_helper.rb:31:in `up'
gitlab-development-kit/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:33:in `block in exec_migration'
gitlab-development-kit/gitlab/lib/gitlab/database/query_analyzer.rb:37:in `within'
gitlab-development-kit/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:30:in `exec_migration'
gitlab-development-kit/gitlab/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb:21:in `exec_migration'
gitlab-development-kit/gitlab/lib/gitlab/database/with_lock_retries.rb:123:in `run_block'
gitlab-development-kit/gitlab/lib/gitlab/database/with_lock_retries.rb:134:in `block in run_block_with_lock_timeout'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/connection_proxy.rb:127:in `public_send'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/connection_proxy.rb:127:in `block in write_using_load_balancer'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/load_balancer.rb:141:in `block in read_write'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/load_balancer.rb:228:in `retry_with_backoff'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/load_balancer.rb:130:in `read_write'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/connection_proxy.rb:126:in `write_using_load_balancer'
gitlab-development-kit/gitlab/lib/gitlab/database/load_balancing/connection_proxy.rb:78:in `transaction'
gitlab-development-kit/gitlab/lib/gitlab/database/with_lock_retries.rb:129:in `run_block_with_lock_timeout'
gitlab-development-kit/gitlab/lib/gitlab/database/with_lock_retries.rb:97:in `run'
gitlab-development-kit/gitlab/lib/gitlab/database/migrations/lock_retry_mixin.rb:34:in `ddl_transaction'
gitlab-development-kit/gitlab/lib/gitlab/database/migrations/runner_backoff/active_record_mixin.rb:21:in `execute_migration_in_transaction'
gitlab-development-kit/gitlab/lib/gitlab/database/migrations/pg_backend_pid.rb:15:in `block in with_advisory_lock_connection'
gitlab-development-kit/gitlab/lib/gitlab/database/migrations/pg_backend_pid.rb:12:in `with_advisory_lock_connection'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Edited by Andreas Brandl