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

PostgreSQL

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

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

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

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

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

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

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

Слышал что сам postgresql вроде дает подобный парсер!!! может некая не замеченная мной команда??? может одна из встроенных в pg утилит???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2016, 16:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Парсер SQL запроса (PostgreSQL):

Ошибка SQL запроса #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax t - Базы данных
Помогите пожалуйста! CREATE TABLE `tickets` ( `id` int(4) NOT NULL auto_increment, `user` int(11) NOT NULL default '0', ...

Работа запроса sql - Базы данных
Не могу понять как работает запрос, объясните, пожалуйста, по шагам... желательно, подробно Таблица SPJ(номер_поставщика, номер_детали,...

Построение запроса SQL - Базы данных
Как построить запрос SQL так, чтобы формировалось дополнительное поле содержащее сумму двух полей. Поля текстовые.

Построение запроса SQL - Базы данных
Как построить запрос SQL так, чтобы формировалось дополнительное поле содержащее сумму двух полей. Поля текстовые.

Как получиль результат SQL запроса? - Базы данных
простейший запрос select * from Table where name='Андрей'т.е. вообще существует такая запись.

Как с помощью sql-запроса переименовать таблицу? - Базы данных
Народ, подскажите, плиз, как с помощью sql-запроса переименовать таблицу.

8
grgdvo
571 / 509 / 148
Регистрация: 02.09.2012
Сообщений: 1,499
07.11.2016, 22:33 #2
Парсер SQL в postgresql написан с помощью стандартных утилит flex+bison. Либо в исходниках самого постгреса подсмотрите, либо сами составьте для заданного набора выражений.
И не очень понятно, что вы понимаете под
Цитата Сообщение от Tester64 Посмотреть сообщение
получить "таблицу" блоков
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
08.11.2016, 00:50  [ТС] #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
но что с этим дальше делать???
0
grgdvo
571 / 509 / 148
Регистрация: 02.09.2012
Сообщений: 1,499
08.11.2016, 05:42 #4
Если так вопрос стоит, тогда вам возможно сюда.
По указанной вами ссылке уже устарели библиотеки, нашел ссылки на продолжение.
Я почитал ради интереса, собрал пару примеров из своих запросов.
Я не сторонник трехстраничных запросов - считаю это зло, но "большой" запрос с парой-тройкой JOIN и CASE разобрался нормально!

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

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

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

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

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

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

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

жаль.... хороший инструмент бы в руки разработчикам дали бы...
0
grgdvo
571 / 509 / 148
Регистрация: 02.09.2012
Сообщений: 1,499
08.11.2016, 16:05 #8
Мммм.... вы же под Windows работаете..... не учел.
Тогда это точно вам не подойдет, тем более, если не знакомы с C/C++.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
09.11.2016, 01:29  [ТС] #9
Цитата Сообщение от grgdvo Посмотреть сообщение
если не знакомы с C/C++
основы знаю... консольные проги (ехе) собирал... но не работал с чужими либами/модулями, не знаю как их подсоединить к pg или к ноде. попробую еще дома (это чужая машина и здесь нет "наработок" по с++)

Добавлено через 7 часов 26 минут
на домашнем тоже не "собралось"... на этот ошибка еще раньше выскочила - произошел конфликт версий питона - новую видит, а старую "потерял"
0
09.11.2016, 01:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2016, 01:29
Привет! Вот еще темы с ответами:

Как подключить SQL 2000 БД на SQL 2005 - Базы данных
Здравствуйте у меня БД сделанный на SQL 2000 хотел подключить на SQL 2005 через Attach выдает следующую ошибку TITLE: Microsoft SQL...

Запрос SQL в файле формата *.sql - Базы данных
Есть файл формата *.sql, в котором находиться команда на создание таблицы списка с городами. CREATE TABLE `cities` ( `id` int(11)...

Парсер POST запроса - C (СИ)
Добрый вечер. Возникла небольшая запинка с парсингом строки. Имеемтся POST запрос такого вида: ...

Парсер для результатов запроса - Delphi
На форме сайта есть 2 Edit-а в которых вводиться пункт отправления и пункт назначения. Точное количество и их название неизвестно. Для...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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