Проверьте, есть ли у функции запросы, возвращающие декартово произведение

#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. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.