Commit 15cb9cae authored by unknown's avatar unknown
Browse files

Better quoting patch for mysqldump


client/mysqldump.c:
  Better quoting patch
parent f888ceb1
Loading
Loading
Loading
Loading
+85 −70
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@
** and adapted to mysqldump 05/11/01 by Jani Tolonen
*/

#define DUMP_VERSION "8.22"
#define DUMP_VERSION "8.23"

#include <my_global.h>
#include <my_sys.h>
@@ -165,7 +165,7 @@ static int dump_all_tables_in_db(char *db);
static int init_dumping(char *);
static int dump_databases(char **);
static int dump_all_databases();
static char *quote_name(char *name, char *buff);
static char *quote_name(const char *name, char *buff, my_bool force);
static void print_quoted_xml(FILE *output, char *fname, char *str, uint len);

static void print_version(void)
@@ -615,33 +615,43 @@ static my_bool test_if_special_chars(const char *str)
  return 0;
} /* test_if_special_chars */

static char *quote_name(char *name, char *buff)

static char *quote_name(const char *name, char *buff, my_bool force)
{
  char *to= buff;
  if (!force && !opt_quoted && !test_if_special_chars(name))
    return (char*) name;
  *to++= QUOTE_CHAR;
  while (*name)
  {
  char *end;
  if (!opt_quoted && !test_if_special_chars(name))
    return name;
  buff[0]=QUOTE_CHAR;
  end=strmov(buff+1,name);
  end[0]=QUOTE_CHAR;
  end[1]=0;
    if (*name == QUOTE_CHAR)
      *to= QUOTE_CHAR;
    *to++= *name++;
  }
  to[0]=QUOTE_CHAR;
  to[1]=0;
  return buff;
} /* quote_name */


/*
** getStructure -- retrievs database structure, prints out corresponding
**       CREATE statement and fills out insert_pat.
** Return values:  number of fields in table, 0 if error
  getStructure -- retrievs database structure, prints out corresponding
  CREATE statement and fills out insert_pat.

  RETURN
    number of fields in table, 0 if error
*/

static uint getTableStructure(char *table, char* db)
{
  MYSQL_RES  *tableRes;
  MYSQL_ROW  row;
  my_bool    init=0;
  uint       numFields;
  char	     *strpos, *result_table;
  char	     *strpos, *result_table, *opt_quoted_table;
  const char *delayed;
  char	     name_buff[NAME_LEN+3],table_buff[NAME_LEN+3];
  char	     name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3];
  char	     table_buff2[NAME_LEN*2+3];
  FILE       *sql_file = md_result_file;
  DBUG_ENTER("getTableStructure");

@@ -651,7 +661,8 @@ static uint getTableStructure(char *table, char* db)
    fprintf(stderr, "-- Retrieving table structure for table %s...\n", table);

  sprintf(insert_pat,"SET OPTION SQL_QUOTE_SHOW_CREATE=%d", opt_quoted);
  result_table=quote_name(table,table_buff);
  result_table=     quote_name(table, table_buff, 1);
  opt_quoted_table= quote_name(table, table_buff2, 0);
  if (!mysql_query(sock,insert_pat))
  {
    /* using SHOW CREATE statement */
@@ -660,11 +671,11 @@ static uint getTableStructure(char *table, char* db)
      /* Make an sql-file, if path was given iow. option -T was given */
      char buff[20+FN_REFLEN];

      sprintf(buff,"show create table `%s`",table);
      sprintf(buff,"show create table %s", result_table);
      if (mysql_query(sock, buff))
      {
        fprintf(stderr, "%s: Can't get CREATE TABLE for table '%s' (%s)\n",
		      my_progname, table, mysql_error(sock));
        fprintf(stderr, "%s: Can't get CREATE TABLE for table %s (%s)\n",
		      my_progname, result_table, mysql_error(sock));
        safe_exit(EX_MYSQLERR);
        DBUG_RETURN(0);
      }
@@ -684,10 +695,10 @@ static uint getTableStructure(char *table, char* db)
        write_header(sql_file, db);
      }
      if (!opt_xml)
	fprintf(sql_file, "\n--\n-- Table structure for table '%s'\n--\n\n",
		table);
	fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
		result_table);
      if (opt_drop)
        fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n",result_table);
        fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", opt_quoted_table);

      tableRes=mysql_store_result(sock);
      row=mysql_fetch_row(tableRes);
