• unknown's avatar
    Fix for bug#21795: SP: sp_head::is_not_allowed_in_function() contains · dfb72bb9
    unknown authored
    erroneous check
    
    Problem: Actually there were two problems in the server code. The check
    for SQLCOM_FLUSH in SF/Triggers were not according to the existing
    architecture which uses sp_get_flags_for_command() from sp_head.cc .
    This function was also missing a check for SQLCOM_FLUSH which has a
    problem combined with prelocking. This changeset fixes both of these
    deficiencies as well as the erroneous check in
    sp_head::is_not_allowed_in_function() which was a copy&paste error.
    
    
    mysql-test/r/sp-error.result:
      update result
    mysql-test/r/trigger.result:
      update result
    mysql-test/t/sp-error.test:
      FLUSH can create a problem with prelocking, hence it's disabled.
      There is a better way to check this than a check in the parser.
      Now we use sp_get_flags_for_command() and the error returned is
      different.
    mysql-test/t/trigger.test:
      FLUSH can create a problem with prelocking, hence it's disabled.
      There is a better way to check this than a check in the parser.
      Now we use sp_get_flags_for_command() and the error returned is
      different.
    sql/sp_head.cc:
      FLUSH and RESET are not allowed inside a SF/Trigger.
      Because they don't imply a COMMIT sp_head::HAS_COMMIT_OR_ROLLBACK
      cannot be used. Two new flags were introduced for that reason.
    sql/sp_head.h:
      Don't check m_type as this check is erroneous. This is probably
      a copy and paste error when moving code from somewhere else. Another
      fact which supports this was prefixing the enum value with the name
      of class sp_head.
      
      Adding two new flags HAS_SQLCOM_RESET and HAS_SQLCOM_FLUSH. The values
      are 2048 and 4096 because in the 5.1 branch there are already new flags
      which are with values up-to 1024.
    sql/sql_parse.cc:
      FLUSH can cause a problem with prelocking in SF/Trigger and
      therefore is already disabled. RESET is also disabled because
      is handled by the same code as FLUSH. We won't allow RESET inside
      SF/Trigger at that stage without thorough analysis. The check for
      them is already done in the parser by calling
      is_not_allowed_in_function()
    sql/sql_yacc.yy:
      By listing SQLCOM_FLUSH as command which implies COMMIT
      in sp_get_flags_for_command() the check in sql_yacc.yy is
      obsolete.
    dfb72bb9
sp_head.h 28.3 KB