• Alexander Barkov's avatar
    MDEV-30931 UBSAN: negation of -X cannot be represented in type 'long long... · 79253261
    Alexander Barkov authored
    MDEV-30931 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in get_interval_value on SELECT
    
    - Fixing the code in get_interval_value() to use Longlong_hybrid_null.
      This allows to handle correctly:
    
      - Signed and unsigned arguments
        (the old code assumed the argument to be signed)
      - Avoid undefined negation behavior the corner case with LONGLONG_MIN
    
      This fixes the UBSAN warning:
        negation of -9223372036854775808 cannot be represented
        in type 'long long int';
    
    - Fixing the code in get_interval_value() to avoid overflow in
      the INTERVAL_QUARTER and INTERVAL_WEEK branches.
      This fixes the UBSAN warning:
        signed integer overflow: -9223372036854775808 * 7 cannot be represented
        in type 'long long int'
    
    - Fixing the INTERVAL_WEEK branch in date_add_interval() to handle
      huge numbers correctly. Before the change, huge positive numeber
      were treated as their negative complements.
      Note, some other branches still can be affected by this problem
      and should also be fixed eventually.
    79253261
my_strtoll10.c 6.77 KB