Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Revert 9246af6799819847faa33baf441251003acbb8fe because
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 18 Dec 2015 18:35:22 +0000 (21:35 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 18 Dec 2015 18:35:22 +0000 (21:35 +0300)
I miss too much. Patch is returned to commitfest process.

12 files changed:
doc/src/sgml/array.sgml
src/backend/executor/execQual.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/gram.y
src/backend/parser/parse_node.c
src/backend/parser/parse_target.c
src/include/nodes/parsenodes.h
src/test/regress/expected/arrays.out
src/test/regress/output/misc.source
src/test/regress/sql/arrays.sql

index 6ee71a57575842876226f4c58e012d72de3fcbeb..4385a09cd9798326afa5da38ca94460bbe1d8178 100644 (file)
@@ -255,26 +255,6 @@ SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
 ------------------------
  {{meeting},{training}}
 (1 row)
-</programlisting>
-
-  Possible to skip the <literal><replaceable>lower-bound</replaceable></literal> or
-  <literal><replaceable>upper-bound</replaceable></literal>
-  for get first or last element in slice.
-
-<programlisting>
-SELECT schedule[:][:] FROM sal_emp WHERE name = 'Bill';
-
-        schedule
-------------------------
- {{meeting,lunch},{training,presentation}}
-(1 row)
-
-SELECT schedule[:2][2:] FROM sal_emp WHERE name = 'Bill';
-
-        schedule
-------------------------
- {{lunch},{presentation}}
-(1 row)
 </programlisting>
 
   If any dimension is written as a slice, i.e., contains a colon, then all
index d9bf9773fe8e916b7e0e65cbb1916f00d1dbce76..29f058ce5cbb1e7f7a8e10f712f84288a8be9ccb 100644 (file)
@@ -268,12 +268,10 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
    bool        eisnull;
    ListCell   *l;
    int         i = 0,
-               j = 0,
-               indexexpr;
+               j = 0;
    IntArray    upper,
                lower;
    int        *lIndex;
-   AnyArrayType *arrays;
 
    array_source = ExecEvalExpr(astate->refexpr,
                                econtext,
@@ -295,7 +293,6 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
    foreach(l, astate->refupperindexpr)
    {
        ExprState  *eltstate = (ExprState *) lfirst(l);
-       eisnull = false;
 
        if (i >= MAXDIM)
            ereport(ERROR,
@@ -303,23 +300,10 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
                     errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
                            i + 1, MAXDIM)));
 
-       if (eltstate == NULL && astate->refattrlength <= 0)
-       {
-           if (isAssignment)
-               ereport(ERROR,
-                   (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
-                    errmsg("cannot determine upper index for empty array")));
-           arrays = (AnyArrayType *)DatumGetArrayTypeP(array_source);
-           indexexpr = AARR_LBOUND(arrays)[i] + AARR_DIMS(arrays)[i] - 1;
-       }
-       else
-           indexexpr = DatumGetInt32(ExecEvalExpr(eltstate,
-                                                  econtext,
-                                                  &eisnull,
-                                                  NULL));
-
-       upper.indx[i++] = indexexpr;
-
+       upper.indx[i++] = DatumGetInt32(ExecEvalExpr(eltstate,
+                                                    econtext,
+                                                    &eisnull,
+                                                    NULL));
        /* If any index expr yields NULL, result is NULL or error */
        if (eisnull)
        {
@@ -337,7 +321,6 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
        foreach(l, astate->reflowerindexpr)
        {
            ExprState  *eltstate = (ExprState *) lfirst(l);
-           eisnull = false;
 
            if (j >= MAXDIM)
                ereport(ERROR,
@@ -345,19 +328,10 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
                         errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
                                j + 1, MAXDIM)));
 
-           if (eltstate == NULL)
-           {
-               arrays = (AnyArrayType *)DatumGetArrayTypeP(array_source);
-               indexexpr = AARR_LBOUND(arrays)[j];
-           }
-           else
-               indexexpr = DatumGetInt32(ExecEvalExpr(eltstate,
-                                                      econtext,
-                                                      &eisnull,
-                                                      NULL));
-
-           lower.indx[j++] = indexexpr;
-
+           lower.indx[j++] = DatumGetInt32(ExecEvalExpr(eltstate,
+                                                        econtext,
+                                                        &eisnull,
+                                                        NULL));
            /* If any index expr yields NULL, result is NULL or error */
            if (eisnull)
            {
index 6fc9886209d28428f3e4b3c482819634fed1e63e..ba04b7227ca86b6a2a692a346ba841cc03e2513a 100644 (file)
@@ -2403,8 +2403,6 @@ _copyAIndices(const A_Indices *from)
 
    COPY_NODE_FIELD(lidx);
    COPY_NODE_FIELD(uidx);
-   COPY_SCALAR_FIELD(lidx_default);
-   COPY_SCALAR_FIELD(uidx_default);
 
    return newnode;
 }
index deca3b787dd8a5b98ebfe5e240b76e9980bad6c4..356fcafeb49a9773fa25e524a176aa6f73308961 100644 (file)
@@ -2153,8 +2153,6 @@ _equalAIndices(const A_Indices *a, const A_Indices *b)
 {
    COMPARE_NODE_FIELD(lidx);
    COMPARE_NODE_FIELD(uidx);
-   COMPARE_SCALAR_FIELD(lidx_default);
-   COMPARE_SCALAR_FIELD(uidx_default);
 
    return true;
 }
index 1a28dfd2b96382a03e60f10e54c3d6b764709fb2..63fae82aba00807b625241a2fef577e9d2af5a95 100644 (file)
@@ -2765,8 +2765,6 @@ _outA_Indices(StringInfo str, const A_Indices *node)
 
    WRITE_NODE_FIELD(lidx);
    WRITE_NODE_FIELD(uidx);
-   WRITE_BOOL_FIELD(lidx_default);
-   WRITE_BOOL_FIELD(uidx_default);
 }
 
 static void
