diff options
Diffstat (limited to 'src/backend/executor/execQual.c')
-rw-r--r-- | src/backend/executor/execQual.c | 112 |
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); } /* |