Bug #23001 | 'traditional' mode + triggers/stored functions result in inconsistent behavior | ||
---|---|---|---|
Submitted: | 5 Oct 2006 5:00 | Modified: | 12 Oct 2006 14:47 |
Reporter: | Dmitry Lenev | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server | Severity: | S3 (Non-critical) |
Version: | 5.0.27-bk | OS: | Linux (Linux Suse 10.1) |
Assigned to: | Marc ALFF | CPU Architecture: | Any |
[5 Oct 2006 5:00]
Dmitry Lenev
[5 Oct 2006 7:36]
Sveta Smirnova
Thank you for the report. Verified as described on Linux using last BK sources.
[5 Oct 2006 14:12]
Marc ALFF
Root cause is related to thd->abort_on_warning=0, as found during investigation of Bug#20028
[5 Oct 2006 19:05]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/13139 ChangeSet@1.2275, 2006-10-05 13:05:13-07:00, malff@weblab.(none) +7 -0 Bug#23001 ('traditional' mode + triggers/stored functions result in inconsistent behavior) As per the definition of SQL_MODE='TRADITIONAL', execution of an INSERT or a DELETE statement must fail with an error if a warning is raised during the statement execution. The code covered by this behavior includes the logic present in INSERT or UPDATE TRIGGERS, if any. At the code level, the traditional mode is implemented using THD::abort_on_warning. Before this fix, any statement that is sensitive to SQL_MODE='TRADITIONAL' would set THD::abort_on_warning, execute protected code, and reset THD::abort_on_warning to 0. This in fact destroyed the THD::abort_on_warning property for nested statements, because the code is recursive in nature with triggers. After this fix, THD::abort_on_warning is restored to it's former value instead, so that execution of the calling statement can resume with the correct execution context. A test case has been added to exibit the bugs, and shows all the statements that are involved. LOAD DATA INTO TABLE also affects the THD::abort_on_warning property and has been fixed for consistency, even if this statement is not allowed inside a trigger.
[5 Oct 2006 19:11]
Marc ALFF
Note to the reviewer: This fix covers the trigger part only, the issue with stored functions is a duplicate of Bug#20028.
[12 Oct 2006 14:47]
Marc ALFF
After very long discussions (kostja, dlenev, marc), the current understanding of the definition of 'TRADITIONAL' is that thd->abort_on_warning should not be set inside a trigger. The issue will be addressed by Bug#20028 The side effect of the insert statement (and others) clearing thd->abort_on_warning when executed inside a trigger caused the behavior seen, but turns out to be "not a bug" due to the change of interpretation of the meaning of 'TRADITIONAL' with triggers. See the code review comments from kostja on the proposed patch for details. Changing from "Patch Pending" to "Not a bug".