index ce95f0f2a73a12baa70bbf8521c33b8e40fd310d..c4bed8a5ef7a9c84db656fe80adb9d94af01e33a 100644 (file)
@@ -13193,35 +13193,6 @@ indirection_el:
                    A_Indices *ai = makeNode(A_Indices);
                    ai->lidx = NULL;
                    ai->uidx = $2;
-                   ai->lidx_default = false;
-                   ai->uidx_default = false;
-                   $$ = (Node *) ai;
-               }
-           | '[' ':' ']'
-               {
-                   A_Indices *ai = makeNode(A_Indices);
-                   ai->lidx = NULL;
-                   ai->uidx = NULL;
-                   ai->lidx_default = true;
-                   ai->uidx_default = true;
-                   $$ = (Node *) ai;
-               }
-           | '[' ':' a_expr ']'
-               {
-                   A_Indices *ai = makeNode(A_Indices);
-                   ai->lidx = NULL;
-                   ai->uidx = $3;
-                   ai->lidx_default = true;
-                   ai->uidx_default = false;
-                   $$ = (Node *) ai;
-               }
-           | '[' a_expr ':' ']'
-               {
-                   A_Indices *ai = makeNode(A_Indices);
-                   ai->lidx = $2;
-                   ai->uidx = NULL;
-                   ai->lidx_default = false;
-                   ai->uidx_default = true;
                    $$ = (Node *) ai;
                }
            | '[' a_expr ':' a_expr ']'
@@ -13229,8 +13200,6 @@ indirection_el:
                    A_Indices *ai = makeNode(A_Indices);
                    ai->lidx = $2;
                    ai->uidx = $4;
-                   ai->lidx_default = false;
-                   ai->uidx_default = false;
                    $$ = (Node *) ai;
                }
        ;
