Форум программистов, компьютерный форум CyberForum.ru

PostgreSQL

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Парсер SQL запроса - PostgreSQL

07.11.2016, 16:19. Просмотров 299. Ответов 8
Метки нет (Все метки)

Гуру, посоветуйте...

Надо НАДЕЖНО разложить запрос на "составляющие" для анализа - получить "таблицу" блоков.

Нашел тучу готовых либ под php, node, pyton, ruby... но все "недоделанные" (проверил пока только php, node). либы больше мегабайта, но "ломаются" даже на запросах из функций и не дают добавить функции...

SQL
1
SELECT * FROM my_function(4705)
В идеале нужно под php, но если надо я "мостик" настрою (инструмент "для себя" пишу).
Надо научиться вырезать комментарии, получать список подзапросов, задействованные функции, задействованные таблицы, подменять параметры...

Слышал что сам postgresql вроде дает подобный парсер!!! может некая не замеченная мной команда??? может одна из встроенных в pg утилит???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grgdvo
528 / 469 / 131
Регистрация: 02.09.2012
Сообщений: 1,373
07.11.2016, 22:33     Парсер SQL запроса #2
Парсер SQL в postgresql написан с помощью стандартных утилит flex+bison. Либо в исходниках самого постгреса подсмотрите, либо сами составьте для заданного набора выражений.
И не очень понятно, что вы понимаете под
Цитата Сообщение от Tester64 Посмотреть сообщение
получить "таблицу" блоков
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
08.11.2016, 00:50  [ТС]     Парсер SQL запроса #3
Цитата Сообщение от grgdvo Посмотреть сообщение
И не очень понятно, что вы понимаете под
Для меня это прямая "инструкция" в пошаговому выполнению...
команда - select
поля команды - таблица полей/*/функций-таблица полей фунции
фром - таблица/функция/еще один запрос, [join таблица/функция/еще один запрос]...
... и т.д....
подобных программ-парсеров УЙМА! все выдают на выходе "сложную таблицу с вложениями".
Но у меня есть ОЧЕНЬ СЛОЖНЫЙ запрос под pg из with, кучи (больше 6-8) подзапросов и сложных join и union. На 3-4 страницы кода... (И это еще не предел сложности - будут еще сложнее - для этого и пишу/нужен "инструмент")
Он РАБОЧИЙ!

Проверил уже больше 4х парсеров под php и 2 под node.js ... большинство на нем сломались - выдали ошибку в одном из модулей. 2 показали "часть запроса". (кое-что есть, а первой подтаблицы with нет).

Тот что показал "больше всего" (после того как я убрал из запроса места где вместо таблицы идет функция с параметрами возвращающая таблицу) имеет кода больше 600 кб - мне подобное несколько месяцев писать! И надо для этого знать ДОСКОНАЛЬНО возможности и ограничения языка pg-sql... Это работа для команды! для большой команды, где каждый "опенсорсер" добавляет туда то с чем лично столкнулся (например сколько раз можно обернуть условие WHERE в скобки? а слышал про прямое преобразование типа "123"::int as count1?) или разработчиков самого языка pg... Для разработчиков это проще! на порядкИ... поэтому и ждал "готового системного решения"... что-то нашел, но еще не понял что это...

Есть какой-то *.c - плагин, который в функции в десяток строчек выдает аррей или таблицу (не разобрался). Не знаю как его подключить к pg. Особенно учитывая что я сейчас работаю под Win...

Мои цели:
1) автоматом "чистить" запрос от лишних пробелов, коментариев.
2) форматировать его в читабельный формат - с отступами (как *.mini.js в читабельный вид приводят)
3) вывести список всех "под-таблиц" в with, всех упоминаний функций, всех под-таблиц не задействованных в дальнейших под-таблицах (пока вручную "вычищаю).
4) подкрасить ключевые слова и МОИ функции и МОИ таблицы в отдельные цвета при выводе в html согласно моей системе раскрасок - увеличит в разы "читабельность".
5) подменять цифры на мои переменные в один "проход" а не выискивая все места...

Добавлено через 4 минуты
если я правильно понял... https://wiki.postgresql.org/wiki/Query_Parsing
но что с этим дальше делать???
grgdvo
528 / 469 / 131
Регистрация: 02.09.2012
Сообщений: 1,373
08.11.2016, 05:42     Парсер SQL запроса #4
Если так вопрос стоит, тогда вам возможно сюда.
По указанной вами ссылке уже устарели библиотеки, нашел ссылки на продолжение.
Я почитал ради интереса, собрал пару примеров из своих запросов.
Я не сторонник трехстраничных запросов - считаю это зло, но "большой" запрос с парой-тройкой JOIN и CASE разобрался нормально!

Еще пару слов о форме представления результата.
Все же не знаю откуда вы взяли слово "таблица", но всю жизнь для всех языков (не только SQL) пользовались словом "дерево разбора" для внутреннего представления того, что написано на заданном языке и что генерирует транслятор/компилятор/парсер, читая выражения на заданном языке.
Вот и в libpg_query мы в результате видим дерево, записанное в JSON'е.

Дальше можно этот JSON запихать в postgresql ну и натравливать на него всякие поисковые запросы.

Добавлено через 9 минут
Ошибся... вот верный линк
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
08.11.2016, 11:18  [ТС]     Парсер SQL запроса #5
Цитата Сообщение от grgdvo Посмотреть сообщение
Я не сторонник трехстраничных запросов
иногда без этого никак... база на несколько десятков гиг и сложно-вывернутые перекресные запросы по периодам со сравнением для построения коротких графиков из десятка цифр... оформляется в виде функции с 1-3мя параметрами и... работает на медленных интернет каналах... туда ушло название функции+3 параметра, и вернулось 10-30 цифр из многогигабайтной базы...

а вот написать такой запрос - это уже целое приключение на несколько дней "высушивания мозгов"...

Цитата Сообщение от grgdvo Посмотреть сообщение
Все же не знаю откуда вы взяли слово "таблица"
обычно это array (первый перевод который "всплыл" - таблица а не массив). где каждый элемент часто является другой "таблицей"/array... получаем действительно "дерево" которое можно "собрать" назад в строку, но уже обработав и выкинув лишнее...

в pg представлял себе это как "послал туда спец ключ вроде "EXPLAIN select ...." а назад получаю таблицу где эту строку pg распарсило и разложила на "теги" в некой древовидной таблице. Причем средствами pg, а значит с учетом версии и новых возможностей обновленного sql в очередной 9.х-версии...

Цитата Сообщение от grgdvo Посмотреть сообщение
Ошибся... вот верный линк
а что с ним делать???
grgdvo
528 / 469 / 131
Регистрация: 02.09.2012
Сообщений: 1,373
08.11.2016, 14:16     Парсер SQL запроса #6
Цитата Сообщение от Tester64 Посмотреть сообщение
в pg представлял себе это как "послал туда спец ключ вроде "EXPLAIN select ...." а назад получаю таблицу где эту строку pg распарсило и разложила на "теги" в некой древовидной таблице. Причем средствами pg, а значит с учетом версии и новых возможностей обновленного sql в очередной 9.х-версии...
Боюсь такого готового представления указанная библиотека не даст, нужно брать напильник и самому допиливать
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
08.11.2016, 14:52  [ТС]     Парсер SQL запроса #7
Цитата Сообщение от grgdvo Посмотреть сообщение
и самому допиливать
жаль...
Цитата Сообщение от grgdvo Посмотреть сообщение
Ошибся... вот верный линк
пробую настроить... под ноду (ее немного знаю в отличии от питона, руби или с++)... уже потребовали питон для установки пакета под ноду, поставил... но все равно ругается! теперь похоже на версию .NET! нужная 2.0, а найдена 4.0... похоже пытается "собрать"(makefile)...

жаль.... хороший инструмент бы в руки разработчикам дали бы...
grgdvo
528 / 469 / 131
Регистрация: 02.09.2012
Сообщений: 1,373
08.11.2016, 16:05     Парсер SQL запроса #8
Мммм.... вы же под Windows работаете..... не учел.
Тогда это точно вам не подойдет, тем более, если не знакомы с C/C++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2016, 01:29     Парсер SQL запроса
Еще ссылки по теме:

PostgreSQL Оптимизация запроса
Нормально ли такое время обработки запроса? PostgreSQL
Postresql зависает при выполнении запроса с order и limit PostgreSQL
PostgreSQL Установить стоимость контрактов, начинающихся после даты, следующей за датой выполнения запроса, в размере, на
PostgreSQL Две функции-запроса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
09.11.2016, 01:29  [ТС]     Парсер SQL запроса #9
Цитата Сообщение от grgdvo Посмотреть сообщение
если не знакомы с C/C++
основы знаю... консольные проги (ехе) собирал... но не работал с чужими либами/модулями, не знаю как их подсоединить к pg или к ноде. попробую еще дома (это чужая машина и здесь нет "наработок" по с++)

Добавлено через 7 часов 26 минут
на домашнем тоже не "собралось"... на этот ошибка еще раньше выскочила - произошел конфликт версий питона - новую видит, а старую "потерял"
Yandex
Объявления
09.11.2016, 01:29     Парсер SQL запроса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru