List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:December 15 2009 10:15am
Subject:bzr commit into mysql-5.1-bugteam branch (Sergey.Glukhov:3273)
Bug#49501
View as plain text  
#At file:///home/gluh/MySQL/mysql-5.1-bug-49501/ based on revid:zhenxing.he@stripped

 3273 Sergey Glukhov	2009-12-15
      Bug#49501 Inefficient information_schema check (system collation)
      added check_length optimization for I_S_NAME comparison
     @ sql/event_data_objects.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/events.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/mysql_priv.h
        added check_length optimization for I_S_NAME comparison
     @ sql/repl_failsafe.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/sql_db.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/sql_parse.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/sql_show.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/sql_view.cc
        added check_length optimization for I_S_NAME comparison
     @ sql/table.cc
        added check_length optimization for I_S_NAME comparison

    modified:
      sql/event_data_objects.cc
      sql/events.cc
      sql/mysql_priv.h
      sql/repl_failsafe.cc
      sql/sql_db.cc
      sql/sql_parse.cc
      sql/sql_show.cc
      sql/sql_view.cc
      sql/table.cc
=== modified file 'sql/event_data_objects.cc'
--- a/sql/event_data_objects.cc	2009-10-16 10:29:42 +0000
+++ b/sql/event_data_objects.cc	2009-12-15 10:15:32 +0000
@@ -1401,7 +1401,7 @@ Event_job_data::execute(THD *thd, bool d
 #endif
 
   if (check_access(thd, EVENT_ACL, dbname.str,
-                   0, 0, 0, is_schema_db(dbname.str)))
+                   0, 0, 0, is_schema_db(dbname.str, dbname.length)))
   {
     /*
       This aspect of behavior is defined in the worklog,

=== modified file 'sql/events.cc'
--- a/sql/events.cc	2009-10-16 10:29:42 +0000
+++ b/sql/events.cc	2009-12-15 10:15:32 +0000
@@ -415,7 +415,8 @@ Events::create_event(THD *thd, Event_par
   DBUG_ASSERT(parse_data->expression || parse_data->execute_at);
 
   if (check_access(thd, EVENT_ACL, parse_data->dbname.str, 0, 0, 0,
-                   is_schema_db(parse_data->dbname.str)))
+                   is_schema_db(parse_data->dbname.str,
+                                parse_data->dbname.length)))
     DBUG_RETURN(TRUE);
 
   if (check_db_dir_existence(parse_data->dbname.str))
@@ -526,7 +527,8 @@ Events::update_event(THD *thd, Event_par
     DBUG_RETURN(TRUE);
 
   if (check_access(thd, EVENT_ACL, parse_data->dbname.str, 0, 0, 0,
-                   is_schema_db(parse_data->dbname.str)))
+                   is_schema_db(parse_data->dbname.str,
+                                parse_data->dbname.length)))
     DBUG_RETURN(TRUE);
 
   if (new_dbname)                               /* It's a rename */
@@ -548,7 +550,7 @@ Events::update_event(THD *thd, Event_par
       access it.
     */
     if (check_access(thd, EVENT_ACL, new_dbname->str, 0, 0, 0,
-                     is_schema_db(new_dbname->str)))
+                     is_schema_db(new_dbname->str, new_dbname->length)))
       DBUG_RETURN(TRUE);
 
     /* Check that the target database exists */
