• Alexander Nozdrin's avatar
    Auto-merge from mysql-trunk-bugfixing. · b2f80050
    Alexander Nozdrin authored
    ******
    This patch fixes the following bugs:
      - Bug#5889: Exit handler for a warning doesn't hide the warning in
        trigger
      - Bug#9857: Stored procedures: handler for sqlwarning ignored
      - Bug#23032: Handlers declared in a SP do not handle warnings generated
        in sub-SP
      - Bug#36185: Incorrect precedence for warning and exception handlers
    
    The problem was in the way warnings/errors during stored routine execution
    were handled. Prior to this patch the logic was as follows:
    
      - when a warning/an error happens: if we're executing a stored routine,
        and there is a handler for that warning/error, remember the handler,
        ignore the warning/error and continue execution.
    
      - after a stored routine instruction is executed: check for a remembered
        handler and activate one (if any).
    
    This logic caused several problems:
    
      - if one instruction generates several warnings (errors) it's impossible
        to choose the right handler -- a handler for the first generated
        condition was chosen and remembered for activation.
    
      - mess with handling conditions in scopes different from the current one.
    
      - not putting generated warnings/errors into Warning Info (Diagnostic
        Area) is against The Standard.
    
    The patch changes the logic as follows:
    
      - Diagnostic Area is cleared on the beginning of each statement that
        either is able to generate warnings, or is able to work with tables.
    
      - at the end of a stored routine instruction, Diagnostic Area is left
        intact.
    
      - Diagnostic Area is checked after each stored routine instruction. If
        an instruction generates several condition, it's now possible to take a
        look at all of them and determine an appropriate handler.
    b2f80050
signal.result 63.8 KB