delete_undef_values function fix bug #20681

    (#20681) fix behaviour of delete_undef_values
    
    The issue #20681 describe the error of delete() function
    removing the elements from the origin array/hash/string.
    
    This issue affected other delete functions. Because
    ruby delete and delete_if functions make destructive
    changes to the origin array/hash.
    
    The delete_undef_values removed elements from the
    origin array/hash and this is not the desired behaviour.
    
    To solve this, we should dup or clone the array/hash
    before using the delete or delete_if ruby functions.
    
    We should also check if args[0] is not nil before using
    dup, since dup on nil raises exception.
    
    This fix the problem and add unit tests, so we could
    enforce this behaviour and prevent regressions.