@@ -653,7 +655,7 @@ Events::drop_event(THD *thd, LEX_STRING 
     DBUG_RETURN(TRUE);
 
   if (check_access(thd, EVENT_ACL, dbname.str, 0, 0, 0,
-                   is_schema_db(dbname.str)))
+                   is_schema_db(dbname.str, dbname.length)))
     DBUG_RETURN(TRUE);
 
   /*
@@ -811,7 +813,7 @@ Events::show_create_event(THD *thd, LEX_
     DBUG_RETURN(TRUE);
 
   if (check_access(thd, EVENT_ACL, dbname.str, 0, 0, 0,
-                   is_schema_db(dbname.str)))
+                   is_schema_db(dbname.str, dbname.length)))
     DBUG_RETURN(TRUE);
 
   /*
@@ -869,7 +871,8 @@ Events::fill_schema_events(THD *thd, TAB
   if (thd->lex->sql_command == SQLCOM_SHOW_EVENTS)
   {
     DBUG_ASSERT(thd->lex->select_lex.db);
-    if (!is_schema_db(thd->lex->select_lex.db) &&  // There is no events in I_S
+    if (!is_schema_db(thd->lex->select_lex.db,   // There is no events in I_S
+                      strlen(thd->lex->select_lex.db)) &&
         check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0, 0))
       DBUG_RETURN(1);
     db= thd->lex->select_lex.db;

=== modified file 'sql/mysql_priv.h'
--- a/sql/mysql_priv.h	2009-10-27 13:20:34 +0000
+++ b/sql/mysql_priv.h	2009-12-15 10:15:32 +0000
@@ -1415,8 +1415,12 @@ bool get_schema_tables_result(JOIN *join
                               enum enum_schema_table_state executed_place);
 enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table);
 
-#define is_schema_db(X) \
-  !my_strcasecmp(system_charset_info, INFORMATION_SCHEMA_NAME.str, (X))
+inline bool is_schema_db(const char *name, size_t len)
+{
+  return (INFORMATION_SCHEMA_NAME.length == len &&
+          !my_strcasecmp(system_charset_info,
+                         INFORMATION_SCHEMA_NAME.str, name));  
+}
 
 /* sql_prepare.cc */
 

=== modified file 'sql/repl_failsafe.cc'
--- a/sql/repl_failsafe.cc	2009-11-20 15:18:01 +0000
+++ b/sql/repl_failsafe.cc	2009-12-15 10:15:32 +0000
@@ -905,7 +905,7 @@ bool load_master_data(THD* thd)
       if (!rpl_filter->db_ok(db) || 
 	  !rpl_filter->db_ok_with_wild_table(db) || 
 	  !strcmp(db,"mysql") ||
-          is_schema_db(db))
+          is_schema_db(db, strlen(db)))
       {
 	*cur_table_res = 0;
 	continue;

=== modified file 'sql/sql_db.cc'
--- a/sql/sql_db.cc	2009-12-09 06:24:54 +0000
+++ b/sql/sql_db.cc	2009-12-15 10:15:32 +0000
@@ -618,7 +618,7 @@ int mysql_create_db(THD *thd, char *db, 
   DBUG_ENTER("mysql_create_db");
 
   /* do not create 'information_schema' db */
-  if (!my_strcasecmp(system_charset_info, db, INFORMATION_SCHEMA_NAME.str))
+  if (is_schema_db(db, strlen(db)))
   {
     my_error(ER_DB_CREATE_EXISTS, MYF(0), db);
     DBUG_RETURN(-1);
@@ -1557,8 +1557,7 @@ bool mysql_change_db(THD *thd, const LEX
     }
   }
 
-  if (my_strcasecmp(system_charset_info, new_db_name->str,
-                    INFORMATION_SCHEMA_NAME.str) == 0)
+  if (is_schema_db(new_db_name->str, new_db_name->length))
   {
     /* Switch the current database to INFORMATION_SCHEMA. */
 

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2009-11-24 18:22:22 +0000
+++ b/sql/sql_parse.cc	2009-12-15 10:15:32 +0000
@@ -1303,8 +1303,7 @@ bool dispatch_command(enum enum_server_c
     table_list.alias= table_list.table_name= conv_name.str;
     packet= arg_end + 1;
 
-    if (!my_strcasecmp(system_charset_info, table_list.db,
-                       INFORMATION_SCHEMA_NAME.str))
+    if (is_schema_db(table_list.db, table_list.db_length))
     {
       ST_SCHEMA_TABLE *schema_table= find_schema_table(thd, table_list.alias);
       if (schema_table)
@@ -1366,7 +1365,7 @@ bool dispatch_command(enum enum_server_c
 	break;
       }
       if (check_access(thd, CREATE_ACL, db.str , 0, 1, 0,
-                       is_schema_db(db.str)))
+                       is_schema_db(db.str, db.length)))
 	break;
       general_log_print(thd, command, "%.*s", db.length, db.str);
       bzero(&create_info, sizeof(create_info));
@@ -1385,7 +1384,8 @@ bool dispatch_command(enum enum_server_c
 	my_error(ER_WRONG_DB_NAME, MYF(0), db.str ? db.str : "NULL");
 	break;
       }
-      if (check_access(thd, DROP_ACL, db.str, 0, 1, 0, is_schema_db(db.str)))
+      if (check_access(thd, DROP_ACL, db.str, 0, 1, 0,
+                       is_schema_db(db.str, db.length)))
 	break;
       if (thd->locked_tables || thd->active_transaction())
       {
@@ -2848,7 +2848,7 @@ end_with_restore_list:
 		       &first_table->grant.privilege, 0, 0,
                        test(first_table->schema_table)) ||
 	  check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0,
-                       is_schema_db(select_lex->db))||
+                       is_schema_db(select_lex->db, strlen(select_lex->db)))||
 	  check_merge_table_access(thd, first_table->db,
 				   (TABLE_LIST *)
 				   create_info.merge_list.first))
