From: Date: October 21 2005 9:10pm Subject: bk commit into 5.0 tree (pgalbraith:1.2044) BUG#14061 List-Archive: http://lists.mysql.com/internals/31315 X-Bug: 14061 Message-Id: <200510211910.j9LJAIMg002845@production.mysql.com> Below is the list of changes that have just been committed into a local 5.0 repository of mysqldev. When mysqldev does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet 1.2044 05/10/21 21:10:11 pgalbraith@stripped +1 -0 Changeset BUG#12838, BUG# 14061 - re-applied patch http://lists.mysql.com/internals/31083 and http://lists.mysql.com/internals/31085 mysqldump.c: BUG# 12838, BUG# 14061 - re-appication of patch for review client/mysqldump.c 1.207 05/10/21 21:04:32 pgalbraith@stripped +85 -66 BUG# 12838, BUG# 14061 - re-appication of patch for review # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: pgalbraith # Host: production.mysql.com # Root: /data0/mysqldev/patg/mysql-5.0 --- 1.206/client/mysqldump.c 2005-10-13 07:44:16 +02:00 +++ 1.207/client/mysqldump.c 2005-10-21 21:04:32 +02:00 @@ -1312,17 +1312,17 @@ static uint get_table_structure(char *table, char *db, char *table_type, char *ignore_flag) { - MYSQL_RES *tableRes; - MYSQL_ROW row; my_bool init=0, delayed, write_data, complete_insert; uint num_fields; char *result_table, *opt_quoted_table; const char *insert_option; char name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3]; - char table_buff2[NAME_LEN*2+3]; - char query_buff[512]; + char table_buff2[NAME_LEN*2+3], query_buff[512]; FILE *sql_file = md_result_file; int len; + MYSQL_RES *result; + MYSQL_ROW row; + DBUG_ENTER("get_table_structure"); DBUG_PRINT("enter", ("db: %s table: %s", db, table)); @@ -1408,71 +1408,90 @@ check_io(sql_file); } - tableRes= mysql_store_result(sock); - field= mysql_fetch_field_direct(tableRes, 0); + result= mysql_store_result(sock); + field= mysql_fetch_field_direct(result, 0); if (strcmp(field->name, "View") == 0) { if (verbose) fprintf(stderr, "-- It's a view, create dummy table for view\n"); - mysql_free_result(tableRes); + mysql_free_result(result); - /* Create a dummy table for the view. ie. a table which has the - same columns as the view should have. This table is dropped - just before the view is created. The table is used to handle the - case where a view references another view, which hasn't yet been - created(during the load of the dump). BUG#10927 */ - - /* Create temp table by selecting from the view */ + /* + PMG - changed how create table info for tables that views need + when being created, is derived. + + The code previously created a dummy table for the view (BUG #10927) + to deal with views that are views of views, that when reloading + the dump, if the view is created prior to the view that it points to, + then the data load files. + It would create this table by creating a temp table that the create + table info would be parsed from to create a real table in the dump + file. The problem with this in the case that -x is supplied (lock + all tables) which the temp table would not be able to be created. + (BUG 12838) + Simple solution, use 'SHOW FIELDS', which doesn't require a temp + table. Ultimately, it would be good to have information of what a + view is dependent upon, and sort that into the dump file so that + views are dumped in the order in which they can be created without + being created prior to what the view depends on. + */ + + /* Use show fields supply info to create a table */ my_snprintf(query_buff, sizeof(query_buff), - "CREATE TEMPORARY TABLE %s SELECT * FROM %s WHERE 0", - result_table, result_table); + "SHOW FIELDS FROM %s", result_table); if (mysql_query_with_error_report(sock, 0, query_buff)) { safe_exit(EX_MYSQLERR); DBUG_RETURN(0); } - /* Get CREATE statement for the temp table */ - my_snprintf(query_buff, sizeof(query_buff), "SHOW CREATE TABLE %s", - result_table); - if (mysql_query_with_error_report(sock, 0, query_buff)) + if ((result= mysql_store_result(sock))) { - safe_exit(EX_MYSQLERR); - DBUG_RETURN(0); + if (mysql_num_rows(result)) + { + if (opt_drop) + fprintf(sql_file, "/*!50001 DROP VIEW IF EXISTS %s*/;\n", + opt_quoted_table); + check_io(sql_file); + + fprintf(sql_file, "/*!50001 CREATE TABLE %s (\n", result_table); + check_io(sql_file); + /* + Get first row, following loop will prepend comma - keeps + from having to know if the row being printed is last to + determine if there should be a _trailing_ comma. + */ + row= mysql_fetch_row(result); + + fprintf(sql_file, " %s %s", quote_name(row[0], name_buff, 0), row[1]); + check_io(sql_file); + + while((row= mysql_fetch_row(result))) + { + /* col name, col type */ + fprintf(sql_file, ",\n %s %s", + quote_name(row[0], name_buff, 0), row[1]); + check_io(sql_file); + } + fprintf(sql_file, "\n) */;\n"); + check_io(sql_file); + } } - tableRes= mysql_store_result(sock); - row= mysql_fetch_row(tableRes); + mysql_free_result(result); - if (opt_drop) - fprintf(sql_file, "/*!50001 DROP VIEW IF EXISTS %s*/;\n", - opt_quoted_table); - - /* Print CREATE statement but remove TEMPORARY */ - fprintf(sql_file, "/*!50001 CREATE %s*/;\n", row[1]+17); - check_io(sql_file); - - mysql_free_result(tableRes); - - /* Drop the temp table */ - my_snprintf(buff, sizeof(buff), - "DROP TEMPORARY TABLE %s", result_table); - if (mysql_query_with_error_report(sock, 0, buff)) - { - safe_exit(EX_MYSQLERR); - DBUG_RETURN(0); - } was_views= 1; DBUG_RETURN(0); } - row= mysql_fetch_row(tableRes); + + row= mysql_fetch_row(result); fprintf(sql_file, "%s;\n", row[1]); check_io(sql_file); - mysql_free_result(tableRes); + mysql_free_result(result); } my_snprintf(query_buff, sizeof(query_buff), "show fields from %s", result_table); - if (mysql_query_with_error_report(sock, &tableRes, query_buff)) + if (mysql_query_with_error_report(sock, &result, query_buff)) { if (path) my_fclose(sql_file, MYF(MY_WME)); @@ -1504,7 +1523,7 @@ } } - while ((row=mysql_fetch_row(tableRes))) + while ((row=mysql_fetch_row(result))) { if (complete_insert) { @@ -1517,8 +1536,8 @@ quote_name(row[SHOW_FIELDNAME], name_buff, 0)); } } - num_fields= (uint) mysql_num_rows(tableRes); - mysql_free_result(tableRes); + num_fields= (uint) mysql_num_rows(result); + mysql_free_result(result); } else { @@ -1529,7 +1548,7 @@ my_snprintf(query_buff, sizeof(query_buff), "show fields from %s", result_table); - if (mysql_query_with_error_report(sock, &tableRes, query_buff)) + if (mysql_query_with_error_report(sock, &result, query_buff)) { safe_exit(EX_MYSQLERR); DBUG_RETURN(0); @@ -1579,9 +1598,9 @@ } } - while ((row=mysql_fetch_row(tableRes))) + while ((row=mysql_fetch_row(result))) { - ulong *lengths=mysql_fetch_lengths(tableRes); + ulong *lengths=mysql_fetch_lengths(result); if (init) { if (!opt_xml && !tFlag) @@ -1600,7 +1619,7 @@ { if (opt_xml) { - print_xml_row(sql_file, "field", tableRes, &row); + print_xml_row(sql_file, "field", result, &row); continue; } @@ -1624,15 +1643,15 @@ check_io(sql_file); } } - num_fields = (uint) mysql_num_rows(tableRes); - mysql_free_result(tableRes); + num_fields = (uint) mysql_num_rows(result); + mysql_free_result(result); if (!tFlag) { /* Make an sql-file, if path was given iow. option -T was given */ char buff[20+FN_REFLEN]; uint keynr,primary_key; my_snprintf(buff, sizeof(buff), "show keys from %s", result_table); - if (mysql_query_with_error_report(sock, &tableRes, buff)) + if (mysql_query_with_error_report(sock, &result, buff)) { if (mysql_errno(sock) == ER_WRONG_OBJECT) { @@ -1651,7 +1670,7 @@ /* Find first which key is primary key */ keynr=0; primary_key=INT_MAX; - while ((row=mysql_fetch_row(tableRes))) + while ((row=mysql_fetch_row(result))) { if (atoi(row[3]) == 1) { @@ -1667,13 +1686,13 @@ } } } - mysql_data_seek(tableRes,0); + mysql_data_seek(result,0); keynr=0; - while ((row=mysql_fetch_row(tableRes))) + while ((row=mysql_fetch_row(result))) { if (opt_xml) { - print_xml_row(sql_file, "key", tableRes, &row); + print_xml_row(sql_file, "key", result, &row); continue; } @@ -1714,7 +1733,7 @@ my_snprintf(buff, sizeof(buff), "show table status like %s", quote_for_like(table, show_name_buff)); - if (mysql_query_with_error_report(sock, &tableRes, buff)) + if (mysql_query_with_error_report(sock, &result, buff)) { if (mysql_errno(sock) != ER_PARSE_ERROR) { /* If old MySQL version */ @@ -1724,7 +1743,7 @@ result_table,mysql_error(sock)); } } - else if (!(row=mysql_fetch_row(tableRes))) + else if (!(row=mysql_fetch_row(result))) { fprintf(stderr, "Error: Couldn't read status information for table %s (%s)\n", @@ -1733,18 +1752,18 @@ else { if (opt_xml) - print_xml_row(sql_file, "options", tableRes, &row); + print_xml_row(sql_file, "options", result, &row); else { fputs("/*!",sql_file); - print_value(sql_file,tableRes,row,"engine=","Engine",0); - print_value(sql_file,tableRes,row,"","Create_options",0); - print_value(sql_file,tableRes,row,"comment=","Comment",1); + print_value(sql_file,result,row,"engine=","Engine",0); + print_value(sql_file,result,row,"","Create_options",0); + print_value(sql_file,result,row,"comment=","Comment",1); fputs(" */",sql_file); check_io(sql_file); } } - mysql_free_result(tableRes); /* Is always safe to free */ + mysql_free_result(result); /* Is always safe to free */ } continue_xml: if (!opt_xml)