• Alvaro Herrera's avatar
    Fix BRIN free space computations · 21a4e4a4
    Alvaro Herrera authored
    A bug in the original free space computation made it possible to
    return a page which wasn't actually able to fit the item.  Since the
    insertion code isn't prepared to deal with PageAddItem failing, a PANIC
    resulted ("failed to add BRIN tuple [to new page]").  Add a macro to
    encapsulate the correct computation, and use it in
    brin_getinsertbuffer's callers before calling that routine, to raise an
    early error.
    
    I became aware of the possiblity of a problem in this area while working
    on ccc4c074.  There's no archived discussion about it, but it's
    easy to reproduce a problem in the unpatched code with something like
    
    CREATE TABLE t (a text);
    CREATE INDEX ti ON t USING brin (a) WITH (pages_per_range=1);
    
    for length in `seq 8000 8196`
    do
    	psql -f - <<EOF
    TRUNCATE TABLE t;
    INSERT INTO t VALUES ('z'), (repeat('a', $length));
    EOF
    done
    
    Backpatch to 9.5, where BRIN was introduced.
    21a4e4a4
brin_pageops.c 24 KB