Skip to content

Conversation

@bnestere
Copy link
Contributor

@bnestere bnestere commented Jan 8, 2026

A failed GRANT on a procedure will be replicated when sql_mode does not
have NO_AUTO_CREATE_USER. This is because the function
mysql_routine_grant() does not check if an error occured while
performing the GRANT on a procedure before binlogging, it simply always
binlogs.

This patch fixes this problem by checking if an error happened
previously before binlogging, and if so, then skip binlogging.

Note there is still a broader issue in this area leading to replication
divergence. Reported in MDEV-29848, a partially-completed GRANT
statment (where some earlier GRANTS succeed and a later fails) will not
binlog. Note this affects all grant types, whereas the issue addressed
in this patch is limited to GRANT EXECUTE ON PROCEDURE. This patch
makes GRANT EXECUTE ON PROCEDURE binlogging behavior consistent with
the other grant types. A separate follow-up patch will address the
broader MDEV-29848 issue.

The test rpl.rpl_grant is extended with a test-case for this issue.

This PR is organized as follows:

  1. The first commit is the test case addition to rpl.rpl_grant to showcase the issue
  2. The second commit is the patch which contains the fix

Test case to showcase MDEV-38506:

A failed GRANT on a procedure will be replicated when sql_mode does not
have NO_AUTO_CREATE_USER. This is because the function
mysql_routine_grant() does not check if an error occured while
performing the GRANT on a procedure before binlogging, it simply always
binlogs.
@bnestere bnestere requested a review from vuvova January 8, 2026 21:24
@bnestere bnestere added MariaDB Corporation Replication Patches involved in replication labels Jan 8, 2026
A failed GRANT on a procedure will be replicated when sql_mode does not
have NO_AUTO_CREATE_USER. This is because the function
mysql_routine_grant() does not check if an error occured while
performing the GRANT on a procedure before binlogging, it simply always
binlogs.

This patch fixes this problem by checking if an error happened
previously before binlogging, and if so, then skip binlogging.

Note there is still a broader issue in this area leading to replication
divergence. Reported in MDEV-29848, a partially-completed GRANT
statment (where some earlier GRANTS succeed and a later fails) will not
binlog. Note this affects all grant types, whereas the issue addressed
in this patch is limited to GRANT EXECUTE ON PROCEDURE. This patch
makes GRANT EXECUTE ON PROCEDURE binlogging behavior consistent with
the other grant types. A separate follow-up patch will address the
broader MDEV-29848 issue.

Reviewed-by: TODO
Signed-off-by: Brandon Nesterenko <[email protected]>
rpl_do_grant.test took advantage of MDEV-38506 so a partially-failing
REVOKE EXECUTE ON PROCEDURE would still replicate.

This commit disables the problematic test case with a TODO note to
re-enable it once MDEV-29848 is fixed.
-- sync_slave_with_master
--echo #
--echo # TODO: Re-enable test-case after fixing MDEV-29848
--echo #
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wrapping the test in if (0) { ... } would likely create a smaller diff

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

MariaDB Corporation Replication Patches involved in replication

Development

Successfully merging this pull request may close these issues.

3 participants