]> granicus.if.org Git - postgresql/commitdiff
Don't emit non-canonical empty arrays in array_remove().
authorNoah Misch <noah@leadboat.com>
Sat, 1 Jun 2013 01:50:59 +0000 (21:50 -0400)
committerNoah Misch <noah@leadboat.com>
Sat, 1 Jun 2013 01:50:59 +0000 (21:50 -0400)
Dean Rasheed

src/backend/utils/adt/arrayfuncs.c
src/test/regress/expected/arrays.out
src/test/regress/sql/arrays.sql

index 1d61d5c7c8dc6afd5518ec9752a1341837630871..438c3d0e9e6733e89e4156259421ea9374bf8905 100644 (file)
@@ -5398,6 +5398,14 @@ array_replace_internal(ArrayType *array,
                return array;
        }
 
+       /* If all elements were removed return an empty array */
+       if (nresult == 0)
+       {
+               pfree(values);
+               pfree(nulls);
+               return construct_empty_array(element_type);
+       }
+
        /* Allocate and initialize the result array */
        if (hasnulls)
        {
index 76a8c56a76adc7e43dd3bbd841ee4c2e362efb48..d47861e3dde7b02a9c8c52a52e1f3e9a8627d6f7 100644 (file)
@@ -1577,6 +1577,12 @@ select array_remove(array['A','CC','D','C','RR'], 'RR');
 
 select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed
 ERROR:  removing elements from multidimensional arrays is not supported
+select array_remove(array['X','X','X'], 'X') = '{}';
+ ?column? 
+----------
+ t
+(1 row)
+
 select array_replace(array[1,2,5,4],5,3);
  array_replace 
 ---------------
index e6df37216b5ca692b74ca1b9ce4ab55e41dcd8f7..5a5a5825d555ef8c8448935a9dec808e75aff040 100644 (file)
@@ -438,6 +438,7 @@ select array_remove(array[1,2,2,3], 5);
 select array_remove(array[1,NULL,NULL,3], NULL);
 select array_remove(array['A','CC','D','C','RR'], 'RR');
 select array_remove('{{1,2,2},{1,4,3}}', 2); -- not allowed
+select array_remove(array['X','X','X'], 'X') = '{}';
 select array_replace(array[1,2,5,4],5,3);
 select array_replace(array[1,2,5,4],5,NULL);
 select array_replace(array[1,2,NULL,4,NULL],NULL,5);