Перейти к содержанию

BSL077 — Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО'

Кратко

Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО'

Идентификаторы

Поле Значение
Код правила BSL077
Совместимый псевдоним SelectTopWithoutOrderBy
Серьёзность WARNING
Включено по умолчанию Да
Реализовано Да
Теги performance, maintainability

Поведение

  • Публичный идентификатор BSL077 и псевдоним SelectTopWithoutOrderBy стабильны.
  • Правило сообщает о случаях, описанных на этой странице.
  • Подавления и проектная конфигурация применяются до публикации результата.
  • Для выполнения правила не требуется внешний анализатор или сетевой доступ.

Настройка и подавление

Код BSL### — основной стабильный идентификатор. Совместимый псевдоним принимается в select, ignore и совместимых блоковых комментариях.

[tool.onec-hbk-bsl]
select = ["BSL077"]
ignore = ["SelectTopWithoutOrderBy"]

Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:

  • noqa:
Значение = "пример";  // noqa: BSL077
  • bsl-disable (совместимый вариант):
Значение = "пример";  // bsl-disable: BSL077
  • совместимый BSLLS-вариант:
Значение = "пример";  // BSLLS:SelectTopWithoutOrderBy-off

Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:

// noqa: BSL077
// код без этой диагностики
// noqa-enable: BSL077

// bsl-disable: BSL077
// код без этой диагностики
// bsl-enable: BSL077

// BSLLS:SelectTopWithoutOrderBy-off
// код без этой диагностики
// BSLLS:SelectTopWithoutOrderBy-on

Чтобы отключить правило до конца файла, не добавляйте закрывающий noqa-enable, bsl-enable или BSLLS:…-on.

Открывающий и закрывающий маркеры должны принадлежать одному семейству.

Описание диагностики

Использование конструкции ПЕРВЫЕ N без указания порядка сортировки в УПОРЯДОЧИТЬ ПО или условий в секции ГДЕ чревато получением неожиданных результатов:

  • В разных СУБД порядок возвращаемых результатов может отличаться
  • Порядок в разных копиях ИБ будет отличаться от порядка, который ожидает разработчик

По стандарту, отсутствие предложения УПОРЯДОЧИТЬ ПО оправдано только в тех случаях, когда

  • алгоритм обработки результатов запроса не рассчитывает на определенный порядок записей
  • результат обработки выполненного запроса не показывается пользователю
  • результат запроса - заведомо одна запись

В приведенных случаях рекомендуется не добавлять предложение УПОРЯДОЧИТЬ ПО в текст запроса, так как это приводит к дополнительным затратам времени при выполнении запроса.

Алгоритм работы диагностики

В процессе анализа считаются ошибочными конструкции:

  • Использование ПЕРВЫЕ N в объединении вне зависимости от наличия УПОРЯДОЧИТЬ ПО, т.к. упорядочивание происходит уже после объединения
  • Использование ПЕРВЫЕ N, где N > 1 при отсутствии УПОРЯДОЧИТЬ ПО
  • Использование ПЕРВЫЕ 1, при отсутствии УПОРЯДОЧИТЬ ПО и условий в ГДЕ. Данное правило по умолчанию отключено параметром диагностики

Примеры

ВЫБРАТЬ ПЕРВЫЕ 1                            // <-- Нет ошибка, есть условие
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник
ГДЕ
   Справочник.Ссылка В (
       ВЫБРАТЬ ПЕРВЫЕ 10                   // <-- Ошибка, нет сортировки
           Ссылка
       ИЗ
           Справочник.Контрагенты)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 10                          // <-- Ошибка, нет сортировки (и не может быть)
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 1                          // <-- Всегда ошибка, даже 1
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник

УПОРЯДОЧИТЬ ПО
   Ссылка

Источники