• Sergei Petrunia's avatar
    MDEV-20611: MRR scan over partitioned InnoDB table produces "Out of memory" error · 86167e90
    Sergei Petrunia authored
    Fix partitioning and DS-MRR to work together
    
    - In ha_partition::index_end(): take into account that ha_innobase (and
      other engines using DS-MRR) will have inited=RND when initialized for
      DS-MRR scan.
    - In ha_partition::multi_range_read_next(): if the MRR scan is using
      HA_MRR_NO_ASSOCIATION mode, it is not guaranteed that the partition's
      handler will store anything into *range_info.
    - In DsMrr_impl::choose_mrr_impl(): ha_partition will inquire partitions
      about how much memory their MRR implementation needs by passing
      *buffer_size=0. DS-MRR code didn't know about this (actually it used
      uint for buffer size calculation and would have an under-flow).
      Returning *buffer_size=0 made ha_partition assume that partitions do
      not need MRR memory and pass the same buffer to each of them.
    
      Now, this is fixed. If DS-MRR gets *buffer_size=0, it will return
      the amount of buffer space needed, but not more than about
      @@mrr_buffer_size.
    
    * Fix ha_{innobase,maria,myisam}::clone. If ha_partition uses MRR on its
      partitions, and partition use DS-MRR, the code will call handler->clone
      with TABLE (*NOT partition*) name as an argument.
      DS-MRR has no way of knowing the partition name, so the solution was
      to have the ::clone() function for the affected storage engine to ignore
      the name argument and get it elsewhere.
    86167e90
partition_mrr.inc 977 Bytes