aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_node.c
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2015-12-18 21:35:22 +0300
committerTeodor Sigaev <teodor@sigaev.ru>2015-12-18 21:35:22 +0300
commitbbbd807097092c7f292872e7da02eee35d67e54b (patch)
tree754831612e24305dee439214ba0c55089a0847db /src/backend/parser/parse_node.c
parent3c7042a7d7871b47dae3c9777c8020e41dedee89 (diff)
downloadpostgresql-bbbd807097092c7f292872e7da02eee35d67e54b.tar.gz
postgresql-bbbd807097092c7f292872e7da02eee35d67e54b.zip
Revert 9246af6799819847faa33baf441251003acbb8fe because
I miss too much. Patch is returned to commitfest process.
Diffstat (limited to 'src/backend/parser/parse_node.c')
-rw-r--r--src/backend/parser/parse_node.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c
index de6e0b89342..4130cbff5ed 100644
--- a/src/backend/parser/parse_node.c
+++ b/src/backend/parser/parse_node.c
@@ -311,7 +311,7 @@ transformArraySubscripts(ParseState *pstate,
elementType = transformArrayType(&arrayType, &arrayTypMod);
/*
- * A list containing only single subscripts (uidx) refers to a single array
+ * A list containing only single subscripts refers to a single array
* element. If any of the items are double subscripts (lower:upper), then
* the subscript expression means an array slice operation. In this case,
* we supply a default lower bound of 1 for any items that contain only a
@@ -322,7 +322,7 @@ transformArraySubscripts(ParseState *pstate,
{
A_Indices *ai = (A_Indices *) lfirst(idx);
- if (ai->lidx != NULL || ai->lidx_default)
+ if (ai->lidx != NULL)
{
isSlice = true;
break;
@@ -335,17 +335,9 @@ transformArraySubscripts(ParseState *pstate,
foreach(idx, indirection)
{
A_Indices *ai = (A_Indices *) lfirst(idx);
- Node *subexpr = NULL;
+ Node *subexpr;
Assert(IsA(ai, A_Indices));
- if ((ai->uidx_default || ai->lidx_default) && assignFrom != NULL)
- ereport(ERROR,
- (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
- errmsg("array subscript must have both boundaries"),
- errhint("You can't omit the upper or lower"
- " boundaries when updating or inserting"),
- parser_errposition(pstate, exprLocation(arrayBase))));
-
if (isSlice)
{
if (ai->lidx)
@@ -364,7 +356,7 @@ transformArraySubscripts(ParseState *pstate,
errmsg("array subscript must have type integer"),
parser_errposition(pstate, exprLocation(ai->lidx))));
}
- else if (ai->lidx_default == false)
+ else
{
/* Make a constant 1 */
subexpr = (Node *) makeConst(INT4OID,
@@ -377,26 +369,19 @@ transformArraySubscripts(ParseState *pstate,
}
lowerIndexpr = lappend(lowerIndexpr, subexpr);
}
-
- if (ai->uidx_default == false)
- {
- subexpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
- /* If it's not int4 already, try to coerce */
- subexpr = coerce_to_target_type(pstate,
- subexpr, exprType(subexpr),
- INT4OID, -1,
- COERCION_ASSIGNMENT,
- COERCE_IMPLICIT_CAST,
- -1);
- if (subexpr == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_DATATYPE_MISMATCH),
- errmsg("array subscript must have type integer"),
- parser_errposition(pstate, exprLocation(ai->uidx))));
- }
- else
- subexpr = NULL;
-
+ subexpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
+ /* If it's not int4 already, try to coerce */
+ subexpr = coerce_to_target_type(pstate,
+ subexpr, exprType(subexpr),
+ INT4OID, -1,
+ COERCION_ASSIGNMENT,
+ COERCE_IMPLICIT_CAST,
+ -1);
+ if (subexpr == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("array subscript must have type integer"),
+ parser_errposition(pstate, exprLocation(ai->uidx))));
upperIndexpr = lappend(upperIndexpr, subexpr);
}