Регулярное выражение для соответствия общему синтаксису SQL? - PullRequest
16 голосов
/ 26 сентября 2008

На прошлой неделе я писал несколько модульных тестов для фрагмента кода, который генерировал некоторые операторы SQL.

Я пытался найти регулярное выражение для соответствия синтаксису SELECT, INSERT и UPDATE, чтобы я мог проверить, что мои методы генерировали допустимый SQL, и после 3-4 часов поиска и работы с различными редакторами регулярных выражений я отказался.

Мне удалось получить частичные совпадения, но поскольку раздел в кавычках может содержать любые символы, он быстро расширяется, чтобы соответствовать всему описанию.

Буду признателен за любую помощь, я не очень хорошо разбираюсь в регулярных выражениях, но я бы хотел узнать о них больше.

Кстати, это C # регулярное выражение, что я после.

Разъяснение

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

Ответы [ 13 ]

37 голосов
/ 26 сентября 2008

Регулярные выражения могут соответствовать языкам, которые может анализировать только конечный автомат, что очень ограничено, тогда как SQL является синтаксисом. Можно продемонстрировать, что вы не можете проверить SQL с помощью регулярного выражения. Итак, вы можете прекратить попытки.

14 голосов
/ 27 сентября 2008

SQL - это грамматика типа 2 , она слишком мощная, чтобы ее можно было описать с помощью регулярных выражений. Это так же, как если бы вы решили сгенерировать код на C #, а затем проверить его, не вызывая компилятор. Движок базы данных в целом слишком сложен, чтобы его можно было легко заглушить.

Тем не менее, вы можете попробовать ANTLR SQL грамматик .

2 голосов
/ 26 сентября 2008

Насколько я знаю, это за пределами регулярных выражений, и вы приближаетесь к темному искусству BnF и компиляторов.

http://savage.net.au/SQL/

То же самое происходит с людьми, которые хотят делать правильную подсветку синтаксиса. Вы начинаете втискивать вещи в регулярные выражения, а затем заканчиваете тем, что пишете компилятор ...

1 голос
/ 14 апреля 2011

У меня была та же проблема - подход, который работал бы для всех более стандартных операторов SQL, состоял бы в том, чтобы раскрутить базу данных Sqlite в памяти и выдать запрос на нее, если вы получите «таблицу не существует» ошибка, то ваш запрос проанализирован правильно.

1 голос
/ 26 сентября 2008

Сверху головы: не могли бы вы передать сгенерированный SQL в базу данных, использовать для них EXPLAIN и перехватить любые исключения, которые указывали бы на плохо сформированный SQL?

0 голосов
/ 27 января 2018

Лучший способ - проверить параметры, использованные для создания запроса, а не сам запрос. Функция, которая получает переменные, может проверять длину строк, действительные числа, действительные электронные письма или что-то еще Вы можете использовать регулярные выражения для выполнения этой проверки.

0 голосов
/ 28 января 2016
public bool IsValid(string sql)
{
string pattern = @"SELECT\s.*FROM\s.*WHERE\s.*";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
return rgx.IsMatch(sql);
}
0 голосов
/ 27 сентября 2008

Есть ANTLR грамматик для анализа SQL. Это действительно лучшая идея использовать в базе данных памяти или очень легковесную базу данных, такую ​​как sqlite . Мне кажется расточительным проверять, является ли SQL действительным с точки зрения синтаксического анализа, и гораздо полезнее проверять имена таблиц и столбцов, а также особенности вашего запроса.

0 голосов
/ 26 сентября 2008

Я не думаю, что вам даже нужно создавать схему, чтобы иметь возможность проверять оператор, потому что система не будет пытаться разрешить имя_объекта и т. Д., Пока не успешно проанализирует оператор.

На примере Oracle вы наверняка получите сообщение об ошибке:

select * from non_existant_table;

В этом случае «ORA-00942: таблица или представление не существует».

Однако, если вы выполните:

select * frm non_existant_table;

Тогда вы получите синтаксическую ошибку: «ORA-00923: ключевое слово FROM не найдено там, где ожидается».

Должна быть возможность классифицировать ошибки по синтаксическому синтаксическому анализу, которые указывают на неправильный синтаксис и ошибки, связанные с именами и разрешениями таблиц и т. Д.

Добавьте к этому проблему разных СУБД и даже разных версий, допускающих разные синтаксисы, и я думаю, что вам действительно нужно обратиться к движку db для этой задачи.

0 голосов
/ 26 сентября 2008

Я предлагаю создать базу данных с той же схемой, возможно, используя встроенный движок SQL, и передать ей SQL.

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