должен ли я использовать ANTLR для преобразования простых инструкций SQL select?

#sql #antlr

#sql #antlr

Вопрос:

Мне нужно написать программу, которая принимает базовую инструкцию SQL select и выводит XML-файл, который разбивает инструкцию на составные части (выходные столбцы, входные таблицы, объединение, группирование по, агрегации и т.д.). Как минимум, мне нужно поддерживать 2 таблицы в инструкции from, разные типы соединения, предложение where, group by и having. Если может поддерживаться более сложный sql (например, подзапросы), это бонус, но не обязательно.

Я проверил ANTLR, и это выглядит как крутая кривая обучения. Учитывая, что у меня есть возможность требовать, чтобы SQL был достаточно простым, должен ли я попытаться передать код вручную или мне следует погрузиться в мир ANTLR?

Комментарии:

1. «Это зависит». Хотя я не говорю «использовать ANTRL», поскольку есть другие альтернативы (мне нравится подход рекурсивного спуска или синтаксического анализатора-комбинатора), использование надлежащих методов синтаксического анализа — это единственный способ правильно обрабатывать даже относительно небольшое подмножество SQL. Конечно, если «это работает», то «это работает», и жизнь продолжается … с другой стороны, возможно, у кого-то уже есть проект на основе ANTLR, который анализирует требуемый SQL 🙂

2. Как насчет использования существующего анализатора SQL?

3. Чего вы на самом деле пытаетесь достичь? Если вы хотите оптимизировать свой запрос, вам следует ознакомиться с планом ОБЪЯСНЕНИЯ ваших баз данных. Или вы пытаетесь создать свой собственный движок SQL?

4. Если вам известен какой-либо код для другого подхода и вы можете направить меня к нему, это было бы здорово. То же самое касается существующего синтаксического анализатора, который я могу использовать. Это было бы здорово. но это должно быть что-то, что я могу модифицировать / воспроизводить в соответствии со своими потребностями.

5. Чего я пытаюсь достичь: не для движка sql, а для моего домашнего инструмента etl. Мне нужно иметь возможность записывать каждое объединение, фильтр, группировку по и т.д., Которые необходимо выполнить. Инструмент etl с выводом этих метаданных в виде SQL с надлежащим протоколированием и проверкой ошибок. У меня уже есть графический интерфейс для перетаскивания, чтобы получить то, что мне нужно. Но я хотел бы создать альтернативный подход для тех, кто знает SQL, чтобы сделать это быстрее. Они могли бы ввести SQL, программа проанализировала бы его в шагах метаданных для инструмента ETL. Короче говоря: я не хочу изобретать велосипед для синтаксического анализа SQL, если я могу помочь этому.

Ответ №1:

Я не думаю, что вам нужно изобретать такой анализатор sql с ANTLR. Вот пример, который декодирует инструкцию SQL select в метаданные:

 SELECT e.last_name      AS name,
   e.commission_pct comm,
   e.salary * 12    "Annual Salary"
FROM   scott.employees AS e
WHERE  e.salary > 1000
ORDER  BY
  e.first_name,
  e.last_name;
  

Мета-информация:

             Select statement:
                Select set type: none

            select clause:
                Columns
                    Fullname:e.last_name
                    Prefix:e    Column:last_name    alias:name
                    Fullname:e.commission_pct
                    Prefix:e    Column:commission_pct   alias:comm
                    Fullname:e.salary * 12
                    Prefix: Column:e.salary * 12    alias:"Annual Salary"

            from clause:
                scott.employees as e
                tableowner: scott
                tablename:  employees
                tablealias: e

            where clause:
                e.salary > 1000

            order by clause:
                e.first_name,
            e.last_name
  

Если это то, что вам нужно, то вы можете ознакомиться с этой статьей, которая иллюстрирует, как использовать анализатор sql для достижения этой цели.

Ответ №2:

Крутая кривая обучения ANTLR состоит в основном из изучения техники синтаксического анализа рекурсивного спуска. Синтаксис и особенности инструмента вносят свой вклад в сложность, но они вторичны. Другими словами, вам нужно было бы научиться выполнять синтаксические анализаторы, несмотря ни на что, но благодаря проверкам, встроенным в автоматический генератор синтаксических анализаторов, вы сводите к минимуму вероятность кодирования недопустимой грамматики.

Вы также могли бы выбрать готовый анализатор SQL (вот один для .NET и еще один для Java). Я попробовал их оба, и они отлично работают. Для загрузки компонентов может потребоваться членство в TopCoder. Оба этих компонента используют сгенерированные анализаторы, но они используют JavaCC и его порт C # вместо ANTLR. Тем не менее, грамматики достаточно близки, поэтому вы можете выбрать их в качестве отправной точки для вашего проекта.

Комментарии:

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

2. @snowguy Я ничего не знаю об их ценах, потому что я никогда не использовал их компоненты для коммерческих проектов, но я не думаю, что они слишком высоки, потому что их стоимость очень низкая. Я уверен, что они были бы рады выслать вам информацию о ценах по электронной почте. Однако, если цена не соответствует вашим потребностям, вы всегда можете использовать проекты в качестве вдохновения для своей собственной работы: бесплатные загрузки включают полные исходные тексты.