• Vicențiu Ciorbaru's avatar
    MDEV-12666: CURRENT_ROLE() and DATABASE() does not work in a view · f0ad9340
    Vicențiu Ciorbaru authored
    The problem lies in how CURRENT_ROLE is defined. The
    Item_func_current_role inherits from Item_func_sysconst, which defines
    a safe_charset_converter to be a const_charset_converter.
    
    During view creation, if there is no role previously set, the current_role()
    function returns NULL.
    
    This is captured on item instantiation and the
    const_charset_converter call subsequently returns an Item_null.
    In turn, the function is replaced with Item_null and the view is
    then created with an Item_null instead of Item_func_current_role.
    
    Without this patch, the first SHOW CREATE VIEW from the testcase would
    have a where clause of WHERE role_name = NULL, while the second SHOW
    CREATE VIEW would show a correctly created view.
    
    The same applies for the DATABASE function, as it can change as well.
    
    There is an additional problem with CURRENT_ROLE() when used in a
    prepared statement. During prepared statement creation we used to set
    the string_value of the function to the current role as well as the
    null_value flag. During execution, if CURRENT_ROLE was not null, the
    null_value flag was never set to not-null during fix_fields.
    
    Item_func_current_user however can never be NULL so it did not show this
    problem in a view before. At the same time, the CURRENT_USER() can not
    be changed between prepared statement execution and creation so the
    implementation where the value is stored during fix_fields is
    sufficient.
    
    Note also that DATABASE() function behaves differently during prepared
    statements. See bug 25843 for details or commit
    7e0ad09e
    f0ad9340
item_strfunc.h 32.3 KB