Logical replication row filtering and TOAST - Mailing list pgsql-hackers

From Antonin Houska
Subject Logical replication row filtering and TOAST
Date
Msg-id 84638.1649152255@antos
Whole thread Raw
Responses Re: Logical replication row filtering and TOAST  (Antonin Houska <ah@cybertec.at>)
List pgsql-hackers
I spent some time thinking about a special case of evaluation of the row
filter and wrote a comment that might be useful (see the attachment). However
now I think that it's not perfect if the code really relies on the fact that
value of an indexed column cannot be TOASTed due to size restrictions.

I could hit two different error messages when trying activate TOAST on an
index column (in this case PG was build with 16kB pages), but still I think
the code is unnecessarily fragile if it relies on such errors:


ERROR:  index row requires 8224 bytes, maximum size is 8191

ERROR:  index row size 8048 exceeds btree version 4 maximum 5432 for index "b_pkey"
DETAIL:  Index row references tuple (0,3) in relation "b".
HINT:  Values larger than 1/3 of a buffer page cannot be indexed.


Note that at least in ExtractReplicaIdentity() we do expect that an indexed
column value can be TOASTed.

    /*
     * If the tuple, which by here only contains indexed columns, still has
     * toasted columns, force them to be inlined. This is somewhat unlikely
     * since there's limits on the size of indexed columns, so we don't
     * duplicate toast_flatten_tuple()s functionality in the above loop over
     * the indexed columns, even if it would be more efficient.
     */
    if (HeapTupleHasExternal(key_tuple))
    {
        HeapTuple    oldtup = key_tuple;

        key_tuple = toast_flatten_tuple(oldtup, desc);
        heap_freetuple(oldtup);
    }

Do I miss anything?

-- 
Antonin Houska
Web: https://www.cybertec-postgresql.com


Attachment

pgsql-hackers by date:

Previous
From: Daniel Gustafsson
Date:
Subject: Re: Frontend error logging style
Next
From: Alvaro Herrera
Date:
Subject: Re: generic plans and "initial" pruning