1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-01 14:21:49 +03:00

Refactor/reword some error messages to avoid duplicates

Also, remove brackets around "EMPTY [ ARRAY ]".  An error message is
not the place to state that a keyword is optional.

Backpatch to 17.
This commit is contained in:
Alvaro Herrera 2024-08-07 11:30:36 -04:00
parent ffac8ac48e
commit 899f39ea25
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
5 changed files with 74 additions and 34 deletions

View File

@ -4634,13 +4634,17 @@ ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op)
if (DatumGetBool(jsestate->error.value)) if (DatumGetBool(jsestate->error.value))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("could not coerce ON ERROR expression (%s) to the RETURNING type", /*- translator: first %s is a SQL/JSON clause (e.g. ON ERROR) */
errmsg("could not coerce %s expression (%s) to the RETURNING type",
"ON ERROR",
GetJsonBehaviorValueString(jsestate->jsexpr->on_error)), GetJsonBehaviorValueString(jsestate->jsexpr->on_error)),
errdetail("%s", jsestate->escontext.error_data->message))); errdetail("%s", jsestate->escontext.error_data->message)));
else if (DatumGetBool(jsestate->empty.value)) else if (DatumGetBool(jsestate->empty.value))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("could not coerce ON EMPTY expression (%s) to the RETURNING type", /*- translator: first %s is a SQL/JSON clause (e.g. ON ERROR) */
errmsg("could not coerce %s expression (%s) to the RETURNING type",
"ON EMPTY",
GetJsonBehaviorValueString(jsestate->jsexpr->on_empty)), GetJsonBehaviorValueString(jsestate->jsexpr->on_empty)),
errdetail("%s", jsestate->escontext.error_data->message))); errdetail("%s", jsestate->escontext.error_data->message)));

View File

