Я пытаюсь использовать функцию parse_cypher() в репозитории PGPOOL-II. Мы импортировали функцию "parse_cypher()" Apache-age, которую можно вызывать. И отлично работает для запросов с правильным синтаксисом запроса шифра. Но завершает работу сервера при использовании неправильного синтаксиса запроса.
Перед вызовом функции parse_cypher() в файле cypher_analyze.c в репозитории age, parser_errposition() вызывается в нескольких позициях, Кто-нибудь может сказать, что делает функция parser_errposition(), а также что вообще происходит перед вызовом функции parse_cypher() в файле cypher_analyze.c в репозитории Apache-age?
На самом деле из его названия мы можем сделать вывод, что parser_errposition означает позицию ошибки синтаксического анализатора.
parser_errposition — это функция, доступная как в Apache AGE, так и в PostgreSQL. Он возвращает позицию символа в операторе SQL, где произошла синтаксическая ошибка.
Когда в операторе SQL возникает синтаксическая ошибка, синтаксический анализатор пытается предоставить сообщение об ошибке, указывающее на проблему. Это сообщение об ошибке обычно включает номер строки и краткое описание ошибки. Однако в некоторых случаях знание точной позиции символа в операторе, в котором произошла ошибка, может помочь при отладке ошибки.
Давайте объясним вывод вашего вложения скриншота, если там не вызывается parser_errposition, вывод при вызове этой функции не будет ясен, т.е. сервер скажет вам, что
Код ошибки: третий аргумент функции шифрования должен быть параметром
Отсутствует здесь, какая функция и где она (ее позиция) в моем входном запросе, чтобы указать мне, как это исправить; здесь parser_errposition отвечает на этот вопрос.
Вот исходный код функции из репозитория postgresql:
/*
* parser_errposition
* Report a parse-analysis-time cursor position, if possible.
*
* This is expected to be used within an ereport() call. The return value
* is a dummy (always 0, in fact).
*
* The locations stored in raw parsetrees are byte offsets into the source
* string. We have to convert them to 1-based character indexes for reporting
* to clients. (We do things this way to avoid unnecessary overhead in the
* normal non-error case: computing character indexes would be much more
* expensive than storing token offsets.)
*/
int
parser_errposition(ParseState *pstate, int location)
{
int pos;
/* No-op if location was not provided */
if (location < 0)
return 0;
/* Can't do anything if source text is not available */
if (pstate == NULL || pstate->p_sourcetext == NULL)
return 0;
/* Convert offset to character number */
pos = pg_mbstrlen_with_len(pstate->p_sourcetext, location) + 1;
/* And pass it to the ereport mechanism */
return errposition(pos);
}
Использованная литература: