Curiosamente, Postgres también falla aquí:
[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]
¿Quizás deberíamos simplemente tratar este comportamiento como un caso especial en nuestro método interno de Discourse que se encarga de calcular username_lower?
Encuentra todos los métodos que llaman a username_lower, redirígelos a una función central y luego permite este caso especial (supongo que podemos usar una llamada a mini_racer si lo deseamos o simplemente llamar a .lower y corregirlo después con una llamada a sub).
Actualizando el título del OP aquí para que sea más claro.