• Alvaro Herrera's avatar
    Use the right memory context for partkey's FmgrInfo · a4d56f58
    Alvaro Herrera authored
    We were using CurrentMemoryContext to put the partsupfunc fmgr_info
    into, which isn't right, because we want the PartitionKey as a whole to
    be in the isolated Relation->rd_partkeycxt context.  This can cause a
    crash with user-defined support functions in the operator classes used
    by partitioning keys.  (Maybe this can cause problems with core-supplied
    opclasses too, not sure.)
    
    This is demonstrably broken in Postgres 10, too, but the initial
    proposed fix runs afoul of a problem discussed back when 8a0596cb
    ("Get rid of copy_partition_key") reorganized that code: namely that it
    is possible to jump out of RelationBuildPartitionKey because of some
    error and leave a dangling memory context child of CacheMemoryContext.
    Also, while reviewing this I noticed that the removed-in-pg11
    copy_partition_key was doing something wrong, unfixed in pg10, namely
    doing memcpy() on the FmgrInfo, which is bogus (should be doing
    fmgr_info_copy).  Therefore, in branch pg10, the sane fix seems to be to
    backpatch both the aforementioned 8a0596cb and its followup
    be234322 ("Protect against hypothetical memory leaks in
    RelationGetPartitionKey"), so do that, then apply the fmgr_info memcxt
    bugfix on top.
    
    Add a test case exercising btree-based custom operator classes, which
    causes a crash prior to this fix.  This is not a security problem,
    because in order to create an operator class you need superuser
    privileges anyway.
    
    Authors: Álvaro Herrera and Amit Langote
    Reported and diagnosed by: Amit Langote
    Discussion: https://postgr.es/m/3041e853-b1dd-a0c6-ff21-7cc5633bffd0@lab.ntt.co.jp
    a4d56f58
create_table.sql 21.2 KB