mirror of
https://github.com/postgres/postgres.git
synced 2025-05-29 16:21:20 +03:00
Repair incorrect check for coercion of unknown literal to ANYARRAY, a bug
I introduced in 7.4.1 :-(. It's correct to allow unknown to be coerced to ANY or ANYELEMENT, since it's a real-enough data type, but it most certainly isn't an array datatype. This can cause a backend crash but AFAICT is not exploitable as a security hole. Per report from Michael Fuhr. Note: as fixed in HEAD, this changes a constant in the pg_stats view, resulting in a change in the expected regression outputs. The back-branch patches have been hacked to avoid that, so that pre-existing installations won't start failing their regression tests.
This commit is contained in:
parent
97fc0f6e83
commit
c2caa7b736
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.132.2.3 2006/01/17 17:33:20 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.132.2.4 2006/10/11 20:21:11 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -130,11 +130,28 @@ coerce_type(ParseState *pstate, Node *node,
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
if (targetTypeId == ANYOID ||
|
if (targetTypeId == ANYOID ||
|
||||||
targetTypeId == ANYARRAYOID ||
|
targetTypeId == ANYELEMENTOID ||
|
||||||
targetTypeId == ANYELEMENTOID)
|
(targetTypeId == ANYARRAYOID &&
|
||||||
|
(inputTypeId != UNKNOWNOID ||
|
||||||
|
(IsA(node, Const) && ((Const *) node)->constisnull)))) /* HACK */
|
||||||
{
|
{
|
||||||
/* assume can_coerce_type verified that implicit coercion is okay */
|
/*
|
||||||
/* NB: we do NOT want a RelabelType here */
|
* Assume can_coerce_type verified that implicit coercion is okay.
|
||||||
|
*
|
||||||
|
* Note: by returning the unmodified node here, we are saying that
|
||||||
|
* it's OK to treat an UNKNOWN constant as a valid input for a
|
||||||
|
* function accepting ANY or ANYELEMENT. This should be all right,
|
||||||
|
* since an UNKNOWN value is still a perfectly valid Datum. However
|
||||||
|
* an UNKNOWN value is definitely *not* an array, and so we mustn't
|
||||||
|
* accept it for ANYARRAY. (Instead, we will call anyarray_in below,
|
||||||
|
* which will produce an error.)
|
||||||
|
*
|
||||||
|
* HACK: if it's a NULL UNKNOWN constant, return it as-is, same as
|
||||||
|
* before. This is just to avoid changing the pg_stats view and thus
|
||||||
|
* the expected regression test results in back branches.
|
||||||
|
*
|
||||||
|
* NB: we do NOT want a RelabelType here.
|
||||||
|
*/
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
if (inputTypeId == UNKNOWNOID && IsA(node, Const))
|
if (inputTypeId == UNKNOWNOID && IsA(node, Const))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user