#sql #postgresql #plpgsql #cartesian-product #greenplum
#sql #postgresql #plpgsql #декартово-произведение #гринплум
Вопрос:
Я пытаюсь написать функцию, которая анализирует тело других функций, чтобы проверить, есть ли select
запросы, возвращающие декартово произведение. Я использую information_schema.routines
таблицу для получения тела функции, с этой частью проблем нет, но когда дело доходит до фактической проверки «нежелательных» запросов, я в тупике.
Я попытался проверить для запросов, которые имеют более чем в 1 источниках в from
предложении и менее (источники — 1) условия, в where
положение с помощью регулярных выражений, но так как он возвращает только одно совпадение (возможно, я ошибаюсь здесь, не очень хорошо знаком с регулярным выражением), а причин может быть несколько запросов в функции и тот факт, что теоретически там может быть 3 или более источников в одном запросе, и в этом случае трудно проверить с помощью регулярных выражений, это не сработало для меня.
Другая идея состояла в том, чтобы каким-то образом получить все select
запросы из тела функции (я думаю, используя регулярное выражение) и проанализировать explain select
выходные данные для них. Но опять же, поскольку в предложении может быть более 2 исходных таблиц from
, это несколько слишком сложный результат для интерпретации для меня. ( explain select
вывод показывает общее количество строк для запроса, и в этом случае я могу проверить, существует ли декартово произведение, запустив count()
все исходные таблицы и умножив их, но это не сработает, если есть условие, которое может повлиять на вывод, например: select * from schema.table_one to, schema.table_two tw where to.id = 1;
)
Извините, если этот вопрос глупый, но если у вас, ребята, есть какие-либо идеи по этому поводу, я буду рад их услышать
Заранее спасибо
Комментарии:
1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.