postgres.git / summary / log / commit / refs

commit    e8a3ee5b1974e2de40e8cf8dac28f2ef500a2950
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Tue Sep 22 10:48:30 2026 +0000

    Improve error code and messages for some SQL-reachable code paths
    
    The error code paths adjusted in this commit are reachable via SQL
    functions that are documented.  Previously, they generated an internal
    error code, causing the messages to not be translated.  They are now
    upgraded with a suitable error code.
    
    Note the extra consistency in the three typmod errors, and the tweaks in
    acldefault_sql() to show correctly non-printable characters.
    
    Author: Alexander Lakhin <exclusion@gmail.com>
    Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://postgr.es/m/94ac928b-8370-4db5-ada5-579a9ebc089d@gmail.com


src/backend/catalog/objectaddress.c | 4 +++- src/backend/commands/tablecmds.c | 1 + src/backend/parser/parse_utilcmd.c | 6 ++++-- src/backend/storage/ipc/shmem.c | 4 +++- src/backend/utils/adt/acl.c | 11 ++++++++++- src/backend/utils/adt/timestamp.c | 12 +++++++++--- src/pl/plpgsql/src/pl_gram.y | 4 +++- 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index d3eee732062..09c9c751133 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -4123,7 +4123,9 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) } default: - elog(ERROR, "unsupported object class: %u", object->classId); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unsupported object class: %u", object->classId))); } /* an empty buffer is equivalent to no object found */ diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 2f073ddb84a..0274d892f2e 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -9621,6 +9621,7 @@ ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd, tup = findNotNullConstraint(childrelid, strVal(column)); if (!tup) ereport(ERROR, + errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("column \"%s\" of table \"%s\" is not marked NOT NULL", strVal(column), get_rel_name(childrelid))); /* verify it's good enough */ diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index f838311090b..f0c7755b8fb 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -805,8 +805,10 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) if (constraint->conname && notnull_constraint->conname && strcmp(notnull_constraint->conname, constraint->conname) != 0) - elog(ERROR, "conflicting not-null constraint names \"%s\" and \"%s\"", - notnull_constraint->conname, constraint->conname); + ereport(ERROR, + errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("conflicting not-null constraint names \"%s\" and \"%s\"", + notnull_constraint->conname, constraint->conname)); if (notnull_constraint->is_no_inherit != constraint->is_no_inherit) ereport(ERROR, diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 3345735dff0..68e5c2914d6 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -1228,7 +1228,9 @@ pg_get_shmem_allocations_numa(PG_FUNCTION_ARGS) Size *nodes; if (pg_numa_init() == -1) - elog(ERROR, "libnuma initialization failed or NUMA is not supported on this platform"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("libnuma initialization failed or NUMA is not supported on this platform"))); InitMaterializedSRF(fcinfo, 0); diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index a01d8f4bc41..913d715a8c8 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -989,7 +989,16 @@ acldefault_sql(PG_FUNCTION_ARGS) objtype = OBJECT_TYPE; break; default: - elog(ERROR, "unrecognized object type abbreviation: %c", objtypec); + /* Avoid printing non-ASCII bytes, else we have encoding issues */ + if (objtypec >= ' ' && objtypec < 0x7f) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized object type abbreviation: \"%c\"", objtypec))); + else /* use \ooo format, like charout() */ + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized object type abbreviation: \"\\%03o\"", + (unsigned char) objtypec))); } PG_RETURN_ACL_P(acldefault(objtype, owner)); diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 8ef16c9ad4c..43efa548452 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -1186,7 +1186,9 @@ intervaltypmodout(PG_FUNCTION_ARGS) fieldstr = ""; break; default: - elog(ERROR, "invalid INTERVAL typmod: 0x%x", typmod); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized interval typmod: %d", typmod))); fieldstr = ""; break; } @@ -1246,7 +1248,9 @@ intervaltypmodleastfield(int32 typmod) case INTERVAL_FULL_RANGE: return 0; /* SECOND */ default: - elog(ERROR, "invalid INTERVAL typmod: 0x%x", typmod); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized interval typmod: %d", typmod))); break; } return 0; /* can't get here, but keep compiler quiet */ @@ -1489,7 +1493,9 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod, /* fractional-second rounding will be dealt with below */ } else - elog(ERROR, "unrecognized interval typmod: %d", typmod); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized interval typmod: %d", typmod))); /* Need to adjust sub-second precision? */ if (precision != INTERVAL_FULL_PRECISION) diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 5e14a2d7302..37785f58cc2 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -393,7 +393,9 @@ comp_option : '#' K_OPTION K_DUMP else if (strcmp($3, "off") == 0) plpgsql_curr_compile->print_strict_params = false; else - elog(ERROR, "unrecognized print_strict_params option %s", $3); + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized %s option \"%s\"", "print_strict_params", $3))); } | '#' K_VARIABLE_CONFLICT K_ERROR {