diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2015-12-22 21:05:16 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2015-12-22 21:05:29 -0500 |
commit | 6efbded6e4672c597a6f0dc0f09263e7db7369ff (patch) | |
tree | 2ee78e250058cdbc4021f24c6ae0bf4e92098c4b /src/backend/executor/execQual.c | |
parent | 0ba3f3bc65f1176250b942e14fd9e4975a5d3913 (diff) | |
download | postgresql-6efbded6e4672c597a6f0dc0f09263e7db7369ff.tar.gz postgresql-6efbded6e4672c597a6f0dc0f09263e7db7369ff.zip |
Allow omitting one or both boundaries in an array slice specifier.
Omitted boundaries represent the upper or lower limit of the corresponding
array subscript. This allows simpler specification of many common
use-cases.
(Revised version of commit 9246af6799819847faa33baf441251003acbb8fe)
YUriy Zhuravlev
Diffstat (limited to 'src/backend/executor/execQual.c')
-rw-r--r-- | src/backend/executor/execQual.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 29f058ce5cb..d4dc2dcd21a 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -271,6 +271,8 @@ ExecEvalArrayRef(ArrayRefExprState *astate, j = 0; IntArray upper, lower; + bool upperProvided[MAXDIM], + lowerProvided[MAXDIM]; int *lIndex; array_source = ExecEvalExpr(astate->refexpr, @@ -300,6 +302,15 @@ ExecEvalArrayRef(ArrayRefExprState *astate, errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", i + 1, MAXDIM))); + if (eltstate == NULL) + { + /* Slice bound is omitted, so use array's upper bound */ + Assert(astate->reflowerindexpr != NIL); + upperProvided[i++] = false; + continue; + } + upperProvided[i] = true; + upper.indx[i++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, @@ -328,6 +339,14 @@ ExecEvalArrayRef(ArrayRefExprState *astate, errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", j + 1, MAXDIM))); + if (eltstate == NULL) + { + /* Slice bound is omitted, so use array's lower bound */ + lowerProvided[j++] = false; + continue; + } + lowerProvided[j] = true; + lower.indx[j++] = DatumGetInt32(ExecEvalExpr(eltstate, econtext, &eisnull, @@ -398,6 +417,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate, econtext->caseValue_datum = array_get_slice(array_source, i, upper.indx, lower.indx, + upperProvided, lowerProvided, astate->refattrlength, astate->refelemlength, astate->refelembyval, @@ -456,6 +476,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate, else return array_set_slice(array_source, i, upper.indx, lower.indx, + upperProvided, lowerProvided, sourceData, eisnull, astate->refattrlength, @@ -475,6 +496,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate, else return array_get_slice(array_source, i, upper.indx, lower.indx, + upperProvided, lowerProvided, astate->refattrlength, astate->refelemlength, astate->refelembyval, |