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:
@ -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"));
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user