index de6e0b89342dbe2d8e979c462e68dba860d1e8a3..4130cbff5edf69a0361c02d11dede4c2972cc904 100644 (file)
@@ -311,7 +311,7 @@ transformArraySubscripts(ParseState *pstate,
        elementType = transformArrayType(&arrayType, &arrayTypMod);
 
    /*
-    * A list containing only single subscripts (uidx) refers to a single array
+    * 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,
     * we supply a default lower bound of 1 for any items that contain only a
@@ -322,7 +322,7 @@ transformArraySubscripts(ParseState *pstate,
    {
        A_Indices  *ai = (A_Indices *) lfirst(idx);
 
-       if (ai->lidx != NULL || ai->lidx_default)
+       if (ai->lidx != NULL)
        {
            isSlice = true;
            break;
@@ -335,17 +335,9 @@ transformArraySubscripts(ParseState *pstate,
    foreach(idx, indirection)
    {
        A_Indices  *ai = (A_Indices *) lfirst(idx);
-       Node       *subexpr = NULL;
+       Node       *subexpr;
 
        Assert(IsA(ai, A_Indices));
-       if ((ai->uidx_default || ai->lidx_default) && assignFrom != NULL)
-           ereport(ERROR,
-                   (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
-                    errmsg("array subscript must have both boundaries"),
-                    errhint("You can't omit the upper or lower"
-                            " boundaries when updating or inserting"),
-                    parser_errposition(pstate, exprLocation(arrayBase))));
-
        if (isSlice)
        {
            if (ai->lidx)
@@ -364,7 +356,7 @@ transformArraySubscripts(ParseState *pstate,
                             errmsg("array subscript must have type integer"),
                        parser_errposition(pstate, exprLocation(ai->lidx))));
            }
-           else if (ai->lidx_default == false)
+           else
            {
                /* Make a constant 1 */
                subexpr = (Node *) makeConst(INT4OID,
@@ -377,26 +369,19 @@ transformArraySubscripts(ParseState *pstate,
            }
            lowerIndexpr = lappend(lowerIndexpr, subexpr);
        }
-
-       if (ai->uidx_default == false)
-       {
-           subexpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
-           /* If it's not int4 already, try to coerce */
-           subexpr = coerce_to_target_type(pstate,
-                                           subexpr, exprType(subexpr),
-                                           INT4OID, -1,
-                                           COERCION_ASSIGNMENT,
-                                           COERCE_IMPLICIT_CAST,
-                                           -1);
-           if (subexpr == NULL)
-               ereport(ERROR,
-                       (errcode(ERRCODE_DATATYPE_MISMATCH),
-                        errmsg("array subscript must have type integer"),
-                        parser_errposition(pstate, exprLocation(ai->uidx))));
-       }
-       else
-           subexpr = NULL;
-
+       subexpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
+       /* If it's not int4 already, try to coerce */
+       subexpr = coerce_to_target_type(pstate,
+                                       subexpr, exprType(subexpr),
+                                       INT4OID, -1,
+                                       COERCION_ASSIGNMENT,
+                                       COERCE_IMPLICIT_CAST,
+                                       -1);
+       if (subexpr == NULL)
+           ereport(ERROR,
+                   (errcode(ERRCODE_DATATYPE_MISMATCH),
+                    errmsg("array subscript must have type integer"),
+                    parser_errposition(pstate, exprLocation(ai->uidx))));
        upperIndexpr = lappend(upperIndexpr, subexpr);
    }
 
