Как добавить LIMIT в пользовательский SQL-запрос - PullRequest
0 голосов
/ 04 января 2019

Я создал редактор запросов, в который пользователь может войти в запрос.Тем не менее, необходимо ограничить ввод пользователя до 1000 результатов, в противном случае пользователь может ввести что-то вроде:

SELECT * FROM mybigtable

Он может попытаться загрузить 1 миллиард результатов.

Что будетлучший способ обеспечить ограничение?Первый подход, о котором я подумал, состоял в том, чтобы сделать:

SELECT * FROM (
    user-query
) x LIMIT 1000

Однако, это выполнит весь запрос (и может занять вечность), прежде чем будет установлен фактический лимит.Каков наилучший способ применения строгого ограничения на ввод данных пользователем sql?

1 Ответ

0 голосов
/ 04 января 2019

Это слишком долго для комментария.

Я не думаю, что для этого есть общее решение.

Заключение пользовательского запроса в оператор SELECT * FROM ... LIMIT 1000 привлекательно, но

  • существуют крайние случаи, когда он может привести к недопустимому SQL, например, если пользовательский запрос содержит CTE (предложение WITH должно быть помещено в самом начале запроса)
  • , в то время как оно удачно ограничит число строк, возвращаемых пользователю, не помешает базе данных сканировать весь набор результатов

Типичным решением для второго варианта использования является фильтрация строк по автоматически целочисленному столбцу целых чисел (обычно это первичный ключ вашей таблицы).Но еще сложнее сделать универсальный.

Короче говоря: манипулировать SQL на расстоянии довольно сложно: если вы хотите получить полное решение для своего варианта использования, найдите себе реального построителя запросов (или хотя бы парсера sql)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...