summaryrefslogtreecommitdiff
path: root/src/backend/executor/execQual.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execQual.c')
-rw-r--r--src/backend/executor/execQual.c112
1 files changed, 51 insertions, 61 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index dd9d0883e40..fec76d4f1b7 100644
--- a/src/backend/executor/execQual.c
+++ b/src/backend/executor/execQual.c
@@ -252,12 +252,6 @@ static Datum ExecEvalCurrentOfExpr(ExprState *exprstate, ExprContext *econtext,
*
* NOTE: if we get a NULL result from a subscript expression, we return NULL
* when it's an array reference, or raise an error when it's an assignment.
- *
- * NOTE: we deliberately refrain from applying DatumGetArrayTypeP() here,
- * even though that might seem natural, because this code needs to support
- * both varlena arrays and fixed-length array types. DatumGetArrayTypeP()
- * only works for the varlena kind. The routines we call in arrayfuncs.c
- * have to know the difference (that's what they need refattrlength for).
*----------
*/
static Datum
@@ -267,8 +261,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
ExprDoneCond *isDone)
{
ArrayRef *arrayRef = (ArrayRef *) astate->xprstate.expr;
- ArrayType *array_source;
- ArrayType *resultArray;
+ Datum array_source;
bool isAssignment = (arrayRef->refassgnexpr != NULL);
bool eisnull;
ListCell *l;
@@ -278,11 +271,10 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
lower;
int *lIndex;
- array_source = (ArrayType *)
- DatumGetPointer(ExecEvalExpr(astate->refexpr,
- econtext,
- isNull,
- isDone));
+ array_source = ExecEvalExpr(astate->refexpr,
+ econtext,
+ isNull,
+ isDone);
/*
* If refexpr yields NULL, and it's a fetch, then result is NULL. In the
@@ -390,23 +382,24 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
}
else if (lIndex == NULL)
{
- econtext->caseValue_datum = array_ref(array_source, i,
- upper.indx,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign,
- &econtext->caseValue_isNull);
+ econtext->caseValue_datum =
+ array_get_element(array_source, i,
+ upper.indx,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign,
+ &econtext->caseValue_isNull);
}
else
{
- resultArray = array_get_slice(array_source, i,
- upper.indx, lower.indx,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign);
- econtext->caseValue_datum = PointerGetDatum(resultArray);
+ econtext->caseValue_datum =
+ array_get_slice(array_source, i,
+ upper.indx, lower.indx,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign);
econtext->caseValue_isNull = false;
}
}
@@ -435,7 +428,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
*/
if (astate->refattrlength > 0) /* fixed-length array? */
if (eisnull || *isNull)
- return PointerGetDatum(array_source);
+ return array_source;
/*
* For assignment to varlena arrays, we handle a NULL original array
@@ -445,48 +438,45 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
*/
if (*isNull)
{
- array_source = construct_empty_array(arrayRef->refelemtype);
+ array_source = PointerGetDatum(construct_empty_array(arrayRef->refelemtype));
*isNull = false;
}
if (lIndex == NULL)
- resultArray = array_set(array_source, i,
- upper.indx,
- sourceData,
- eisnull,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign);
+ return array_set_element(array_source, i,
+ upper.indx,
+ sourceData,
+ eisnull,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign);
else
- resultArray = array_set_slice(array_source, i,
- upper.indx, lower.indx,
- (ArrayType *) DatumGetPointer(sourceData),
- eisnull,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign);
- return PointerGetDatum(resultArray);
+ return array_set_slice(array_source, i,
+ upper.indx, lower.indx,
+ sourceData,
+ eisnull,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign);
}
if (lIndex == NULL)
- return array_ref(array_source, i, upper.indx,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign,
- isNull);
+ return array_get_element(array_source, i,
+ upper.indx,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign,
+ isNull);
else
- {
- resultArray = array_get_slice(array_source, i,
- upper.indx, lower.indx,
- astate->refattrlength,
- astate->refelemlength,
- astate->refelembyval,
- astate->refelemalign);
- return PointerGetDatum(resultArray);
- }
+ return array_get_slice(array_source, i,
+ upper.indx, lower.indx,
+ astate->refattrlength,
+ astate->refelemlength,
+ astate->refelembyval,
+ astate->refelemalign);
}
/*