@@ -3597,7 +3597,7 @@ end_with_restore_list:
     }
 #endif
     if (check_access(thd,CREATE_ACL,lex->name.str, 0, 1, 0,
-                     is_schema_db(lex->name.str)))
+                     is_schema_db(lex->name.str, lex->name.length)))
       break;
     res= mysql_create_db(thd,(lower_case_table_names == 2 ? alias :
                               lex->name.str), &create_info, 0);
@@ -3632,7 +3632,7 @@ end_with_restore_list:
     }
 #endif
     if (check_access(thd,DROP_ACL,lex->name.str,0,1,0,
-                     is_schema_db(lex->name.str)))
+                     is_schema_db(lex->name.str, lex->name.length)))
       break;
     if (thd->locked_tables || thd->active_transaction())
     {
@@ -3666,9 +3666,12 @@ end_with_restore_list:
       my_error(ER_WRONG_DB_NAME, MYF(0), db->str);
       break;
     }
-    if (check_access(thd, ALTER_ACL, db->str, 0, 1, 0, is_schema_db(db->str)) ||
-        check_access(thd, DROP_ACL, db->str, 0, 1, 0, is_schema_db(db->str)) ||
-        check_access(thd, CREATE_ACL, db->str, 0, 1, 0, is_schema_db(db->str)))
+    if (check_access(thd, ALTER_ACL, db->str, 0, 1, 0,
+                     is_schema_db(db->str, db->length)) ||
+        check_access(thd, DROP_ACL, db->str, 0, 1, 0,
+                     is_schema_db(db->str, db->length)) ||
+        check_access(thd, CREATE_ACL, db->str, 0, 1, 0,
+                     is_schema_db(db->str, db->length)))
     {
       res= 1;
       break;
@@ -3711,7 +3714,8 @@ end_with_restore_list:
       break;
     }
 #endif
-    if (check_access(thd, ALTER_ACL, db->str, 0, 1, 0, is_schema_db(db->str)))
+    if (check_access(thd, ALTER_ACL, db->str, 0, 1, 0,
+                     is_schema_db(db->str, db->length)))
       break;
     if (thd->locked_tables || thd->active_transaction())
     {
@@ -3867,7 +3871,8 @@ end_with_restore_list:
 		     first_table ? &first_table->grant.privilege : 0,
 		     first_table ? 0 : 1, 0,
                      first_table ? (bool) first_table->schema_table :
-                     select_lex->db ? is_schema_db(select_lex->db) : 0))
+                     select_lex->db ?
+                     is_schema_db(select_lex->db, strlen(select_lex->db)) : 0))
       goto error;
 
     if (thd->security_ctx->user)              // If not replication
@@ -4210,7 +4215,8 @@ end_with_restore_list:
     }
 
     if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0,
-                     is_schema_db(lex->sphead->m_db.str)))
+                     is_schema_db(lex->sphead->m_db.str,
+                                  lex->sphead->m_db.length)))
       goto create_sp_error;
 
     if (end_active_trans(thd))
@@ -4865,7 +4871,8 @@ create_sp_error:
     res= mysql_xa_recover(thd);
     break;
   case SQLCOM_ALTER_TABLESPACE:
-    if (check_access(thd, ALTER_ACL, thd->db, 0, 1, 0, thd->db ? is_schema_db(thd->db) : 0))
+    if (check_access(thd, ALTER_ACL, thd->db, 0, 1, 0,
+                     thd->db ? is_schema_db(thd->db, thd->db_length) : 0))
       break;
     if (!(res= mysql_alter_tablespace(thd, lex->alter_tablespace_info)))
       my_ok(thd);
@@ -5304,7 +5311,7 @@ static bool check_show_access(THD *thd, 
 
     if (check_access(thd, SELECT_ACL, dst_db_name,
                      &thd->col_access, FALSE, FALSE,
-                     is_schema_db(dst_db_name)))
+                     is_schema_db(dst_db_name, strlen(dst_db_name))))
       return TRUE;
 
     if (!thd->col_access && check_grant_db(thd, dst_db_name))
