Commit c807724f authored by unknown's avatar unknown
Browse files

Review of code pushed since last 5.0 pull:

Ensure that ccache is also used for C programs
mysql: Ensure that 'delimiter' works the same way in batch mode as in normal mode
mysqldump: Change to use ;; (instead of //) as a stored procedure/trigger delimiter
Fixed test cases by adding missing DROP's and rename views to be of type 'v#'
Removed MY_UNIX_PATH from fn_format()
Removed current_db_used from TABLE_LIST
Removed usage of 'current_thd' in Item_splocal
Removed some compiler warnings
A bit faster longlong2str code



BUILD/FINISH.sh:
  Ensure that ccache is also used for C programs
BUILD/SETUP.sh:
  Ensure that ccache is also used for C programs
client/mysql.cc:
  More debugging
  Ensure that 'delimiter' works the same way in batch mode as in normal mode.
  Compare 'delimiter' command case-insensitive.
  The above fixes the delimiter bugs so that we can now use ;; as a trigger/SP function delimiter in mysqldump.
client/mysqldump.c:
  Indentation fixes
  Use ;; as a delmimiter for stored procedures and triggers instead of //
client/mysqltest.c:
  Indentation fixes
include/my_sys.h:
  Remove not needed MY_UNIX_PATH parameter
mysql-test/r/alter_table.result:
  Better to reuse mysqltest database (test didn't properly delete mysqltest1 at start)
mysql-test/r/func_str.result:
  More testing of CONV() (to ensure that longlong2str() works correctly)
mysql-test/r/information_schema.result:
  Drop all used tables and views
  Rename view tables to 'v#' to ensure that if this test fails, not a lot of other test fails
mysql-test/r/information_schema_inno.result:
  Drop all used tables
mysql-test/r/multi_statement.result:
  Drop used tables
mysql-test/r/mysql.result:
  Add error messages to result
mysql-test/r/mysqldump.result:
  ;; is now used as SP/trigger delimiter
mysql-test/r/mysqlshow.result:
  Drop used tables
mysql-test/r/temp_table.result:
  Drop used views
  Rename views to v#
mysql-test/t/alter_table.test:
  Better to reuse mysqltest database (test didn't properly delete mysqltest1 at start)
mysql-test/t/func_str.test:
  More testing of CONV() (to ensure that longlong2str() works correctly)
mysql-test/t/information_schema.test:
  Drop all used tables and views
  Rename view tables to 'v#' to ensure that if this test fails, not a lot of other test fails
mysql-test/t/information_schema_inno.test:
  Drop all used tables
mysql-test/t/multi_statement.test:
  Drop used tables
mysql-test/t/mysql.test:
  Add error messages to result
mysql-test/t/mysqlshow.test:
  Drop used tables
mysql-test/t/temp_table.test:
  Drop used views
  Rename views to v#
mysys/mf_format.c:
  Remove not needed MY_UNIX_PATH parameter
  (This goes against how fn_format() is supposed to work and also conflicts with other options like MY_RETURN_REAL_PATH)
sql/ha_federated.cc:
  Removed extra empty line
sql/item.cc:
  Use 'str_value' instead of 'str_value_ptr' to hold result for Item_splocal
  Remove some calls to 'thd' in Item_splocal by making 'thd' a class variable
  One doesn't have to set 'null_value' when calling 'is_null()'
sql/item.h:
  Add THD as a class variable to Item_splocal
  Use 'str_value' instead of 'str_value_ptr' to hold temp result
  Fixed bug in Item_hex when used in CAST()
sql/item_func.cc:
  Optimize new code
sql/log_event.cc:
  Move 'to_unix_path()' out of fn_format()
sql/opt_range.cc:
  Simplify code
sql/sp_head.cc:
  Ensure that Item_splocal has thd set before we call '->this_item()'
sql/sql_class.cc:
  Return error if Statement::insert() fails in either hash_insert()
sql/sql_parse.cc:
  Remove 'current_db_used' as we can trivially check if db table qualifier was used without this.
  Simplify code
sql/sql_prepare.cc:
  Use enum instead of const int, to avoid ugly code for VC++
sql/structs.h:
  Remove compiler warnings when using STRING_WITH_LEN() with constant strings.
sql/table.cc:
  Fixed indentation
sql/table.h:
  Remove not needed current_db_used
strings/decimal.c:
  Simplify code
strings/longlong2str-x86.s:
  A bit faster longlong2str.
  (Took some ideas from Peter Gulutzan's code)
strings/my_strtoll10.c:
  Simplify code for MetroWerks compiler
parent b34d5bd2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ path=`dirname $0`
if [ -z "$just_clean" ]
then
commands="$commands
CFLAGS=\"$cflags\" CXX=\"$CXX\" CXXFLAGS=\"$cxxflags\" CXXLDFLAGS=\"$CXXLDFLAGS\" \
CC=\"$CC\" CFLAGS=\"$cflags\" CXX=\"$CXX\" CXXFLAGS=\"$cxxflags\" CXXLDFLAGS=\"$CXXLDFLAGS\" \
$configure"
fi

+4 −0
Original line number Diff line number Diff line
@@ -98,6 +98,10 @@ else
  make=make
fi

if test -z "$CC" ; then
  CC=gcc
fi

if test -z "$CXX" ; then
  CXX=gcc
fi
+49 −27
Original line number Diff line number Diff line
@@ -1089,6 +1089,8 @@ static COMMANDS *find_command (char *name,char cmd_char)
{
  uint len;
  char *end;
  DBUG_ENTER("find_command");
  DBUG_PRINT("enter",("name: '%s'  char: %d", name ? name : "NULL", cmd_char));

  if (!name)
  {
@@ -1100,12 +1102,16 @@ static COMMANDS *find_command (char *name,char cmd_char)
    while (my_isspace(charset_info,*name))
      name++;
    /*
      As special case we allow row that starts with word delimiter
      to be able to change delimiter if someone has delimiter 'delimiter'.
      If there is an \\g in the row or if the row has a delimiter but
      this is not a delimiter command, let add_line() take care of
      parsing the row and calling find_command()
    */
    if (strstr(name, "\\g") || (strstr(name, delimiter) &&
				strncmp(name, "delimiter", 9)))
      return ((COMMANDS *) 0);
                                strlen(name) >= 9 &&
                                my_strnncoll(charset_info,(uchar*) name,
                                             9,
                                             (const uchar*) "delimiter", 9)))
      DBUG_RETURN((COMMANDS *) 0);
    if ((end=strcont(name," \t")))
    {
      len=(uint) (end - name);
@@ -1127,9 +1133,12 @@ static COMMANDS *find_command (char *name,char cmd_char)
	  !commands[i].name[len] &&
	  (!end || (end && commands[i].takes_params))) ||
	 !name && commands[i].cmd_char == cmd_char))
      return (&commands[i]);
    {
      DBUG_PRINT("exit",("found command: %s", commands[i].name));
      DBUG_RETURN(&commands[i]);
    }
  }
  return ((COMMANDS *) 0);
  DBUG_RETURN((COMMANDS *) 0);
}


