Don't emit non-canonical empty arrays in array_remove().
authorNoah Misch
Sat, 1 Jun 2013 01:50:59 +0000 (21:50 -0400)
committerNoah Misch
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);