mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Revert 9246af6799
because
I miss too much. Patch is returned to commitfest process.
This commit is contained in:
@ -13193,35 +13193,6 @@ indirection_el:
|
||||
A_Indices *ai = makeNode(A_Indices);
|
||||
ai->lidx = NULL;
|
||||
ai->uidx = $2;
|
||||
ai->lidx_default = false;
|
||||
ai->uidx_default = false;
|
||||
$$ = (Node *) ai;
|
||||
}
|
||||
| '[' ':' ']'
|
||||
{
|
||||
A_Indices *ai = makeNode(A_Indices);
|
||||
ai->lidx = NULL;
|
||||
ai->uidx = NULL;
|
||||
ai->lidx_default = true;
|
||||
ai->uidx_default = true;
|
||||
$$ = (Node *) ai;
|
||||
}
|
||||
| '[' ':' a_expr ']'
|
||||
{
|
||||
A_Indices *ai = makeNode(A_Indices);
|
||||
ai->lidx = NULL;
|
||||
ai->uidx = $3;
|
||||
ai->lidx_default = true;
|
||||
ai->uidx_default = false;
|
||||
$$ = (Node *) ai;
|
||||
}
|
||||
| '[' a_expr ':' ']'
|
||||
{
|
||||
A_Indices *ai = makeNode(A_Indices);
|
||||
ai->lidx = $2;
|
||||
ai->uidx = NULL;
|
||||
ai->lidx_default = false;
|
||||
ai->uidx_default = true;
|
||||
$$ = (Node *) ai;
|
||||
}
|
||||
| '[' a_expr ':' a_expr ']'
|
||||
@ -13229,8 +13200,6 @@ indirection_el:
|
||||
A_Indices *ai = makeNode(A_Indices);
|
||||
ai->lidx = $2;
|
||||
ai->uidx = $4;
|
||||
ai->lidx_default = false;
|
||||
ai->uidx_default = false;
|
||||
$$ = (Node *) ai;
|
||||
}
|
||||
;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -650,7 +650,7 @@ transformAssignmentIndirection(ParseState *pstate,
|
||||
if (IsA(n, A_Indices))
|
||||
{
|
||||
subscripts = lappend(subscripts, n);
|
||||
if (((A_Indices *) n)->lidx != NULL || ((A_Indices *) n)->lidx_default)
|
||||
if (((A_Indices *) n)->lidx != NULL)
|
||||
isSlice = true;
|
||||
}
|
||||
else if (IsA(n, A_Star))
|
||||
|
Reference in New Issue
Block a user