*** a/src/backend/executor/execQual.c --- b/src/backend/executor/execQual.c *************** *** 263,271 **** ExecEvalArrayRef(ArrayRefExprState *astate, ListCell *l; int i = 0, j = 0; ! IntArray upper, ! lower; ! int *lIndex; array_source = (ArrayType *) DatumGetPointer(ExecEvalExpr(astate->refexpr, --- 263,270 ---- ListCell *l; int i = 0, j = 0; ! int upper[MAXDIM], ! lower[MAXDIM]; array_source = (ArrayType *) DatumGetPointer(ExecEvalExpr(astate->refexpr, *************** *** 295,301 **** ExecEvalArrayRef(ArrayRefExprState *astate, errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", i, MAXDIM))); ! upper.indx[i++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, NULL)); --- 294,300 ---- errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", i, MAXDIM))); ! upper[i++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, NULL)); *************** *** 323,329 **** ExecEvalArrayRef(ArrayRefExprState *astate, errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", i, MAXDIM))); ! lower.indx[j++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, NULL)); --- 322,328 ---- errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", i, MAXDIM))); ! lower[j++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, NULL)); *************** *** 341,350 **** ExecEvalArrayRef(ArrayRefExprState *astate, /* this can't happen unless parser messed up */ if (i != j) elog(ERROR, "upper and lower index lists are not same length"); - lIndex = lower.indx; } - else - lIndex = NULL; if (isAssignment) { --- 340,346 ---- *************** *** 386,394 **** ExecEvalArrayRef(ArrayRefExprState *astate, *isNull = false; } ! if (lIndex == NULL) resultArray = array_set(array_source, i, ! upper.indx, sourceData, eisnull, astate->refattrlength, --- 382,390 ---- *isNull = false; } ! if (j == 0) resultArray = array_set(array_source, i, ! upper, sourceData, eisnull, astate->refattrlength, *************** *** 397,403 **** ExecEvalArrayRef(ArrayRefExprState *astate, astate->refelemalign); else resultArray = array_set_slice(array_source, i, ! upper.indx, lower.indx, (ArrayType *) DatumGetPointer(sourceData), eisnull, astate->refattrlength, --- 393,399 ---- astate->refelemalign); else resultArray = array_set_slice(array_source, i, ! upper, lower, (ArrayType *) DatumGetPointer(sourceData), eisnull, astate->refattrlength, *************** *** 407,414 **** ExecEvalArrayRef(ArrayRefExprState *astate, return PointerGetDatum(resultArray); } ! if (lIndex == NULL) ! return array_ref(array_source, i, upper.indx, astate->refattrlength, astate->refelemlength, astate->refelembyval, --- 403,410 ---- return PointerGetDatum(resultArray); } ! if (j == 0) ! return array_ref(array_source, i, upper, astate->refattrlength, astate->refelemlength, astate->refelembyval, *************** *** 417,423 **** ExecEvalArrayRef(ArrayRefExprState *astate, else { resultArray = array_get_slice(array_source, i, ! upper.indx, lower.indx, astate->refattrlength, astate->refelemlength, astate->refelembyval, --- 413,419 ---- else { resultArray = array_get_slice(array_source, i, ! upper, lower, astate->refattrlength, astate->refelemlength, astate->refelembyval, *** a/src/include/c.h --- b/src/include/c.h *************** *** 376,389 **** typedef uint32 CommandId; #define FirstCommandId ((CommandId) 0) - /* - * Array indexing support - */ #define MAXDIM 6 - typedef struct - { - int indx[MAXDIM]; - } IntArray; /* ---------------- * Variable-length datatypes all share the 'struct varlena' header. --- 376,382 ----