diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2013-11-23 20:04:10 -0500 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2013-11-23 20:04:10 -0500 |
| commit | 747dd9724c189cabf2d846102fbf7cdf8bc57e65 (patch) | |
| tree | e1b6d0aae5d6c4ba477c0c90f26e15d76c558996 /src/backend/parser/parse_node.c | |
| parent | ec6a6a268a634a3eae3add9088392c77627dfb26 (diff) | |
Fix array slicing of int2vector and oidvector values.
The previous coding labeled expressions such as pg_index.indkey[1:3] as
being of int2vector type; which is not right because the subscript bounds
of such a result don't, in general, satisfy the restrictions of int2vector.
To fix, implicitly promote the result of slicing int2vector to int2[],
or oidvector to oid[]. This is similar to what we've done with domains
over arrays, which is a good analogy because these types are very much
like restricted domains of the corresponding regular-array types.
A side-effect is that we now also forbid array-element updates on such
columns, eg while "update pg_index set indkey[4] = 42" would have worked
before if you were superuser (and corrupted your catalogs irretrievably,
no doubt) it's now disallowed. This seems like a good thing since, again,
some choices of subscripting would've led to results not satisfying the
restrictions of int2vector. The case of an array-slice update was
rejected before, though with a different error message than you get now.
We could make these cases work in future if we added a cast from int2[]
to int2vector (with a cast function checking the subscript restrictions)
but it seems unlikely that there's any value in that.
Per report from Ronan Dunklau. Back-patch to all supported branches
because of the crash risks involved.
Diffstat (limited to 'src/backend/parser/parse_node.c')
| -rw-r--r-- | src/backend/parser/parse_node.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 59f1245fd6b..50ec98d211e 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -271,6 +271,18 @@ transformArraySubscripts(ParseState *pstate, elementType = transformArrayType(arrayType); /* + * We treat int2vector and oidvector as though they were domains over + * int2[] and oid[]. This is needed because array slicing could create an + * array that doesn't satisfy the dimensionality constraints of the + * xxxvector type; so we want the result of a slice operation to be + * considered to be of the more general type. + */ + if (arrayType == INT2VECTOROID) + arrayType = INT2ARRAYOID; + else if (arrayType == OIDVECTOROID) + arrayType = OIDARRAYOID; + + /* * 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, |