@@ -1140,15 +1149,16 @@ static bool add_line(String &buffer,char *line,char *in_string,
  char buff[80], *pos, *out;
  COMMANDS *com;
  bool need_space= 0;
  DBUG_ENTER("add_line");

  if (!line[0] && buffer.is_empty())
    return 0;
    DBUG_RETURN(0);
#ifdef HAVE_READLINE
  if (status.add_to_history && line[0] && not_in_history(line))
    add_history(line);
#endif
#ifdef USE_MB
  char *strend=line+(uint) strlen(line);
  char *end_of_line=line+(uint) strlen(line);
#endif

  for (pos=out=line ; (inchar= (uchar) *pos) ; pos++)
@@ -1157,10 +1167,11 @@ static bool add_line(String &buffer,char *line,char *in_string,
        buffer.is_empty())
      continue;
#ifdef USE_MB
    int l;
    int length;
    if (use_mb(charset_info) &&
        (l = my_ismbchar(charset_info, pos, strend))) {
	while (l--)
        (length= my_ismbchar(charset_info, pos, end_of_line)))
    {
      while (length--)
        *out++ = *pos++;
      pos--;
      continue;
@@ -1183,7 +1194,7 @@ static bool add_line(String &buffer,char *line,char *in_string,
	const String tmp(line,(uint) (out-line), charset_info);
	buffer.append(tmp);
	if ((*com->func)(&buffer,pos-1) > 0)
	  return 1;				// Quit
	  DBUG_RETURN(1);                       // Quit
	if (com->takes_params)
	{
	  for (pos++ ;
@@ -1201,29 +1212,40 @@ static bool add_line(String &buffer,char *line,char *in_string,
      {
	sprintf(buff,"Unknown command '\\%c'.",inchar);
	if (put_info(buff,INFO_ERROR) > 0)
	  return 1;
	  DBUG_RETURN(1);
	*out++='\\';
	*out++=(char) inchar;
	continue;
      }
    }

    else if (!*ml_comment && (*pos == *delimiter &&
			      is_prefix(pos + 1, delimiter + 1)) &&
	     !*in_string)
    else if (!*ml_comment && !*in_string &&
             (*pos == *delimiter && is_prefix(pos + 1, delimiter + 1) ||
              buffer.length() == 0 && (out - line) >= 9 &&
              !my_strcasecmp(charset_info, line, "delimiter")))
    {					
      uint old_delimiter_length= delimiter_length;
      if (out != line)
	buffer.append(line, (uint) (out - line));	// Add this line
      if ((com= find_command(buffer.c_ptr(), 0)))
      {
        if (com->func == com_delimiter)
        {
          /*
            Delimiter wants the get rest of the given line as argument to
            allow one to change ';' to ';;' and back
          */
          char *end= strend(pos);
          buffer.append(pos, (uint) (end - pos));
          /* Ensure pos will point at \0 after the pos+= below */
          pos= end - old_delimiter_length + 1;
        }
	if ((*com->func)(&buffer, buffer.c_ptr()) > 0)
	  return 1;				// Quit
	  DBUG_RETURN(1);                       // Quit
      }
      else
      {
	if (com_go(&buffer, 0) > 0)             // < 0 is not fatal
	  return 1;
	  DBUG_RETURN(1);
      }
      buffer.length(0);
      out= line;
@@ -1275,9 +1297,9 @@ static bool add_line(String &buffer,char *line,char *in_string,
    if (buffer.length() + length >= buffer.alloced_length())
      buffer.realloc(buffer.length()+length+IO_SIZE);
    if (!(*ml_comment) && buffer.append(line,length))
      return 1;
      DBUG_RETURN(1);
  }
  return 0;
  DBUG_RETURN(0);
}

/*****************************************************************
+31 −28
Original line number Diff line number Diff line
@@ -1188,23 +1188,25 @@ static void print_xml_row(FILE *xml_file, const char *row_name,
  This function has logic to print the appropriate syntax depending on whether
  this is a procedure or functions

  RETURN 0 succes, 1 if error
  RETURN
    0  Success
    1  Error
*/

static uint dump_routines_for_db(char *db)
{
  char       query_buff[512];
  const char *routine_type[]= {"FUNCTION", "PROCEDURE"};
  char       db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3], *routine_name;
  char       db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
  char       *routine_name;
  int        i;
  FILE       *sql_file= md_result_file;
  MYSQL_RES  *routine_res, *routine_list_res;
  MYSQL_ROW  row, routine_list_row;

  DBUG_ENTER("dump_routines_for_db");
  DBUG_PRINT("enter", ("db: '%s'", db));

  mysql_real_escape_string(sock, db_name_buff, db, strlen(db));
  DBUG_PRINT("enter", ("db: '%s'", db_name_buff));

  /* nice comments */
  if (opt_comments)
@@ -1217,7 +1219,7 @@ static uint dump_routines_for_db (char *db)
  if (lock_tables)
    mysql_query(sock, "LOCK TABLES mysql.proc READ");

  fprintf(sql_file, "DELIMITER //\n");
  fprintf(sql_file, "DELIMITER ;;\n");

  /* 0, retrieve and dump functions, 1, procedures */
  for (i= 0; i <= 1; i++)
@@ -1254,16 +1256,18 @@ static uint dump_routines_for_db (char *db)
          if (strlen(row[2]))
          {
            if (opt_drop)
              fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */ //\n",
              fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */;;\n",
                      routine_type[i], routine_name);
            /*
              we need to change sql_mode only for the CREATE PROCEDURE/FUNCTION
              otherwise we may need to re-quote routine_name
              we need to change sql_mode only for the CREATE
              PROCEDURE/FUNCTION otherwise we may need to re-quote routine_name
            */;
            fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=\"%s\"*/ //\n",
            fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=\"%s\"*/;;\n",
                    row[1] /* sql_mode */);
            fprintf(sql_file, "/*!50003 %s */ //\n", row[2]);
            fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/ //\n");
            fprintf(sql_file, "/*!50003 %s */;;\n", row[2]);
            fprintf(sql_file,
                    "/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/"
                    ";;\n");
          }
        } /* end of routine printing */
      } /* end of list of routines */
@@ -1741,7 +1745,6 @@ static void dump_triggers_for_table (char *table, char *db)
  char	     name_buff[NAME_LEN*4+3], table_buff[NAME_LEN*2+3];
  char       query_buff[512];
  FILE       *sql_file = md_result_file;

  DBUG_ENTER("dump_triggers_for_table");
  DBUG_PRINT("enter", ("db: %s, table: %s", db, table));
  result_table=     quote_name(table, table_buff, 1);
@@ -1759,11 +1762,11 @@ static void dump_triggers_for_table (char *table, char *db)
  }
  if (mysql_num_rows(result))
    fprintf(sql_file, "\n/*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/;\n\
DELIMITER //;\n");
DELIMITER ;;\n");
  while ((row=mysql_fetch_row(result)))
  {
    fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=\"%s\" */ //\n\
/*!50003 CREATE TRIGGER %s %s %s ON %s FOR EACH ROW%s */ //\n\n",
    fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=\"%s\" */;;\n\
/*!50003 CREATE TRIGGER %s %s %s ON %s FOR EACH ROW%s */;;\n\n",
            row[6], /* sql_mode */
            quote_name(row[0], name_buff, 0), /* Trigger */
            row[4], /* Timing */
@@ -1773,8 +1776,8 @@ DELIMITER //;\n");
  }
  if (mysql_num_rows(result))
    fprintf(sql_file,
            "DELIMITER ;//\n\
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */;");
            "DELIMITER ;\n"
            "/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */;\n");
  mysql_free_result(result);
  DBUG_VOID_RETURN;
}
@@ -1800,10 +1803,10 @@ static char *add_load_option(char *ptr,const char *object,


/*
** Allow the user to specify field terminator strings like:
** "'", "\", "\\" (escaped backslash), "\t" (tab), "\n" (newline)
** This is done by doubleing ' and add a end -\ if needed to avoid
** syntax errors from the SQL parser.
  Allow the user to specify field terminator strings like:
  "'", "\", "\\" (escaped backslash), "\t" (tab), "\n" (newline)
  This is done by doubling ' and add a end -\ if needed to avoid
  syntax errors from the SQL parser.
*/

static char *field_escape(char *to,const char *from,uint length)
+5 −3
Original line number Diff line number Diff line
@@ -135,7 +135,8 @@ typedef struct
  long        code;
} st_error;

static st_error global_error[] = {
static st_error global_error[] =
{
#include <mysqld_ername.h>
  { 0, 0 }
};
@@ -210,7 +211,8 @@ static int ps_match_re(char *);
static char *ps_eprint(int);
static void ps_free_reg(void);

static const char *embedded_server_groups[] = {
static const char *embedded_server_groups[]=
{
  "server",
  "embedded",
  "mysqltest_SERVER",
Loading