aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_coerce.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-10-11 20:21:04 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-10-11 20:21:04 +0000
commit772c5ba31f31228d81444923ed630a89ff83056a (patch)
tree99940c1b9ed6399964c20a73fe4f9f09dbe0756b /src/backend/parser/parse_coerce.c
parent8f2f180ff10034494d947162d080363aab554cfa (diff)
downloadpostgresql-772c5ba31f31228d81444923ed630a89ff83056a.tar.gz
postgresql-772c5ba31f31228d81444923ed630a89ff83056a.zip
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.
Diffstat (limited to 'src/backend/parser/parse_coerce.c')
-rw-r--r--src/backend/parser/parse_coerce.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 9cfe4391bdc..39ae14ee1fa 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.144 2006/10/04 00:29:55 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.145 2006/10/11 20:21:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -129,11 +129,22 @@ coerce_type(ParseState *pstate, Node *node,
return node;
}
if (targetTypeId == ANYOID ||
- targetTypeId == ANYARRAYOID ||
- targetTypeId == ANYELEMENTOID)
+ targetTypeId == ANYELEMENTOID ||
+ (targetTypeId == ANYARRAYOID && inputTypeId != UNKNOWNOID))
{
- /* 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.)
+ *
+ * NB: we do NOT want a RelabelType here.
+ */
return node;
}
if (inputTypeId == UNKNOWNOID && IsA(node, Const))