• Monty's avatar
    Optimize usage of c_ptr(), c_ptr_quick() and String::alloc() · 36cdd5c3
    Monty authored
    The problem was that when one used String::alloc() to allocate a string,
    the String ensures that there is space for an extra NULL byte in the
    buffer and if not, reallocates the string. This is a problem with the
    String::set_int() that calls alloc(21), which forces extra
    malloc/free calls to happen.
    
    - We do not anymore re-allocate String if alloc() is called with the
      Allocated_length. This reduces number of malloc() allocations,
      especially one big re-allocation in Protocol::send_result_Set_metadata()
      for almost every query that produced a result to the connnected client.
    - Avoid extra mallocs when using LONGLONG_BUFFER_SIZE
      This can now be done as alloc() doesn't increase buffers if new length is
      not bigger than old one.
    - c_ptr() is redesigned to be safer (but a bit longer) than before.
    - Remove wrong usage of c_ptr_quick()
      c_ptr_quick() was used in many cases to get the pointer to the used
      buffer, even when it didn't need to be \0 terminated. In this case
      ptr() is a better substitute.
      Another problem with c_ptr_quick() is that it did not guarantee that
      the string would be \0 terminated.
    - item_val_str(), an API function not used currently by the server,
      now always returns a null terminated string (before it didn't always
      do that).
    - Ensure that all String allocations uses STRING_PSI_MEMORY_KEY. The old
      mixed usage of performance keys caused assert's when String buffers
      where shrunk.
    - Binary_string::shrink() is simplifed
    - Fixed bug in String(const char *str, size_t len, CHARSET_INFO *cs) that
      used Binary_string((char *) str, len) instead of Binary_string(str,len).
    - Changed argument to String() creations and String.set() functions to use
      'const char*' instead of 'char*'. This ensures that Alloced_length is
      not set, which gives safety against someone trying to change the
      original string. This also would allow us to use !Alloced_length in
      c_ptr() if needed.
    - Changed string_ptr_cmp() to use memcmp() instead of c_ptr() to avoid
      a possible malloc during string comparision.
    36cdd5c3
sql_repl.cc 147 KB