@@ -695,11 +706,11 @@ static uint getTableStructure(char *table, char* db)
	fprintf(sql_file, "%s;\n", row[1]);
      mysql_free_result(tableRes);
    }
    sprintf(insert_pat,"show fields from `%s`",table);
    sprintf(insert_pat,"show fields from %s", result_table);
    if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
    {
      fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n",
		    my_progname, table, mysql_error(sock));
      fprintf(stderr, "%s: Can't get info about table: %s\nerror: %s\n",
	      my_progname, result_table, mysql_error(sock));
      if (path)
	my_fclose(sql_file, MYF(MY_WME));
      safe_exit(EX_MYSQLERR);
@@ -707,10 +718,11 @@ static uint getTableStructure(char *table, char* db)
    }

    if (cFlag)
      sprintf(insert_pat, "INSERT %sINTO %s (", delayed, result_table);
      sprintf(insert_pat, "INSERT %sINTO %s (", delayed, opt_quoted_table);
    else
    {
      sprintf(insert_pat, "INSERT %sINTO %s VALUES ", delayed, result_table);
      sprintf(insert_pat, "INSERT %sINTO %s VALUES ", delayed,
	      opt_quoted_table);
      if (!extended_insert)
        strcat(insert_pat,"(");
    }
@@ -725,7 +737,7 @@ static uint getTableStructure(char *table, char* db)
      }
      init=1;
      if (cFlag)
        strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME],name_buff));
        strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME], name_buff, 0));
    }
    numFields = (uint) mysql_num_rows(tableRes);
    mysql_free_result(tableRes);
@@ -735,11 +747,11 @@ static uint getTableStructure(char *table, char* db)
  /*  fprintf(stderr, "%s: Can't set SQL_QUOTE_SHOW_CREATE option (%s)\n",
      my_progname, mysql_error(sock)); */

    sprintf(insert_pat,"show fields from `%s`",result_table);
    sprintf(insert_pat,"show fields from %s", result_table);
    if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
    {
      fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n",
		    my_progname, table, mysql_error(sock));
      fprintf(stderr, "%s: Can't get info about table: %s\nerror: %s\n",
		    my_progname, result_table, mysql_error(sock));
      safe_exit(EX_MYSQLERR);
      DBUG_RETURN(0);
    }
@@ -762,8 +774,8 @@ static uint getTableStructure(char *table, char* db)
        write_header(sql_file, db);
      }
      if (!opt_xml)
	fprintf(sql_file, "\n--\n-- Table structure for table '%s'\n--\n\n",
		table);
	fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
		result_table);
      if (opt_drop)
        fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n",result_table);
      fprintf(sql_file, "CREATE TABLE %s (\n", result_table);
@@ -790,15 +802,17 @@ static uint getTableStructure(char *table, char* db)
      }
      init=1;
      if (cFlag)
        strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME],name_buff));
        strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME], name_buff, 0));
      if (!tFlag)
      {
        if (opt_keywords)
	  fprintf(sql_file, "  %s.%s %s", result_table,
	  quote_name(row[SHOW_FIELDNAME],name_buff), row[SHOW_TYPE]);
		  quote_name(row[SHOW_FIELDNAME],name_buff, 0),
		  row[SHOW_TYPE]);
        else
	  fprintf(sql_file, "  %s %s", quote_name(row[SHOW_FIELDNAME],
						  name_buff), row[SHOW_TYPE]);
						  name_buff, 0),
		  row[SHOW_TYPE]);
        if (row[SHOW_DEFAULT])
        {
	  fputs(" DEFAULT ", sql_file);
@@ -817,11 +831,11 @@ static uint getTableStructure(char *table, char* db)
      /* Make an sql-file, if path was given iow. option -T was given */
      char buff[20+FN_REFLEN];
      uint keynr,primary_key;
      sprintf(buff,"show keys from `%s`",table);
      sprintf(buff,"show keys from %s", result_table);
      if (mysql_query(sock, buff))
      {
        fprintf(stderr, "%s: Can't get keys for table '%s' (%s)\n",
		my_progname, table, mysql_error(sock));
        fprintf(stderr, "%s: Can't get keys for table %s (%s)\n",
		my_progname, result_table, mysql_error(sock));
        if (path)
	  my_fclose(sql_file, MYF(MY_WME));
        safe_exit(EX_MYSQLERR);
@@ -858,15 +872,15 @@ static uint getTableStructure(char *table, char* db)
	    putc(')', sql_file);
	  if (atoi(row[1]))       /* Test if duplicate key */
	    /* Duplicate allowed */
	    fprintf(sql_file, ",\n  KEY %s (",quote_name(row[2],name_buff));
	    fprintf(sql_file, ",\n  KEY %s (",quote_name(row[2],name_buff,0));
	  else if (keynr == primary_key)
	    fputs(",\n  PRIMARY KEY (",sql_file); /* First UNIQUE is primary */
	  else
	    fprintf(sql_file, ",\n  UNIQUE %s (",quote_name(row[2],name_buff));
	    fprintf(sql_file, ",\n  UNIQUE %s (",quote_name(row[2],name_buff,0));
        }
        else
	  putc(',', sql_file);
        fputs(quote_name(row[4],name_buff), sql_file);
        fputs(quote_name(row[4], name_buff, 0), sql_file);
        if (row[7])
	  fprintf(sql_file, " (%s)",row[7]);      /* Sub key */
      }
