@ -106,6 +106,7 @@ static void check_labels(const char *start_label,
static PLpgSQL_expr *read_cursor_args(PLpgSQL_var *cursor,
static PLpgSQL_expr *read_cursor_args(PLpgSQL_var *cursor,
int until, const char *expected);
int until, const char *expected);
static List *read_raise_options(void);
static List *read_raise_options(void);
static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);
%}
%}
@ -1849,6 +1850,8 @@ stmt_raise : K_RAISE
new->options = read_raise_options();
new->options = read_raise_options();
}
}
check_raise_parameters(new);
$$ = (PLpgSQL_stmt *)new;
$$ = (PLpgSQL_stmt *)new;
}
}
;
;
@ -3767,6 +3770,41 @@ read_raise_options(void)
return result;
return result;
}
}
/*
* Check that the number of parameter placeholders in the message matches the
* number of parameters passed to it, if a message was given.
*/
static void
check_raise_parameters(PLpgSQL_stmt_raise *stmt)
{
char *cp;
int expected_nparams = 0;
if (stmt->message == NULL)
return;
for (cp = stmt->message; *cp; cp++)
{
if (cp[0] == '%')
{
/* ignore literal % characters */
if (cp[1] == '%')
cp++;
else
expected_nparams++;
}
}
if (expected_nparams < list_length(stmt->params))
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("too many parameters specified for RAISE")));
if (expected_nparams > list_length(stmt->params))
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("too few parameters specified for RAISE")));
}
/*
/*
* Fix up CASE statement
* Fix up CASE statement
*/
*/