@ -1099,7 +1099,8 @@ transformAExprNullIf(ParseState *pstate, A_Expr *a)
if (result->opresulttype != BOOLOID) if (result->opresulttype != BOOLOID)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("NULLIF requires = operator to yield boolean"), /* translator: %s is name of a SQL construct, eg NULLIF */
errmsg("%s requires = operator to yield boolean", "NULLIF"),
parser_errposition(pstate, a->location))); parser_errposition(pstate, a->location)));
if (result->opretset) if (result->opretset)
ereport(ERROR, ereport(ERROR,
@ -3060,7 +3061,9 @@ make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
if (((OpExpr *) result)->opresulttype != BOOLOID) if (((OpExpr *) result)->opresulttype != BOOLOID)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("IS DISTINCT FROM requires = operator to yield boolean"), /* translator: %s is name of a SQL construct, eg NULLIF */
errmsg("%s requires = operator to yield boolean",
"IS DISTINCT FROM"),
parser_errposition(pstate, location))); parser_errposition(pstate, location)));
if (((OpExpr *) result)->opretset) if (((OpExpr *) result)->opretset)
ereport(ERROR, ereport(ERROR,
@ -4326,15 +4329,22 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
if (func->column_name == NULL) if (func->column_name == NULL)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON EMPTY behavior"), /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON EMPTY for JSON_QUERY()."), errmsg("invalid %s behavior", "ON EMPTY"),
/*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
"ON EMPTY", "JSON_QUERY()"),
parser_errposition(pstate, func->on_empty->location)); parser_errposition(pstate, func->on_empty->location));
else else
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON EMPTY behavior for column \"%s\"", /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
func->column_name), errmsg("invalid %s behavior for column \"%s\"",
errdetail("Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON EMPTY for formatted columns."), "ON EMPTY", func->column_name),
/*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
"ON EMPTY"),
parser_errposition(pstate, func->on_empty->location)); parser_errposition(pstate, func->on_empty->location));
} }
if (func->on_error != NULL && if (func->on_error != NULL &&
@ -4348,15 +4358,22 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
if (func->column_name == NULL) if (func->column_name == NULL)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior"), /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for JSON_QUERY()."), errmsg("invalid %s behavior", "ON ERROR"),
/*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
"ON ERROR", "JSON_QUERY()"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
else else
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior for column \"%s\"", /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
func->column_name), errmsg("invalid %s behavior for column \"%s\"",
errdetail("Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for formatted columns."), "ON ERROR", func->column_name),
/*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
"ON ERROR"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
} }
} }
@ -4372,15 +4389,20 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
if (func->column_name == NULL) if (func->column_name == NULL)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior"), /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in ON ERROR for JSON_EXISTS()."), errmsg("invalid %s behavior", "ON ERROR"),
errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s.",
"ON ERROR", "JSON_EXISTS()"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
else else
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior for column \"%s\"", /*- translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) */
func->column_name), errmsg("invalid %s behavior for column \"%s\"",
errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in ON ERROR for EXISTS columns."), "ON ERROR", func->column_name),
/*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns.",
"ON ERROR"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
} }
if (func->op == JSON_VALUE_OP) if (func->op == JSON_VALUE_OP)
@ -4393,15 +4415,22 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
if (func->column_name == NULL) if (func->column_name == NULL)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON EMPTY behavior"), /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in ON EMPTY for JSON_VALUE()."), errmsg("invalid %s behavior", "ON EMPTY"),
/*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
"ON EMPTY", "JSON_VALUE()"),
parser_errposition(pstate, func->on_empty->location)); parser_errposition(pstate, func->on_empty->location));
else else
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON EMPTY behavior for column \"%s\"", /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
func->column_name), errmsg("invalid %s behavior for column \"%s\"",
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in ON EMPTY for scalar columns."), "ON EMPTY", func->column_name),
/*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
"ON EMPTY"),
parser_errposition(pstate, func->on_empty->location)); parser_errposition(pstate, func->on_empty->location));
} }
if (func->on_error != NULL && if (func->on_error != NULL &&
@ -4412,15 +4441,22 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
if (func->column_name == NULL) if (func->column_name == NULL)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior"), /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in ON ERROR for JSON_VALUE()."), errmsg("invalid %s behavior", "ON ERROR"),
/*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
"ON ERROR", "JSON_VALUE()"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
else else
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior for column \"%s\"", /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
func->column_name), errmsg("invalid %s behavior for column \"%s\"",
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in ON ERROR for scalar columns."), "ON ERROR", func->column_name),
/*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
"ON ERROR"),
parser_errposition(pstate, func->on_error->location)); parser_errposition(pstate, func->on_error->location));
} }
} }

View File

@ -91,7 +91,7 @@ transformJsonTable(ParseState *pstate, JsonTable *jt)
jt->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY) jt->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY)
ereport(ERROR, ereport(ERROR,
errcode(ERRCODE_SYNTAX_ERROR), errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid ON ERROR behavior"), errmsg("invalid %s behavior", "ON ERROR"),
errdetail("Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause."), errdetail("Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause."),
parser_errposition(pstate, jt->on_error->location)); parser_errposition(pstate, jt->on_error->location));
@ -292,7 +292,7 @@ transformJsonTableColumns(JsonTableParseContext *cxt, List *columns,
if (ordinality_found) if (ordinality_found)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("cannot use more than one FOR ORDINALITY column"), errmsg("only one FOR ORDINALITY column is allowed"),
parser_errposition(pstate, rawc->location))); parser_errposition(pstate, rawc->location)));
ordinality_found = true; ordinality_found = true;
colexpr = NULL; colexpr = NULL;

View File

@ -489,7 +489,7 @@ DROP VIEW jsonb_table_view6;
DROP DOMAIN jsonb_test_domain; DROP DOMAIN jsonb_test_domain;
-- JSON_TABLE: only one FOR ORDINALITY columns allowed -- JSON_TABLE: only one FOR ORDINALITY columns allowed
SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, a int PATH '$.a' ERROR ON EMPTY)) jt; SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, a int PATH '$.a' ERROR ON EMPTY)) jt;
ERROR: cannot use more than one FOR ORDINALITY column ERROR: only one FOR ORDINALITY column is allowed
LINE 1: ..._TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR OR... LINE 1: ..._TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR OR...
^ ^
SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, a int PATH '$' ERROR ON EMPTY)) jt; SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, a int PATH '$' ERROR ON EMPTY)) jt;
@ -1126,7 +1126,7 @@ SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on error
ERROR: invalid ON ERROR behavior for column "a" ERROR: invalid ON ERROR behavior for column "a"
LINE 1: ...N_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on er... LINE 1: ...N_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on er...
^ ^
DETAIL: Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for formatted columns. DETAIL: Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for formatted columns.
SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on error)); SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on error));
ERROR: invalid ON ERROR behavior for column "a" ERROR: invalid ON ERROR behavior for column "a"
LINE 1: ...M JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty obje... LINE 1: ...M JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty obje...

View File

@ -1384,7 +1384,7 @@ SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR);
ERROR: invalid ON ERROR behavior ERROR: invalid ON ERROR behavior
LINE 1: SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR); LINE 1: SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR);
^ ^
DETAIL: Only ERROR, NULL, EMPTY [ ARRAY ], EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for JSON_QUERY(). DETAIL: Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for JSON_QUERY().
-- Test implicit coercion to a domain over fixed-length type specified in -- Test implicit coercion to a domain over fixed-length type specified in
-- RETURNING -- RETURNING
CREATE DOMAIN queryfuncs_char2 AS char(2); CREATE DOMAIN queryfuncs_char2 AS char(2);