Как получить аргументы функции в Postgresql
Я меняю pg-pool для обслуживания шифровальных запросов для Apache AGE, и у меня есть следующий код, который принимает оператор select. Отсюда он получает предложение FROM, а затем из предложения FROM получает имена функций. Итак, теперь мне нужны аргументы этой функции. Как бы я это сделал. Код выглядит следующим образом:
if (IsA(node, SelectStmt))
{
SelectStmt *stmt = (SelectStmt *) node;
List* fromClause = stmt->fromClause;
ListCell *fl;
//Match the first cypher function call in the FROM clause. Could be multiple tables
// e.g. FROM table1, table2, cypher(),table3....
foreach(fl, fromClause)
{
Node *n = lfirst(fl);
if (IsA(n, RangeFunction))
{
RangeFunction *rf = (RangeFunction*) n;
List* functions = rf->functions;
if (functions->length == 1)
{
List *sublist = (List *) lfirst(list_head(functions));
FuncCall *fntree = (FuncCall *) lfirst(list_head(sublist));
StringInfoData str;
initStringInfo(&str);
_outNode(&str,fntree->funcname);
if (!strcmp("\"cypher\"",str.data)){
return true;
}
}
}
}
}
2 ответа
Аргументы хранятся вFuncCall
. Поскольку у вас уже есть это, вы можете получить их с помощью
fntree->args
Обратите внимание, что ваш код охватывает только вызовы функций в верхней частиFROM
список. Что делать, если есть подзапросы?
FuncCall
есть полеargs
типаList*
в котором хранятся все аргументы функции.