powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
15 сообщений из 15, страница 1 из 1
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254338
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть какая нибудь функция или расширение, которые умеет до выполнения запроса определить какие поля из каких таблиц будут использоваться в запросе?

например запрос
Код: sql
1.
2.
3.
select fff('select a.id, cid 
from taba a inner join tabb on a.poleb=b.id
where a.aac = 4'); 

вернул бы результат:

taba.aac
taba.id
taba.poleb
tabb.cid
tabb.id
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254350
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

можно распарсить вывод explain verbose query (поля output).
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254389
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaесть какая нибудь функция или расширение, которые умеет до выполнения запроса определить какие поля из каких таблиц будут использоваться в запросе?

например запрос
Код: sql
1.
2.
3.
select fff('select a.id, cid 
from taba a inner join tabb on a.poleb=b.id
where a.aac = 4'); 

вернул бы результат:

taba.aac
taba.id
taba.poleb
tabb.cid
tabb.id

очень странное желание... а если у вас там хранимка вызывается внутри с 20 sql запросами?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254472
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaвернул бы результата для такого ввернул бы?
Код: sql
1.
2.
3.
4.
with t1(x) as (values (1),(2))
   , t2(x) as (values (2),(3))
select *
from t1 join t2 using(x);
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254523
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION explain(_sql text) RETURNS SETOF text AS $$BEGIN
  RETURN QUERY EXECUTE format('EXPLAIN (verbose, costs off) %s', _sql);
END;$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION describe(_sql text) RETURNS SETOF text AS $$
  SELECT regexp_split_to_table(regexp_replace(explain, '^  Output: ', ''), ', ')
   FROM (SELECT * FROM explain(_sql) WHERE explain ~ '^  Output: ') x;
$$ LANGUAGE sql;

SELECT * FROM describe($$
with t1(x) as (values (1),(2))
   , t2(x) as (values (2),(3))
select *
from t1 join t2 ON t1.x=t2.x
$$);



Можно было бы и одной ф-ей обойтись, но я не знаю как обзывается единственная колонка в динамическом запросе с `EXPLAIN`, чтобы к ней обратиться.
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254572
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov, вы очень сильно помогли, то что в теле select он превосходно парсит
еще хотелось бы добавить поля используемые в теле where или group by или order by
например:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM describe($$
with t1(x) as (values (1),(2))
   , t2(x) as (values (2),(3))
select 1
from t1 join t2 ON t1.x=t2.x
$$);


вернет нам 1, но не вернет t1.x, t2.x хотя они тоже явно используются
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254637
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

Я не понимаю, почему бы просто не сделать руками `EXPLAIN` и не подсмотреть всё там?..
В чём смысл этих манипуляций?
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254646
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushkavyegorov, вы очень сильно помогли, то что в теле select он превосходно парсит
еще хотелось бы добавить поля используемые в теле where или group by или order by
например:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM describe($$
with t1(x) as (values (1),(2))
   , t2(x) as (values (2),(3))
select 1
from t1 join t2 ON t1.x=t2.x
$$);


вернет нам 1, но не вернет t1.x, t2.x хотя они тоже явно используются

Наркоман что-ли?! результат запроса - 1, какие t1.x t2.x? Где они в результирующей выборке? У тебя по русски написано SELECT 1 FROM...
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254649
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, так критично получать метаданные именно из SQL? Всякие JDBC/ODBC прекрасно умеют получать метаданные для Prepared Statement
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254677
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovLegushka,

Я не понимаю, почему бы просто не сделать руками `EXPLAIN` и не подсмотреть всё там?..
В чём смысл этих манипуляций?
например навесить автоматику на вызовы сет-ретурниг ф-ии, с неописанным (заранее) возвратом -- т .е. returning setof record

dblink or {plproxy + execute} -- у пж-СКЛ проблема, что тип возврата должен быть описан до того как получен, или хотя бы должен исчисляться на этапе синтакс разбора. а иначе он встанет в позу и начнет материться. типа я не такая -- позднее связывание не умею
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39254686
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Да, но требуется также знать какие колонки используются “внутри” запроса, для фильтрации и связок.
Я этого не понимаю.
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39255314
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80, вы постановку задачи читали?. надо было не только еденицу из select 1 выводить, но и еще какие поля из каких таблиц участвовали в фильтрах, сортировках, группировках.
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39255405
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DROP FUNCTION IF EXISTS describe(text);
CREATE OR REPLACE FUNCTION describe(_sql text) RETURNS TABLE(line int, level int, node text, output text[], conditions text) AS $$
  WITH a AS (
    SELECT line, explain, lag(explain) OVER (ORDER BY line) scan, lead(explain) OVER (ORDER BY line) cond
      FROM (SELECT (row_number() OVER ())::int line, explain FROM explain(_sql)) e
  ), b AS (
    SELECT *, length(regexp_replace(scan, '^([ ]*).*$', '\1'))/2 as level FROM a
     WHERE explain ~ 'Output' AND scan ~ 'Scan|Join|Loop'
  )
  SELECT line,level,regexp_replace(scan, '^[ ]*(:?->  )?', '') node,
         regexp_split_to_array(regexp_replace(explain, '^[ ]*Output: ', ''), ', ') output,
         CASE WHEN scan ~ 'Join' THEN regexp_replace(cond, '^[ ]*', '') END condition
    FROM b
$$ LANGUAGE sql;

SELECT * FROM describe(
$$with t1(x) as (values (1),(2)),
       t2(x) as (values (2),(3))
select 1 from t1 join t2 ON t1.x=t2.x$$)
ORDER BY level, line;



очень вероятно, что не все запросы распарсятся правильно, наверняка что-то не попадёт в фильтры, поправить просто должно быть

громоздко, я свернул поля в массивы; заменив массив в определении функции на скаляр и regexp_split_to_array -> regexp_split_to_table поля будут списком

функция `explain` без изменений

Может и пригодиться.
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39255413
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushkadimonz80, вы постановку задачи читали?. надо было не только еденицу из select 1 выводить, но и еще какие поля из каких таблиц участвовали в фильтрах, сортировках, группировках.
Ну тогда только query plan парсить, да.
vyegorov,
Кстати, может удобнее в xml/json парсить ( типа EXPLAIN(format json) SELECT bla bla bla) если версия PG позволяет конечно. Какия-никакая структура, а не просто текст.
...
Рейтинг: 0 / 0
есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
    #39255462
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimonz80Legushkadimonz80, вы постановку задачи читали?. надо было не только еденицу из select 1 выводить, но и еще какие поля из каких таблиц участвовали в фильтрах, сортировках, группировках.
Ну тогда только query plan парсить, да.
vyegorov,
Кстати, может удобнее в xml/json парсить ( типа EXPLAIN(format json) SELECT bla bla bla) если версия PG позволяет конечно. Какия-никакая структура, а не просто текст.

Творчески переработав решение vyegorov, наговнокодил такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DROP FUNCTION IF EXISTS explain(text);

CREATE OR REPLACE FUNCTION explain(_sql text) RETURNS SETOF xml AS $$BEGIN
	RETURN QUERY EXECUTE format('EXPLAIN (verbose, format xml) %s', _sql);
END;$$ LANGUAGE plpgsql;

drop function if exists describe (text);

create or replace function describe(query text) returns setof text as $$
	with exp as (select * from explain(query)) 
	select 	distinct unnest(xpath('//ns:Item/text()',explain,ARRAY[ARRAY['ns', 'http://www.postgresql.org/2009/explain']])) :: text from exp 
$$ language sql;



select * from describe($$
 with t1(x) as (values (1),(2)),
       t2(x) as (values (2),(3))
select 1 from t1 join t2 ON t1.x=t2.x

$$); 
 



Код: sql
1.
2.
3.
4.
5.
6.
7.
       describe
----------------------
 "*VALUES*".column1
 t2.x
 t1.x
 "*VALUES*_1".column1
 1


По хорошему надо поглядеть схему для XML вывода EXPLAIN
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / есть ли парсер запроса, какие поля из каких таблиц используются в запросе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]