diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2022-07-07 17:40:02 -0400 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2022-07-07 17:40:02 -0400 |
commit | 3c633f32b9c712cc0b4c8d946f0eeae04a3ff51a (patch) | |
tree | 5d95561130e6e77e0a7240f86cb5ea739c5a80be /src/backend/parser/parse_expr.c | |
parent | 88210542106de5b26fe6aa088d1811b68502d224 (diff) | |
download | postgresql-3c633f32b9c712cc0b4c8d946f0eeae04a3ff51a.tar.gz postgresql-3c633f32b9c712cc0b4c8d946f0eeae04a3ff51a.zip |
Only allow returning string types or bytea from json_serialize
These are documented to be the allowed types for the RETURNING clause,
but the restriction was not being enforced, which caused a segfault if
another type was specified. Add some testing for this.
Per report from a.kozhemyakin
Backpatch to release 15.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 0dc2fc472e5..efcf1cd5abc 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4574,7 +4574,24 @@ transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr) JsonReturning *returning; if (expr->output) + { returning = transformJsonOutput(pstate, expr->output, true); + + if (returning->typid != BYTEAOID) + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(returning->typid, &typcategory, + &typispreferred); + if (typcategory != TYPCATEGORY_STRING) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use RETURNING type %s in JSON_SERIALIZE", + format_type_be(returning->typid)), + errhint("Try returning a string type or bytea"))); + } + } else { /* RETURNING TEXT FORMAT JSON is by default */ |