El log de consultas lentas escupe cada sentencia en una sola línea interminable. Para entender por qué una tarda, lo primero es poder leerla: los SELECT, FROM, JOIN y WHERE al principio de línea, las condiciones indentadas debajo. Beautifiers de SQL online hay de sobra. El problema no es el formateador: es lo que pegas dentro. Nombres de tablas, nombres de columnas y, bastante a menudo, valores literales que son datos de clientes de verdad.
Así que: formateador propio, pequeño, en el IDE del navegador, con el modelo corriendo en local.
La primera versión parecía terminada
La versión obvia sale en dos tirones: una lista de palabras clave y un reemplazo que mete un salto de línea delante de cada una. Pasó con nota treinta consultas reales del log. Y luego llegó esta:
SELECT id, mensaje FROM eventos WHERE mensaje LIKE '%update conflict%' ORDER BY creado_en DESC
Formateada, la consulta no dio error. Se ejecutó sin una queja. Y devolvió cero filas.
El salto de línea había caído dentro de las comillas, justo delante de update. En SQL un literal puede ocupar varias líneas, así que la sentencia seguía siendo perfectamente válida: solo que ahora el patrón buscado llevaba pegado por delante un salto y un puñado de espacios, y eso no coincide con nada. El formateador no rompió la consulta. Le cambió el significado y se calló.
Lo que había que escribir de verdad
Reemplazar texto no valía. Hacía falta recorrer la cadena carácter a carácter con cuatro estados —fuera, dentro de literal, dentro de comentario de línea, dentro de comentario de bloque— y tocar únicamente lo que esté fuera.
Eso es un autómata minúsculo, y es justo el tipo de código que describes en una frase y la IA te deja planteado entero, incluidos los casos que uno olvida:
- la comilla escapada duplicada dentro del propio literal;
- un guion doble que vive dentro de unas comillas y no abre ningún comentario;
- un cierre de comentario de bloque metido en un literal;
- el dollar quoting de Postgres;
- identificadores entre comillas dobles.
Le pedí también una batería de consultas feas para probar, y de ahí salieron dos fallos más antes de que el formateador tocase ninguna consulta real.
Por qué importa que nada de esto saliera de aquí
Los ejemplos con los que se depura esto no son de juguete: son las consultas del log, con tus tablas, tus columnas y, de vez en cuando, el correo de alguien dentro de un literal. Pegar eso en una web para que te lo ponga bonito es regalar el esquema de tu base de datos. Pegarlo en un chat para que te escriba el formateador es lo mismo con un paso más.
Y hay un detalle que no es retórico: si lo anonimizas antes de mandarlo fuera, pierdes el bug. El fallo estaba exactamente en ese literal. Una consulta saneada, con los valores sustituidos por «xxx», atraviesa el formateador roto como si no pasara nada.
Abre Elffuss Code, pega la consulta tal cual y escribe la utilidad con el modelo corriendo dentro de tu navegador: ni el código ni el prompt suben a ningún sitio.
Abrir Code →