aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2003-06-24 23:14:49 +0000
committerBruce Momjian <bruce@momjian.us>2003-06-24 23:14:49 +0000
commit46bf65148002f03a4775e6fbb2c4f758184062c5 (patch)
tree35508e7d4793489135efdbdff9b0fd2325c3b3e3 /src/backend/parser/parse_expr.c
parent50e53236aff06a6193059b5a92e60561645338ab (diff)
downloadpostgresql-46bf65148002f03a4775e6fbb2c4f758184062c5.tar.gz
postgresql-46bf65148002f03a4775e6fbb2c4f758184062c5.zip
Array mega-patch.
Joe Conway
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r--src/backend/parser/parse_expr.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 429a9ac8c8a..5234c22e4fb 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.148 2003/04/29 22:13:10 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.149 2003/06/24 23:14:45 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -436,6 +436,7 @@ transformExpr(ParseState *pstate, Node *expr)
sublink->operName = NIL;
sublink->operOids = NIL;
sublink->useOr = FALSE;
+ sublink->isExpr = FALSE;
}
else if (sublink->subLinkType == EXPR_SUBLINK ||
sublink->subLinkType == ARRAY_SUBLINK)
@@ -463,6 +464,7 @@ transformExpr(ParseState *pstate, Node *expr)
sublink->operName = NIL;
sublink->operOids = NIL;
sublink->useOr = FALSE;
+ sublink->isExpr = FALSE;
}
else
{
@@ -538,10 +540,30 @@ transformExpr(ParseState *pstate, Node *expr)
* here, because make_subplan() will insert type
* coercion calls if needed.
*/
- optup = oper(op,
- exprType(lexpr),
- exprType((Node *) tent->expr),
- false);
+ if (!sublink->isExpr)
+ {
+ optup = oper(op,
+ exprType(lexpr),
+ exprType((Node *) tent->expr),
+ false);
+ }
+ else
+ {
+ Oid exprtype = exprType((Node *) tent->expr);
+ Oid elemtype = get_element_type(exprtype);
+
+ if (elemtype != InvalidOid)
+ optup = oper(op,
+ exprType(lexpr),
+ elemtype,
+ false);
+ else
+ optup = oper(op,
+ exprType(lexpr),
+ exprtype,
+ false);
+ }
+
opform = (Form_pg_operator) GETSTRUCT(optup);
if (opform->oprresult != BOOLOID)
@@ -743,7 +765,7 @@ transformExpr(ParseState *pstate, Node *expr)
ArrayExpr *e = (ArrayExpr *) lfirst(element);
if (!IsA(e, ArrayExpr))
- elog(ERROR, "Multi-dimensional ARRAY[] must be built from nested array expressions");
+ elog(ERROR, "Multidimensional ARRAY[] must be built from nested array expressions");
if (ndims == 0)
ndims = e->ndims;
else if (e->ndims != ndims)