@@ -877,23 +891,23 @@ static uint getTableStructure(char *table, char* db)
      /* Get MySQL specific create options */
      if (create_options)
      {
        sprintf(buff,"show table status like `%s`",table);
        sprintf(buff,"show table status like %s",result_table);
        if (mysql_query(sock, buff))
        {
	  if (mysql_errno(sock) != ER_PARSE_ERROR)
	  {					/* If old MySQL version */
	    if (verbose)
	      fprintf(stderr,
		      "-- Warning: Couldn't get status information for table '%s' (%s)\n",
		      table,mysql_error(sock));
		      "-- Warning: Couldn't get status information for table %s (%s)\n",
		      result_table,mysql_error(sock));
	  }
        }
        else if (!(tableRes=mysql_store_result(sock)) ||
		 !(row=mysql_fetch_row(tableRes)))
        {
	  fprintf(stderr,
		  "Error: Couldn't read status information for table '%s' (%s)\n",
		  table,mysql_error(sock));
		  "Error: Couldn't read status information for table %s (%s)\n",
		  result_table,mysql_error(sock));
        }
        else
        {
@@ -909,7 +923,8 @@ static uint getTableStructure(char *table, char* db)
    }
  }
  if (opt_disable_keys)
    fprintf(sql_file,"\n/*!40000 ALTER TABLE %s DISABLE KEYS */;\n",result_table);
    fprintf(sql_file, "\n/*!40000 ALTER TABLE %s DISABLE KEYS */;\n",
	    result_table);
  if (cFlag)
  {
    strpos=strmov(strpos,") VALUES ");
@@ -979,6 +994,7 @@ static char *field_escape(char *to,const char *from,uint length)
static void dumpTable(uint numFields, char *table)
{
  char query[1024], *end, buff[256],table_buff[NAME_LEN+3], *result_table;
  char table_buff2[NAME_LEN*2+3], *opt_quoted_table;
  MYSQL_RES	*res;
  MYSQL_FIELD  *field;
  MYSQL_ROW    row;
@@ -986,7 +1002,8 @@ static void dumpTable(uint numFields, char *table)

  if (verbose)
    fprintf(stderr, "-- Sending SELECT query...\n");
  result_table=quote_name(table,table_buff);
  result_table= quote_name(table,table_buff, 1);
  opt_quoted_table= quote_name(table, table_buff2, 0);
  if (path)
  {
    char filename[FN_REFLEN], tmp_path[FN_REFLEN];
@@ -1013,7 +1030,7 @@ static void dumpTable(uint numFields, char *table)
    end= add_load_option(end, lines_terminated, " LINES TERMINATED BY");
    *end= '\0';

    sprintf(buff," FROM `%s`",table);
    sprintf(buff," FROM %s", result_table);
    end= strmov(end,buff);
    if (where)
      end= strxmov(end, " WHERE ",where,NullS);
@@ -1026,9 +1043,9 @@ static void dumpTable(uint numFields, char *table)
  else
  {
    if (!opt_xml)
      fprintf(md_result_file,"\n--\n-- Dumping data for table '%s'\n--\n",
	      table);
    sprintf(query, "SELECT * FROM `%s`", table);
      fprintf(md_result_file,"\n--\n-- Dumping data for table %s\n--\n",
	      result_table);
    sprintf(query, "SELECT * FROM %s", result_table);
    if (where)
    {
      if (!opt_xml)
@@ -1055,14 +1072,14 @@ static void dumpTable(uint numFields, char *table)
      fprintf(stderr, "-- Retrieving rows...\n");
    if (mysql_num_fields(res) != numFields)
    {
      fprintf(stderr,"%s: Error in field count for table: '%s' !  Aborting.\n",
	      my_progname,table);
      fprintf(stderr,"%s: Error in field count for table: %s !  Aborting.\n",
	      my_progname, result_table);
      safe_exit(EX_CONSCHECK);
      return;
    }

    if (opt_lock)
      fprintf(md_result_file,"LOCK TABLES %s WRITE;\n", result_table);
      fprintf(md_result_file,"LOCK TABLES %s WRITE;\n", opt_quoted_table);

    total_length=net_buffer_length;		/* Force row break */
    row_break=0;
@@ -1090,8 +1107,8 @@ static void dumpTable(uint numFields, char *table)
      {
	if (!(field = mysql_fetch_field(res)))
	{
	  sprintf(query,"%s: Not enough fields from table '%s'! Aborting.\n",
		  my_progname,table);
	  sprintf(query,"%s: Not enough fields from table %s! Aborting.\n",
		  my_progname, result_table);
	  fputs(query,stderr);
	  safe_exit(EX_CONSCHECK);
	  return;
@@ -1215,11 +1232,11 @@ static void dumpTable(uint numFields, char *table)
    fflush(md_result_file);
    if (mysql_errno(sock))
    {
      sprintf(query,"%s: Error %d: %s when dumping table '%s' at row: %ld\n",
      sprintf(query,"%s: Error %d: %s when dumping table %s at row: %ld\n",
	      my_progname,
	      mysql_errno(sock),
	      mysql_error(sock),
	      table,
	      result_table,
	      rownr);
      fputs(query,stderr);
      safe_exit(EX_CONSCHECK);
@@ -1351,7 +1368,7 @@ static int dump_all_tables_in_db(char *database)
{
  char *table;
  uint numrows;
  char table_buff[NAME_LEN+3];
  char table_buff[NAME_LEN*2+3];

  if (init_dumping(database))
    return 1;
@@ -1361,9 +1378,8 @@ static int dump_all_tables_in_db(char *database)
    init_dynamic_string(&query, "LOCK TABLES ", 256, 1024);
    for (numrows=0 ; (table = getTableName(1)) ; numrows++)
    {
      dynstr_append(&query, "`");
      dynstr_append(&query, table);
      dynstr_append(&query, "` READ /*!32311 LOCAL */,");
      dynstr_append(&query, quote_name(table, table_buff, 1));
      dynstr_append(&query, " READ /*!32311 LOCAL */,");
    }
    if (numrows && mysql_real_query(sock, query.str, query.length-1))
      DBerror(sock, "when using LOCK TABLES");
@@ -1392,7 +1408,7 @@ static int dump_all_tables_in_db(char *database)
static int dump_selected_tables(char *db, char **table_names, int tables)
{
  uint numrows;
  char table_buff[NAME_LEN+3];
  char table_buff[NAME_LEN*+3];

  if (init_dumping(db))
    return 1;
@@ -1404,9 +1420,8 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
    init_dynamic_string(&query, "LOCK TABLES ", 256, 1024);
    for (i=0 ; i < tables ; i++)
    {
      dynstr_append(&query, "`");
      dynstr_append(&query, table_names[i]);
      dynstr_append(&query, "` READ /*!32311 LOCAL */,");
      dynstr_append(&query, quote_name(table_names[i], table_buff, 1));
      dynstr_append(&query, " READ /*!32311 LOCAL */,");
    }
    if (mysql_real_query(sock, query.str, query.length-1))
      DBerror(sock, "when doing LOCK TABLES");