Validate text limit implemented in oauth_applications.scopes

What does this MR do and why?

Ref #551214 (closed)

This is a follow-up of !195534 (merged).

The purpose of this MR is to complete the oauth_applications.scopes field migration by validating the text limit constraint, as described in Validate the text limit (next release).

  • Validates the 2048 character limit added in previous release
  • Completes the two-step constraint addition process
  • Will fail if any records exceed the limit (manual cleanup required)
  • Finalizes oauth_applications scopes field migration series

Database

Migration - when a row violates constraint

daniele@dbracciani--20250523-VYV2F gitlab % bin/rails db:migrate                                                                  
main: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19324
main: == 20250624190925 ValidateTextLimitOauthApplicationsScopes: migrating =========
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- execute("ALTER TABLE oauth_applications VALIDATE CONSTRAINT check_75750847b8;")
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19324
bin/rails aborted!
StandardError: An error has occurred, all later migrations canceled:

PG::CheckViolation: ERROR:  check constraint "check_75750847b8" of relation "oauth_applications" is violated by some row
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:122:in `block in validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/timeout_helpers.rb:31:in `disable_statement_timeout'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:119:in `validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:204:in `validate_text_limit'
/Users/daniele/projects/gdk/gitlab/db/post_migrate/20250624190925_validate_text_limit_oauth_applications_scopes.rb:8:in `up'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:33:in `block in exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/query_analyzer.rb:83:in `within'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:30:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb:21:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/require_disable_ddl_transaction_for_multiple_locks.rb:35:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/lock_retry_mixin.rb:54:in `ddl_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/runner_backoff/active_record_mixin.rb:21:in `execute_migration_in_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/pg_backend_pid.rb:14:in `with_advisory_lock'

Caused by:
ActiveRecord::StatementInvalid: PG::CheckViolation: ERROR:  check constraint "check_75750847b8" of relation "oauth_applications" is violated by some row
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:122:in `block in validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/timeout_helpers.rb:31:in `disable_statement_timeout'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:119:in `validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:204:in `validate_text_limit'
/Users/daniele/projects/gdk/gitlab/db/post_migrate/20250624190925_validate_text_limit_oauth_applications_scopes.rb:8:in `up'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:33:in `block in exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/query_analyzer.rb:83:in `within'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:30:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb:21:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/require_disable_ddl_transaction_for_multiple_locks.rb:35:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/lock_retry_mixin.rb:54:in `ddl_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/runner_backoff/active_record_mixin.rb:21:in `execute_migration_in_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/pg_backend_pid.rb:14:in `with_advisory_lock'

Caused by:
PG::CheckViolation: ERROR:  check constraint "check_75750847b8" of relation "oauth_applications" is violated by some row
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:122:in `block in validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/timeout_helpers.rb:31:in `disable_statement_timeout'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:119:in `validate_check_constraint'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/constraints_helpers.rb:204:in `validate_text_limit'
/Users/daniele/projects/gdk/gitlab/db/post_migrate/20250624190925_validate_text_limit_oauth_applications_scopes.rb:8:in `up'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:33:in `block in exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/query_analyzer.rb:83:in `within'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb:30:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb:21:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migration_helpers/require_disable_ddl_transaction_for_multiple_locks.rb:35:in `exec_migration'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/lock_retry_mixin.rb:54:in `ddl_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/runner_backoff/active_record_mixin.rb:21:in `execute_migration_in_transaction'
/Users/daniele/projects/gdk/gitlab/lib/gitlab/database/migrations/pg_backend_pid.rb:14:in `with_advisory_lock'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Migration - happy flow

daniele@dbracciani--20250523-VYV2F gitlab % bin/rails db:migrate 
main: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19378
main: == 20250624190925 ValidateTextLimitOauthApplicationsScopes: migrating =========
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0004s
main: -- execute("ALTER TABLE oauth_applications VALIDATE CONSTRAINT check_75750847b8;")
main:    -> 0.0012s
main: -- execute("RESET statement_timeout")
main:    -> 0.0007s
main: == 20250624190925 ValidateTextLimitOauthApplicationsScopes: migrated (0.0230s) 

main: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19378
ci: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19379
ci: == 20250624190925 ValidateTextLimitOauthApplicationsScopes: migrating =========
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0004s
ci: -- execute("ALTER TABLE oauth_applications VALIDATE CONSTRAINT check_75750847b8;")
ci:    -> 0.0019s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0003s
ci: == 20250624190925 ValidateTextLimitOauthApplicationsScopes: migrated (0.0234s) 

ci: == [advisory_lock_connection] object_id: 138740, pg_backend_pid: 19379

How to set up and validate locally

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Daniele Bracciani

Merge request reports

Loading