List:Commits« Previous MessageNext Message »
From:Alexander Nozdrin Date:January 19 2011 12:47pm
Subject:Re: bzr commit into mysql-trunk-bugfixing branch (alexander.nozdrin:3421)
Bug#55847
View as plain text  
Hi Davi,

thanks for the review. I'll submit a new patch shortly.
See also comments below.

On 01/17/11 12:18, Davi Arnaut wrote:
>>         The problem was in a hackish THD::no_warnings_for_error attribute.
>>         When it was set, an error was not written to Warning_info -- only
>>         Diagnostics_area state was changed.
> 
> What was the consequence? I mean, I agree this is hack, nonetheless, it
> would be nice to have an explanation of the specific problem.

Ultimately, that is needed for a fix for Bug#55843.
I'll add more notes to new changeset comment.

>> === modified file 'sql/sql_admin.cc'
>> --- a/sql/sql_admin.cc	2010-11-18 16:34:56 +0000
>> +++ b/sql/sql_admin.cc	2010-12-11 20:17:36 +0000
>> @@ -336,13 +336,36 @@ static bool mysql_admin_table(THD* thd,
>>            so any errors opening the table are logical errors.
>>            In these cases it makes sense to report them.
>>          */
>> -      if (!thd->locked_tables_mode)
>> -        thd->no_warnings_for_error= no_warnings_for_error;
>> +      Diagnostics_area da;
>> +      Warning_info wi(thd->query_id);
>> +      Diagnostics_area *da_saved= thd->stmt_da;
>> +      Warning_info *wi_saved= thd->warning_info;
> 
> Don't we just need to save and restore warning_info?

You're right. Removing here, there and elsewhere.

>> === modified file 'sql/sql_parse.cc'
>> --- a/sql/sql_parse.cc	2010-11-29 11:28:55 +0000
>> +++ b/sql/sql_parse.cc	2010-12-11 20:17:36 +0000
>> @@ -7267,6 +7267,7 @@ bool parse_sql(THD *thd,
>>      /* Check that if MYSQLparse() failed, thd->is_error() is set. */
>>
>>      DBUG_ASSERT(!mysql_parse_status ||
>> +              (mysql_parse_status&&   thd->get_internal_handler())
> ||
> 
> Why was the assert changed? Please write per-file comments.

It's coupled with Trigger_error_handler in sql_show.cc. See below.

>> +              Trigger_error_handler err_handler;
>> +              thd->push_internal_handler(&err_handler);
>> +
>> +              int res= fill_schema_table_from_frm(thd, tables, schema_table,
> db_name,
>> +                                                  table_name, schema_table_idx,
>> +                                                  can_deadlock);
> 
> I don't understand this change.
> 
> Now it's safe to generate warning messages, except for those that are
> handled? What happens if one of these errors is raised but are ignored?
> It seems they weren't being exactly ignored before.

It is/was a bit messy.

The thing is that when triggers are loaded, several errors/warnings
might happen. In particular, the following ones had special "handling":

  - ER_PARSE_ERROR -- obviously happens when trigger definition
    is garbled. The logic was as follows:
      - set the magic flag (no_warnings_for_error)
      - parsing error
      - throw an error
      - set error state in THD
      - return error from MYSQLparse()
      - check that there is an error, and if that's an ER_PARSE_ERROR, clear it
      - return (trigger is not loaded, no error; thus invalid trigger is
        just skipped)
      - reset the magic flag

  - ER_TRG_NO_DEFINER & ER_TRG_NO_CREATION_CTX -- check_n_load() used to
    throw those warnings unless no_warnings_for_error is set.

So, all in all, this internal error handler is to silence these three
SQL-conditions, which were silenced using no_warnings_for_error hack.

> 
>> +              thd->pop_internal_handler();
> 
> Please add a test case for this change.

There is a test case for that -- it's in trigger tests.

If you remove any line of that new code, some trigger test will start
to fail immediately.

> You could make this into a visitor pattern...
> 
>> +        thd->warning_info->append_warnings(thd,&wi.warn_list());
> 
> which could be passed through append_warnings.

I'm not sure, I fully catch your idea.If that is what I think, I'd procrastinate
on that until there are more use cases. Could you sketch it put plz?
Thread
bzr commit into mysql-trunk-bugfixing branch (alexander.nozdrin:3421)Bug#55847Alexander Nozdrin11 Dec
  • Re: bzr commit into mysql-trunk-bugfixing branch (alexander.nozdrin:3421)Bug#55847Davi Arnaut17 Jan
    • Re: bzr commit into mysql-trunk-bugfixing branch (alexander.nozdrin:3421)Bug#55847Alexander Nozdrin19 Jan