index df41f9fc9b880a914426a05e7a40fabec65613ef..1b3fcd629c109194bb8eb6831407192a7a7914de 100644 (file)
@@ -650,7 +650,7 @@ transformAssignmentIndirection(ParseState *pstate,
        if (IsA(n, A_Indices))
        {
            subscripts = lappend(subscripts, n);
-           if (((A_Indices *) n)->lidx != NULL || ((A_Indices *) n)->lidx_default)
+           if (((A_Indices *) n)->lidx != NULL)
                isSlice = true;
        }
        else if (IsA(n, A_Star))
index ac208cc533c7d46ea35a20ec8ce190f1a61da44a..9142e94b070d9a16c0eacfe9b4b9231f5c4914c2 100644 (file)
@@ -358,8 +358,6 @@ typedef struct A_Indices
    NodeTag     type;
    Node       *lidx;           /* NULL if it's a single subscript */
    Node       *uidx;
-   bool        lidx_default;
-   bool        uidx_default;
 } A_Indices;
 
 /*
index 68c14b93ae86d897ddc86562e8ce162764e294de..73fb5a248b47cf181422158c8c6a3bca351c72ca 100644 (file)
@@ -2031,43 +2031,3 @@ SELECT width_bucket(5, ARRAY[3, 4, NULL]);
 ERROR:  thresholds array must not contain NULLs
 SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]);
 ERROR:  thresholds must be one-dimensional array
--- slices with empty lower and/or upper index
-CREATE TABLE arrtest_s (
-  a       int2[],
-  b       int2[][]
-);
-INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}');
-SELECT a[:3], b[:2][:2] FROM arrtest_s;
-    a    |       b       
----------+---------------
- {1,2,3} | {{1,2},{4,5}}
-(1 row)
-
-SELECT a[2:], b[2:][2:] FROM arrtest_s;
-     a     |       b       
------------+---------------
- {2,3,4,5} | {{5,6},{8,9}}
-(1 row)
-
-SELECT a[:], b[:] FROM arrtest_s;
-      a      |             b             
--------------+---------------------------
- {1,2,3,4,5} | {{1,2,3},{4,5,6},{7,8,9}}
-(1 row)
-
--- errors
-UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14, 15}}';
-ERROR:  array subscript must have both boundaries
-LINE 1: UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{...
-                             ^
-HINT:  You can't omit the upper or lower boundaries when updating or inserting
-UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28, 29}}';
-ERROR:  array subscript must have both boundaries
-LINE 1: UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{...
-                             ^
-HINT:  You can't omit the upper or lower boundaries when updating or inserting
-UPDATE arrtest_s SET a[:] = '{23, 24, 25}';
-ERROR:  array subscript must have both boundaries
-LINE 1: UPDATE arrtest_s SET a[:] = '{23, 24, 25}';
-                             ^
-HINT:  You can't omit the upper or lower boundaries when updating or inserting
index 155972bc9ae445c06e8a09341f4a932ec11b9115..5f263f9a3a1b7c7ce816d7385a764884aa442d13 100644 (file)
@@ -586,7 +586,6 @@ SELECT user_relns() AS user_relns
  array_index_op_test
  array_op_test
  arrtest
- arrtest_s
  b
  b_star
  bb
@@ -711,7 +710,7 @@ SELECT user_relns() AS user_relns
  tvvmv
  varchar_tbl
  xacttest
-(133 rows)
+(132 rows)
 
 SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer')));
  name 
index 6a357a905e9be7fd029972602e1f0a367d9d0c1d..b1dd65144050b97a1a2d81b667a38ca112d5c192 100644 (file)
@@ -609,18 +609,3 @@ SELECT width_bucket(5, '{}');
 SELECT width_bucket('5'::text, ARRAY[3, 4]::integer[]);
 SELECT width_bucket(5, ARRAY[3, 4, NULL]);
 SELECT width_bucket(5, ARRAY[ARRAY[1, 2], ARRAY[3, 4]]);
-
--- slices with empty lower and/or upper index
-CREATE TABLE arrtest_s (
-  a       int2[],
-  b       int2[][]
-);
-INSERT INTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}');
-SELECT a[:3], b[:2][:2] FROM arrtest_s;
-SELECT a[2:], b[2:][2:] FROM arrtest_s;
-SELECT a[:], b[:] FROM arrtest_s;
-
--- errors
-UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14, 15}}';
-UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28, 29}}';
-UPDATE arrtest_s SET a[:] = '{23, 24, 25}';
\ No newline at end of file