Форматирование SQL-запросов

Раскладываем запрос по строкам и отступам, сверяем результат с исходником и разбираем места, которые дорого обходятся: изменение без условия, склейка строк, чувствительные значения в тексте запроса. Запрос не покидает браузер.

Запрос никуда не отправляется: разбор, форматирование и сверка считаются в браузере. Поэтому сюда можно вставлять запросы из логов и из кода как есть.

Что делает форматирование

Запрос раскладывается по строкам: ключевые слова начинают строку, поля и условия уходят на отступ, соединения таблиц и условия после AND и OR встают каждое на своё место, подзапросы в скобках раскрываются блоком с отступом. Несколько запросов подряд разделяются пустой строкой.

Обратная кнопка сжимает запрос в одну строку — так его удобно положить в код или в задачу.

Диалекты: кавычки значат разное

Это не мелочь оформления. В MySQL текст в двойных кавычках считается строковым значением, в PostgreSQL — именем таблицы или столбца.

Обратные кавычки работают в MySQL и ClickHouse, квадратные скобки в T-SQL, знак решётки начинает комментарий только в части баз. PostgreSQL умеет доллар-кавычки, внутри которых лежит что угодно, включая точки с запятой.

Поэтому диалект выбирается до разбора: с неверным разбор пойдёт не по смыслу, и половина запроса окажется внутри строки.

Регистр меняется не у всего

Прописными становятся ключевые слова, а имена таблиц и столбцов остаются как написаны: в ряде баз «Users» и «users» считаются разными таблицами.

Слова вроде role, user, value, key и date бывают и ключевыми, и обычными именами, поэтому их регистр не трогается вовсе. Имя функции узнаётся по скобке сразу за ним: count(x) и t.count обрабатываются по-разному.

Результат сверяется с исходником

Форматирование меняет только пробелы, переносы и регистр ключевых слов. Значит после него запрос можно разобрать заново и сверить поток лексем с исходным: они обязаны совпасть до знака. Если что-то разошлось, об этом сказано прямо, а не показано как готовый результат.

Места, которые дорого обходятся

Разбор идёт по тому же дереву лексем, поэтому строки и комментарии за код не принимаются. Называем:

  • DELETE и UPDATE без условия. Сюда же условие вида WHERE 1 = 1, которое ставят заготовкой и забывают дописать;
  • склейку строки со значением: так собирают запрос подстановкой, и значение с кавычкой внутри меняет его смысл целиком;
  • пароли, токены, телефоны, адреса почты и номера карт прямо в тексте запроса. Сами значения мы не показываем — иначе отчёт сам станет утечкой;
  • незакрытую кавычку или комментарий, несходящиеся скобки;
  • латинские буквы внутри русских имён: «с», «о», «е», «а» есть в обеих раскладках, на вид они одинаковы, а база такое имя не найдёт;
  • AND и OR в одном условии без скобок, ограничение числа строк без сортировки, NOT IN с подзапросом.

Запрос остаётся в браузере

В запросах бывают пароли, телефоны и адреса живых людей. На сервер ничего не уходит: разбор, форматирование и сверка считаются на вашей стороне.

Другие инструменты