@@ -6269,8 +6276,7 @@ TABLE_LIST *st_select_lex::add_table_to_
   ptr->force_index= test(table_options & TL_OPTION_FORCE_INDEX);
   ptr->ignore_leaves= test(table_options & TL_OPTION_IGNORE_LEAVES);
   ptr->derived=	    table->sel;
-  if (!ptr->derived && !my_strcasecmp(system_charset_info, ptr->db,
-                                      INFORMATION_SCHEMA_NAME.str))
+  if (!ptr->derived && is_schema_db(ptr->db, ptr->db_length))
   {
     ST_SCHEMA_TABLE *schema_table= find_schema_table(thd, ptr->table_name);
     if (!schema_table ||

=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc	2009-12-03 12:07:46 +0000
+++ b/sql/sql_show.cc	2009-12-15 10:15:32 +0000
@@ -826,8 +826,7 @@ bool mysqld_show_create_db(THD *thd, cha
     DBUG_RETURN(TRUE);
   }
 #endif
-  if (!my_strcasecmp(system_charset_info, dbname,
-                     INFORMATION_SCHEMA_NAME.str))
+  if (is_schema_db(dbname, strlen(dbname)))
   {
     dbname= INFORMATION_SCHEMA_NAME.str;
     create.default_table_charset= system_charset_info;
@@ -2780,8 +2779,8 @@ int make_db_list(THD *thd, List<LEX_STRI
   */
   if (lookup_field_vals->db_value.str)
   {
-    if (!my_strcasecmp(system_charset_info, INFORMATION_SCHEMA_NAME.str,
-                       lookup_field_vals->db_value.str))
+    if (is_schema_db(lookup_field_vals->db_value.str, 
+                     lookup_field_vals->db_value.length))
     {
       *with_i_schema= 1;
       if (files->push_back(i_s_name_copy))
@@ -5228,7 +5227,7 @@ copy_event_to_schema_table(THD *thd, TAB
   */
   if (thd->lex->sql_command != SQLCOM_SHOW_EVENTS &&
       check_access(thd, EVENT_ACL, et.dbname.str, 0, 0, 1,
-                   is_schema_db(et.dbname.str)))
+                   is_schema_db(et.dbname.str, et.dbname.length)))
     DBUG_RETURN(0);
 
   /* ->field[0] is EVENT_CATALOG and is by default NULL */

=== modified file 'sql/sql_view.cc'
--- a/sql/sql_view.cc	2009-10-16 10:29:42 +0000
+++ b/sql/sql_view.cc	2009-12-15 10:15:32 +0000
@@ -268,11 +268,11 @@ bool create_view_precheck(THD *thd, TABL
     table (i.e. user will not get some privileges by view creation)
   */
   if ((check_access(thd, CREATE_VIEW_ACL, view->db, &view->grant.privilege,
-                    0, 0, is_schema_db(view->db)) ||
+                    0, 0, is_schema_db(view->db, view->db_length)) ||
        check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0)) ||
       (mode != VIEW_CREATE_NEW &&
        (check_access(thd, DROP_ACL, view->db, &view->grant.privilege,
-                     0, 0, is_schema_db(view->db)) ||
+                     0, 0, is_schema_db(view->db, view->db_length)) ||
         check_grant(thd, DROP_ACL, view, 0, 1, 0))))
     goto err;
 

=== modified file 'sql/table.cc'
--- a/sql/table.cc	2009-11-21 11:18:21 +0000
+++ b/sql/table.cc	2009-12-15 10:15:32 +0000
@@ -212,10 +212,7 @@ TABLE_CATEGORY get_table_category(const 
   DBUG_ASSERT(db != NULL);
   DBUG_ASSERT(name != NULL);
 
-  if ((db->length == INFORMATION_SCHEMA_NAME.length) &&
-      (my_strcasecmp(system_charset_info,
-                    INFORMATION_SCHEMA_NAME.str,
-                    db->str) == 0))
+  if (is_schema_db(db->str, db->length))
   {
     return TABLE_CATEGORY_INFORMATION;
   }


Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20091215101532-xl1ja9tmt3yrf8ru.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Sergey.Glukhov:3273)Bug#49501Sergey Glukhov15 Dec