aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/functioncmds.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-04-15 17:24:12 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2021-04-15 17:24:12 -0400
commit409723365b2708acd3bdf2e830257504bdefac4b (patch)
tree74f72c5fa1990dda5a9202a7a5c3cf4e09ca6287 /src/backend/commands/functioncmds.c
parent83efce7a1ebc5bae79617ddba12a64790141725c (diff)
downloadpostgresql-409723365b2708acd3bdf2e830257504bdefac4b.tar.gz
postgresql-409723365b2708acd3bdf2e830257504bdefac4b.zip
Provide query source text when parsing a SQL-standard function body.
Without this, we lose error cursor positions, as shown in the modified regression test result. Discussion: https://postgr.es/m/2197698.1617984583@sss.pgh.pa.us
Diffstat (limited to 'src/backend/commands/functioncmds.c')
-rw-r--r--src/backend/commands/functioncmds.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index dc317c83afc..e7cb5c65e9a 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -852,7 +852,9 @@ static void
interpret_AS_clause(Oid languageOid, const char *languageName,
char *funcname, List *as, Node *sql_body_in,
List *parameterTypes, List *inParameterNames,
- char **prosrc_str_p, char **probin_str_p, Node **sql_body_out)
+ char **prosrc_str_p, char **probin_str_p,
+ Node **sql_body_out,
+ const char *queryString)
{
if (!sql_body_in && !as)
ereport(ERROR,
@@ -929,6 +931,7 @@ interpret_AS_clause(Oid languageOid, const char *languageName,
Query *q;
ParseState *pstate = make_parsestate(NULL);
+ pstate->p_sourcetext = queryString;
sql_fn_parser_setup(pstate, pinfo);
q = transformStmt(pstate, stmt);
if (q->commandType == CMD_UTILITY)
@@ -947,6 +950,7 @@ interpret_AS_clause(Oid languageOid, const char *languageName,
Query *q;
ParseState *pstate = make_parsestate(NULL);
+ pstate->p_sourcetext = queryString;
sql_fn_parser_setup(pstate, pinfo);
q = transformStmt(pstate, sql_body_in);
if (q->commandType == CMD_UTILITY)
@@ -954,6 +958,7 @@ interpret_AS_clause(Oid languageOid, const char *languageName,
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("%s is not yet supported in unquoted SQL function body",
GetCommandTagName(CreateCommandTag(q->utilityStmt))));
+ free_parsestate(pstate);
*sql_body_out = (Node *) q;
}
@@ -1220,7 +1225,8 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
interpret_AS_clause(languageOid, language, funcname, as_clause, stmt->sql_body,
parameterTypes_list, inParameterNames_list,
- &prosrc_str, &probin_str, &prosqlbody);
+ &prosrc_str, &probin_str, &prosqlbody,
+ pstate->p_sourcetext);
/*
* Set default values for COST and ROWS depending on other parameters;