Thread

Commits

  1. Fix handling of empty arrays in array_fill().

  1. BUG #14487: malformed empty array from array_fill

    Andrew Gierth <andrew@tao11.riddles.org.uk> — 2017-01-05T15:21:56Z

    The following bug has been logged on the website:
    
    Bug reference:      14487
    Logged by:          Andrew Gierth
    Email address:      andrew@tao11.riddles.org.uk
    PostgreSQL version: 9.6.1
    Operating system:   any
    Description:        
    
    array_fill returns a malformed empty array when given a size of zero:
    
    select a, a = '{}' from (select array_fill(null::integer, array[0]) as a)
    s;
     a  | ?column? 
    ----+----------
     {} | f
    
    The result actually has ndims=1 and a length of 0, which can be checked with
    array_length(a,1).
    
    Obvious fix is to move the fast-track empty result to after computing
    nitems?
    
    
    
  2. Re: BUG #14487: malformed empty array from array_fill

    Andrew Gierth <andrew@tao11.riddles.org.uk> — 2017-01-05T15:33:19Z

    >>>>> "andrew" == andrew  <andrew@tao11.riddles.org.uk> writes:
    
     andrew> array_fill returns a malformed empty array when given a size of
     andrew> zero:
    
    Also, why does array_fill reject the case of an empty array of
    dimensions?  It seems obvious that it should return an empty array
    result in such cases.
    
    -- 
    Andrew (irc:RhodiumToad)
    
    
    
  3. Re: BUG #14487: malformed empty array from array_fill

    Tom Lane <tgl@sss.pgh.pa.us> — 2017-01-05T15:55:13Z

    Andrew Gierth <andrew@tao11.riddles.org.uk> writes:
    > "andrew" == andrew  <andrew@tao11.riddles.org.uk> writes:
    >  andrew> array_fill returns a malformed empty array when given a size of
    >  andrew> zero:
    
    > Also, why does array_fill reject the case of an empty array of
    > dimensions?  It seems obvious that it should return an empty array
    > result in such cases.
    
    Yeah.  The code seems to have been intending to allow that:
    
    	ndims = ARR_DIMS(dims)[0];
    
    	if (ndims < 0)				/* we do allow zero-dimension arrays */
    
    but it doesn't work right, precisely because that case comes out
    as being zero-dimensional not one dimension of length 0.
    
    Ideally I think we would reject zeroes in the lengths array as being an
    error, but it's probably too late for that, because likely people are
    using array[0] to get an empty result array since '{}' doesn't work.
    
    It also strikes me that this restriction is quite pointless:
    
    	if (ARR_LBOUND(dims)[0] != 1)
    		ereport(ERROR,
    				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
    				 errmsg("wrong range of array subscripts"),
    				 errdetail("Lower bound of dimension array must be one.")));
    
    I think it's reasonable to disallow multi-dimensional input arrays here,
    but I don't see why it matters what the LB is.
    
    			regards, tom lane