Спасибо за выполнение этих запросов, @Don — вы подтвердили первопричину
Ваши результаты точно подтверждают наши предположения:
У вас есть схема backup с копией таблицы user_options.
В этой таблице всё ещё установлено старое значение по умолчанию (column_default = false).
Строка из схемы backup появилась в результатах запроса раньше, чем строка из public.
Когда миграция удалила значение по умолчанию для public.user_options, она не затронула backup.user_options. Затем функция mark_readonly запросила information_schema.columns без фильтрации по схеме, первой получила строку из backup (где значение по умолчанию всё ещё было установлено) и завершилась с ошибкой
Исправление простое: достаточно добавить условие table_schema = 'public' в запрос, чтобы проверять только схему, с которой фактически работают миграции.