• Gleb Shchepa's avatar
    Bug #44768: SIGFPE crash when selecting rand from a view containing null · 405bd2af
    Gleb Shchepa authored
    The RAND(N) function where the N is a field of "constant" table
    (table of single row) failed with a SIGFPE.
    
    Evaluation of RAND(N) rely on constant status of its argument.
    Current server "seeded" random value for each constant argument
    only once, in the Item_func_rand::fix_fields method.
    Then the server skipped a call to seed_random() in the
    Item_func_rand::val_real method for such constant arguments.
    
    However, non-constant state of an argument may be changed
    after the call to fix_fields, if an argument is a field of
    "constant" table. Thus, pre-initialization of random value
    in the fix_fields method is too early.
    
    
    Initialization of random value by seed_random() has been
    removed from Item_func_rand::fix_fields method.
    The Item_func_rand::val_real method has been modified to
    call seed_random() on the first evaluation of this method
    if an argument is a function.
    
    
    mysql-test/r/func_math.result:
      Added test case for bug #44768.
    mysql-test/t/func_math.test:
      Added test case for bug #44768.
    sql/item_func.cc:
      Bug #44768: SIGFPE crash when selecting rand from a view containing null
      
      1. Initialization of random value by seed_random() has been
         removed from Item_func_rand::fix_fields method.
      2. The Item_func_rand::val_real method has been modified to
         call seed_random() on the first evaluation of this method
         if an argument is a function.
    sql/item_func.h:
      Bug #44768: SIGFPE crash when selecting rand from a view containing null
      
      1. The Item_func_rand::first_eval has been added to trace
         the first evaluation of the val_real method.
      2. The Item_func_rand::cleanup method has been added to
         cleanup the first_eval flag.
    405bd2af
item_func.h 47.9 KB