1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

SQL/JSON: Improve some error messages

This improves some error messages emitted by SQL/JSON query functions
by mentioning column name when available, such as when they are
invoked as part of evaluating JSON_TABLE() columns.  To do so, a new
field column_name is added to both JsonFuncExpr and JsonExpr that is
only populated when creating those nodes for transformed JSON_TABLE()
columns.

While at it, relevant error messages are reworded for clarity.

Reported-by: Jian He <jian.universality@gmail.com>
Suggested-by: Jian He <jian.universality@gmail.com>
Discussion: https://postgr.es/m/CACJufxG_e0QLCgaELrr2ZNz7AxPeGCNKAORe3fHtFCQLsH4J4Q@mail.gmail.com
This commit is contained in:
Amit Langote
2024-04-18 14:33:47 +09:00
parent 40126ac68f
commit b4fad46b6b
10 changed files with 100 additions and 61 deletions

View File

@ -4312,7 +4312,8 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
case JSON_QUERY_OP:
*op->resvalue = JsonPathQuery(item, path, jsexpr->wrapper, &empty,
!throw_error ? &error : NULL,
jsestate->args);
jsestate->args,
jsexpr->column_name);
*op->resnull = (DatumGetPointer(*op->resvalue) == NULL);
@ -4337,7 +4338,8 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
{
JsonbValue *jbv = JsonPathValue(item, path, &empty,
!throw_error ? &error : NULL,
jsestate->args);
jsestate->args,
jsexpr->column_name);
if (jbv == NULL)
{
@ -4407,30 +4409,33 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
/* Handle ON EMPTY. */
if (empty)
{
if (jsexpr->on_empty)
{
if (jsexpr->on_empty->btype == JSON_BEHAVIOR_ERROR)
ereport(ERROR,
errcode(ERRCODE_NO_SQL_JSON_ITEM),
errmsg("no SQL/JSON item"));
else
jsestate->empty.value = BoolGetDatum(true);
Assert(jsestate->jump_empty >= 0);
return jsestate->jump_empty;
}
else if (jsexpr->on_error->btype == JSON_BEHAVIOR_ERROR)
ereport(ERROR,
errcode(ERRCODE_NO_SQL_JSON_ITEM),
errmsg("no SQL/JSON item"));
else
jsestate->error.value = BoolGetDatum(true);
*op->resvalue = (Datum) 0;
*op->resnull = true;
if (jsexpr->on_empty)
{
if (jsexpr->on_empty->btype != JSON_BEHAVIOR_ERROR)
{
jsestate->empty.value = BoolGetDatum(true);
Assert(jsestate->jump_empty >= 0);
return jsestate->jump_empty;
}
}
else if (jsexpr->on_error->btype != JSON_BEHAVIOR_ERROR)
{
jsestate->error.value = BoolGetDatum(true);
Assert(!throw_error && jsestate->jump_error >= 0);
return jsestate->jump_error;
}
Assert(!throw_error && jsestate->jump_error >= 0);
return jsestate->jump_error;
if (jsexpr->column_name)
ereport(ERROR,
errcode(ERRCODE_NO_SQL_JSON_ITEM),
errmsg("no SQL/JSON item found for specified path of column \"%s\"",
jsexpr->column_name));
else
ereport(ERROR,
errcode(ERRCODE_NO_SQL_JSON_ITEM),
errmsg("no SQL/JSON item found for specified path"));
}
/*