Loading client/mysqldump.c +60 −55 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ ** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov */ #define DUMP_VERSION "10.9" #define DUMP_VERSION "10.10" #include <my_global.h> #include <my_sys.h> Loading Loading @@ -396,7 +396,7 @@ static int dump_all_databases(); static char *quote_name(const char *name, char *buff, my_bool force); static const char *check_if_ignore_table(const char *table_name); static char *primary_key_fields(const char *table_name); static my_bool getViewStructure(char *table, char* db); static my_bool get_view_structure(char *table, char* db); static my_bool dump_all_views_in_db(char *database); #include <help_start.h> Loading Loading @@ -777,16 +777,16 @@ static int get_options(int *argc, char ***argv) /* ** DBerror -- prints mysql error message and exits the program. ** DB_error -- prints mysql error message and exits the program. */ static void DBerror(MYSQL *mysql, const char *when) static void DB_error(MYSQL *mysql, const char *when) { DBUG_ENTER("DBerror"); DBUG_ENTER("DB_error"); my_printf_error(0,"Got error: %d: %s %s", MYF(0), mysql_errno(mysql), mysql_error(mysql), when); safe_exit(EX_MYSQLERR); DBUG_VOID_RETURN; } /* DBerror */ } /* DB_error */ /* Loading Loading @@ -862,7 +862,7 @@ static int dbConnect(char *host, char *user,char *passwd) NULL,opt_mysql_port,opt_mysql_unix_port, 0))) { DBerror(&mysql_connection, "when trying to connect"); DB_error(&mysql_connection, "when trying to connect"); return 1; } /* Loading Loading @@ -1093,7 +1093,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name, number of fields in table, 0 if error */ static uint getTableStructure(char *table, char *db) static uint get_table_structure(char *table, char *db) { MYSQL_RES *tableRes; MYSQL_ROW row; Loading @@ -1104,7 +1104,7 @@ static uint getTableStructure(char *table, char *db) 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"); DBUG_ENTER("get_table_structure"); delayed= opt_delayed ? " DELAYED " : ""; Loading Loading @@ -1457,7 +1457,7 @@ static uint getTableStructure(char *table, char *db) my_fclose(sql_file, MYF(MY_WME)); } DBUG_RETURN(numFields); } /* getTableStructure */ } /* get_table_structure */ static char *add_load_option(char *ptr,const char *object, Loading Loading @@ -1523,10 +1523,12 @@ static char *alloc_query_str(ulong size) return query; } /* ** dumpTable saves database contents as a series of INSERT statements. ** dump_table saves database contents as a series of INSERT statements. */ static void dumpTable(uint numFields, char *table) static void dump_table(uint numFields, char *table) { char query_buf[QUERY_LENGTH], *end, buff[256],table_buff[NAME_LEN+3]; char *result_table, table_buff2[NAME_LEN*2+3], *opt_quoted_table; Loading Loading @@ -1592,7 +1594,7 @@ static void dumpTable(uint numFields, char *table) } if (mysql_real_query(sock, query, (uint) (end - query))) { DBerror(sock, "when executing 'SELECT INTO OUTFILE'"); DB_error(sock, "when executing 'SELECT INTO OUTFILE'"); return; } } Loading Loading @@ -1639,13 +1641,13 @@ static void dumpTable(uint numFields, char *table) check_io(md_result_file); } if (mysql_query_with_error_report(sock, 0, query)) DBerror(sock, "when retrieving data from server"); DB_error(sock, "when retrieving data from server"); if (quick) res=mysql_use_result(sock); else res=mysql_store_result(sock); if (!res) DBerror(sock, "when retrieving data from server"); DB_error(sock, "when retrieving data from server"); if (verbose) fprintf(stderr, "-- Retrieving rows...\n"); if (mysql_num_fields(res) != numFields) Loading Loading @@ -1946,7 +1948,7 @@ static void dumpTable(uint numFields, char *table) my_free(query, MYF(MY_ALLOW_ZERO_PTR)); safe_exit(error); return; } /* dumpTable */ } /* dump_table */ static char *getTableName(int reset) Loading Loading @@ -2035,7 +2037,7 @@ static int init_dumping(char *database) if (mysql_select_db(sock, database)) { DBerror(sock, "when selecting the database"); DB_error(sock, "when selecting the database"); return 1; /* If --force */ } if (!path && !opt_xml) Loading Loading @@ -2123,14 +2125,14 @@ static int dump_all_tables_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when using LOCK TABLES"); DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) Loading @@ -2138,9 +2140,9 @@ static int dump_all_tables_in_db(char *database) char *end= strmov(afterdot, table); if (include_table(hash_key, end - hash_key)) { numrows = getTableStructure(table, database); numrows = get_table_structure(table, database); if (!dFlag && numrows > 0) dumpTable(numrows,table); dump_table(numrows,table); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } Loading Loading @@ -2188,18 +2190,18 @@ static my_bool dump_all_views_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when using LOCK TABLES"); DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) getViewStructure(table, database); get_view_structure(table, database); if (opt_xml) { fputs("</database>\n", md_result_file); Loading @@ -2226,7 +2228,7 @@ static int get_actual_table_name(const char *old_table_name, int buf_size) { int retval; MYSQL_RES *tableRes; MYSQL_RES *table_res; MYSQL_ROW row; char query[50 + 2*NAME_LEN]; char show_name_buff[FN_REFLEN]; Loading @@ -2242,18 +2244,22 @@ static int get_actual_table_name(const char *old_table_name, safe_exit(EX_MYSQLERR); } tableRes= mysql_store_result( sock ); retval = 1; if (tableRes != NULL) if ((table_res= mysql_store_result(sock))) { my_ulonglong numRows = mysql_num_rows(tableRes); if (numRows > 0) my_ulonglong num_rows= mysql_num_rows(table_res); if (num_rows > 0) { row= mysql_fetch_row( tableRes ); /* Return first row TODO: Return all matching rows */ row= mysql_fetch_row(table_res); strmake(new_table_name, row[0], buf_size-1); retval= 0; } mysql_free_result(tableRes); mysql_free_result(table_res); } return retval; } Loading @@ -2278,14 +2284,14 @@ static int dump_selected_tables(char *db, char **table_names, int tables) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when doing LOCK TABLES"); DB_error(sock, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall countinue here, if --force was given */ } if (opt_xml) Loading @@ -2295,12 +2301,11 @@ static int dump_selected_tables(char *db, char **table_names, int tables) char new_table_name[NAME_LEN]; /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( table_names[i], new_table_name, sizeof(new_table_name) )) if (!get_actual_table_name( table_names[i], new_table_name, sizeof(new_table_name))) { numrows = getTableStructure(new_table_name, db); dumpTable(numrows, new_table_name); numrows= get_table_structure(new_table_name, db); dump_table(numrows, new_table_name); } my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; Loading @@ -2308,7 +2313,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables) if (was_views) { for (i=0 ; i < tables ; i++) getViewStructure(table_names[i], db); get_view_structure(table_names[i], db); } if (opt_xml) { Loading Loading @@ -2613,7 +2618,7 @@ static char *primary_key_fields(const char *table_name) Getting VIEW structure SYNOPSIS getViewStructure() get_view_structure() table view name db db name Loading @@ -2622,9 +2627,9 @@ static char *primary_key_fields(const char *table_name) 1 ERROR */ static my_bool getViewStructure(char *table, char* db) static my_bool get_view_structure(char *table, char* db) { MYSQL_RES *tableRes; MYSQL_RES *table_res; MYSQL_ROW row; MYSQL_FIELD *field; char *result_table, *opt_quoted_table; Loading @@ -2632,7 +2637,7 @@ static my_bool getViewStructure(char *table, char* db) char table_buff2[NAME_LEN*2+3]; char buff[20+FN_REFLEN]; FILE *sql_file = md_result_file; DBUG_ENTER("getViewStructure"); DBUG_ENTER("get_view_structure"); if (tFlag) DBUG_RETURN(0); Loading Loading @@ -2667,8 +2672,8 @@ static my_bool getViewStructure(char *table, char* db) } write_header(sql_file, db); } tableRes= mysql_store_result(sock); field= mysql_fetch_field_direct(tableRes, 0); table_res= mysql_store_result(sock); field= mysql_fetch_field_direct(table_res, 0); if (strcmp(field->name, "View") != 0) { if (verbose) Loading @@ -2688,10 +2693,10 @@ static my_bool getViewStructure(char *table, char* db) check_io(sql_file); } row= mysql_fetch_row(tableRes); row= mysql_fetch_row(table_res); fprintf(sql_file, "%s;\n", row[1]); check_io(sql_file); mysql_free_result(tableRes); mysql_free_result(table_res); if (sql_file != md_result_file) { Loading innobase/row/row0sel.c +6 −2 Original line number Diff line number Diff line Loading @@ -2145,12 +2145,16 @@ row_sel_convert_mysql_key_to_innobase( } if (dtype_get_mysql_type(dfield_get_type(dfield)) == DATA_MYSQL_TRUE_VARCHAR) { == DATA_MYSQL_TRUE_VARCHAR && dfield_get_type(dfield)->mtype != DATA_INT) { /* In a MySQL key value format, a true VARCHAR is always preceded by 2 bytes of a length field. dfield_get_type(dfield)->len returns the maximum 'payload' len in bytes. That does not include the 2 bytes that tell the actual data length. */ 2 bytes that tell the actual data length. We added the check != DATA_INT to make sure we do not treat MySQL ENUM or SET as a true VARCHAR! */ data_len += 2; data_field_len += 2; Loading mysql-test/r/strict.result +12 −0 Original line number Diff line number Diff line Loading @@ -1173,4 +1173,16 @@ col1 0000-00-00 00:00:00 NULL drop table t1; create table t1 (col1 tinyint); drop procedure if exists t1; Warnings: Note 1305 PROCEDURE t1 does not exist create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| call t1(); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 select * from t1; col1 drop procedure t1; drop table t1; set sql_mode=@org_mode; mysql-test/t/strict.test +15 −0 Original line number Diff line number Diff line Loading @@ -1031,6 +1031,21 @@ insert into t1 select * from t1; select * from t1; drop table t1; # # Test of inserting an invalid value via a stored procedure (Bug #5907) # create table t1 (col1 tinyint); drop procedure if exists t1; delimiter |; create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| delimiter ;| --error 1264 call t1(); select * from t1; drop procedure t1; drop table t1; # # Restore mode # Loading sql/ha_innodb.cc +42 −20 Original line number Diff line number Diff line Loading @@ -2272,12 +2272,42 @@ ulint get_innobase_type_from_mysql_type( /*==============================*/ /* out: DATA_BINARY, DATA_VARCHAR, ... */ ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type'; at least ENUM and SET, and unsigned integer types are 'unsigned types' */ Field* field) /* in: MySQL field */ { /* The following asserts try to check that the MySQL type code fits in 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to the type */ DBUG_ASSERT((ulint)FIELD_TYPE_STRING < 256); DBUG_ASSERT((ulint)FIELD_TYPE_VAR_STRING < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DOUBLE < 256); DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256); if (field->flags & UNSIGNED_FLAG) { *unsigned_flag = DATA_UNSIGNED; } else { *unsigned_flag = 0; } if (field->real_type() == FIELD_TYPE_ENUM || field->real_type() == FIELD_TYPE_SET) { /* MySQL has field->type() a string type for these, but the data is actually internally stored as an unsigned integer code! */ *unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned flag set to zero, even though internally this is an unsigned integer type */ return(DATA_INT); } switch (field->type()) { /* NOTE that we only allow string types in DATA_MYSQL and DATA_VARMYSQL */ Loading Loading @@ -2313,8 +2343,6 @@ get_innobase_type_from_mysql_type( case FIELD_TYPE_DATETIME: case FIELD_TYPE_YEAR: case FIELD_TYPE_NEWDATE: case FIELD_TYPE_ENUM: case FIELD_TYPE_SET: case FIELD_TYPE_TIME: case FIELD_TYPE_TIMESTAMP: return(DATA_INT); Loading Loading @@ -2686,7 +2714,7 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); templ->type = get_innobase_type_from_mysql_type(field); templ->type = index->table->cols[i].type.mtype; templ->mysql_type = (ulint)field->type(); if (templ->mysql_type == DATA_MYSQL_TRUE_VARCHAR) { Loading @@ -2698,8 +2726,8 @@ build_template( index->table->cols[i].type.prtype); templ->mbminlen = index->table->cols[i].type.mbminlen; templ->mbmaxlen = index->table->cols[i].type.mbmaxlen; templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); templ->is_unsigned = index->table->cols[i].type.prtype & DATA_UNSIGNED; if (templ->type == DATA_BLOB) { prebuilt->templ_contains_blob = TRUE; } Loading Loading @@ -2962,7 +2990,6 @@ calc_row_difference( byte* buf; upd_field_t* ufield; ulint col_type; ulint is_unsigned; ulint n_changed = 0; dfield_t dfield; uint i; Loading Loading @@ -2998,8 +3025,7 @@ calc_row_difference( field_mysql_type = field->type(); col_type = get_innobase_type_from_mysql_type(field); is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); col_type = prebuilt->table->cols[i].type.mtype; switch (col_type) { Loading Loading @@ -3072,8 +3098,7 @@ calc_row_difference( } ufield->exp = NULL; ufield->field_no = (prebuilt->table->cols + i)->clust_pos; ufield->field_no = prebuilt->table->cols[i].clust_pos; n_changed++; } } Loading Loading @@ -3932,19 +3957,14 @@ create_table_def( for (i = 0; i < n_cols; i++) { field = form->field[i]; col_type = get_innobase_type_from_mysql_type(field); col_type = get_innobase_type_from_mysql_type(&unsigned_type, field); if (field->null_ptr) { nulls_allowed = 0; } else { nulls_allowed = DATA_NOT_NULL; } if (field->flags & UNSIGNED_FLAG) { unsigned_type = DATA_UNSIGNED; } else { unsigned_type = 0; } if (field->binary()) { binary_type = DATA_BINARY_TYPE; } else { Loading Loading @@ -4021,6 +4041,7 @@ create_index( ulint ind_type; ulint col_type; ulint prefix_len; ulint is_unsigned; ulint i; ulint j; Loading Loading @@ -4070,7 +4091,8 @@ create_index( ut_a(j < form->s->fields); col_type = get_innobase_type_from_mysql_type(key_part->field); col_type = get_innobase_type_from_mysql_type( &is_unsigned, key_part->field); if (DATA_BLOB == col_type || (key_part->length < field->pack_length() Loading Loading
client/mysqldump.c +60 −55 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ ** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov */ #define DUMP_VERSION "10.9" #define DUMP_VERSION "10.10" #include <my_global.h> #include <my_sys.h> Loading Loading @@ -396,7 +396,7 @@ static int dump_all_databases(); static char *quote_name(const char *name, char *buff, my_bool force); static const char *check_if_ignore_table(const char *table_name); static char *primary_key_fields(const char *table_name); static my_bool getViewStructure(char *table, char* db); static my_bool get_view_structure(char *table, char* db); static my_bool dump_all_views_in_db(char *database); #include <help_start.h> Loading Loading @@ -777,16 +777,16 @@ static int get_options(int *argc, char ***argv) /* ** DBerror -- prints mysql error message and exits the program. ** DB_error -- prints mysql error message and exits the program. */ static void DBerror(MYSQL *mysql, const char *when) static void DB_error(MYSQL *mysql, const char *when) { DBUG_ENTER("DBerror"); DBUG_ENTER("DB_error"); my_printf_error(0,"Got error: %d: %s %s", MYF(0), mysql_errno(mysql), mysql_error(mysql), when); safe_exit(EX_MYSQLERR); DBUG_VOID_RETURN; } /* DBerror */ } /* DB_error */ /* Loading Loading @@ -862,7 +862,7 @@ static int dbConnect(char *host, char *user,char *passwd) NULL,opt_mysql_port,opt_mysql_unix_port, 0))) { DBerror(&mysql_connection, "when trying to connect"); DB_error(&mysql_connection, "when trying to connect"); return 1; } /* Loading Loading @@ -1093,7 +1093,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name, number of fields in table, 0 if error */ static uint getTableStructure(char *table, char *db) static uint get_table_structure(char *table, char *db) { MYSQL_RES *tableRes; MYSQL_ROW row; Loading @@ -1104,7 +1104,7 @@ static uint getTableStructure(char *table, char *db) 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"); DBUG_ENTER("get_table_structure"); delayed= opt_delayed ? " DELAYED " : ""; Loading Loading @@ -1457,7 +1457,7 @@ static uint getTableStructure(char *table, char *db) my_fclose(sql_file, MYF(MY_WME)); } DBUG_RETURN(numFields); } /* getTableStructure */ } /* get_table_structure */ static char *add_load_option(char *ptr,const char *object, Loading Loading @@ -1523,10 +1523,12 @@ static char *alloc_query_str(ulong size) return query; } /* ** dumpTable saves database contents as a series of INSERT statements. ** dump_table saves database contents as a series of INSERT statements. */ static void dumpTable(uint numFields, char *table) static void dump_table(uint numFields, char *table) { char query_buf[QUERY_LENGTH], *end, buff[256],table_buff[NAME_LEN+3]; char *result_table, table_buff2[NAME_LEN*2+3], *opt_quoted_table; Loading Loading @@ -1592,7 +1594,7 @@ static void dumpTable(uint numFields, char *table) } if (mysql_real_query(sock, query, (uint) (end - query))) { DBerror(sock, "when executing 'SELECT INTO OUTFILE'"); DB_error(sock, "when executing 'SELECT INTO OUTFILE'"); return; } } Loading Loading @@ -1639,13 +1641,13 @@ static void dumpTable(uint numFields, char *table) check_io(md_result_file); } if (mysql_query_with_error_report(sock, 0, query)) DBerror(sock, "when retrieving data from server"); DB_error(sock, "when retrieving data from server"); if (quick) res=mysql_use_result(sock); else res=mysql_store_result(sock); if (!res) DBerror(sock, "when retrieving data from server"); DB_error(sock, "when retrieving data from server"); if (verbose) fprintf(stderr, "-- Retrieving rows...\n"); if (mysql_num_fields(res) != numFields) Loading Loading @@ -1946,7 +1948,7 @@ static void dumpTable(uint numFields, char *table) my_free(query, MYF(MY_ALLOW_ZERO_PTR)); safe_exit(error); return; } /* dumpTable */ } /* dump_table */ static char *getTableName(int reset) Loading Loading @@ -2035,7 +2037,7 @@ static int init_dumping(char *database) if (mysql_select_db(sock, database)) { DBerror(sock, "when selecting the database"); DB_error(sock, "when selecting the database"); return 1; /* If --force */ } if (!path && !opt_xml) Loading Loading @@ -2123,14 +2125,14 @@ static int dump_all_tables_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when using LOCK TABLES"); DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) Loading @@ -2138,9 +2140,9 @@ static int dump_all_tables_in_db(char *database) char *end= strmov(afterdot, table); if (include_table(hash_key, end - hash_key)) { numrows = getTableStructure(table, database); numrows = get_table_structure(table, database); if (!dFlag && numrows > 0) dumpTable(numrows,table); dump_table(numrows,table); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } Loading Loading @@ -2188,18 +2190,18 @@ static my_bool dump_all_views_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when using LOCK TABLES"); DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) getViewStructure(table, database); get_view_structure(table, database); if (opt_xml) { fputs("</database>\n", md_result_file); Loading @@ -2226,7 +2228,7 @@ static int get_actual_table_name(const char *old_table_name, int buf_size) { int retval; MYSQL_RES *tableRes; MYSQL_RES *table_res; MYSQL_ROW row; char query[50 + 2*NAME_LEN]; char show_name_buff[FN_REFLEN]; Loading @@ -2242,18 +2244,22 @@ static int get_actual_table_name(const char *old_table_name, safe_exit(EX_MYSQLERR); } tableRes= mysql_store_result( sock ); retval = 1; if (tableRes != NULL) if ((table_res= mysql_store_result(sock))) { my_ulonglong numRows = mysql_num_rows(tableRes); if (numRows > 0) my_ulonglong num_rows= mysql_num_rows(table_res); if (num_rows > 0) { row= mysql_fetch_row( tableRes ); /* Return first row TODO: Return all matching rows */ row= mysql_fetch_row(table_res); strmake(new_table_name, row[0], buf_size-1); retval= 0; } mysql_free_result(tableRes); mysql_free_result(table_res); } return retval; } Loading @@ -2278,14 +2284,14 @@ static int dump_selected_tables(char *db, char **table_names, int tables) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (mysql_real_query(sock, query.str, query.length-1)) DBerror(sock, "when doing LOCK TABLES"); DB_error(sock, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) DBerror(sock, "when doing refresh"); DB_error(sock, "when doing refresh"); /* We shall countinue here, if --force was given */ } if (opt_xml) Loading @@ -2295,12 +2301,11 @@ static int dump_selected_tables(char *db, char **table_names, int tables) char new_table_name[NAME_LEN]; /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( table_names[i], new_table_name, sizeof(new_table_name) )) if (!get_actual_table_name( table_names[i], new_table_name, sizeof(new_table_name))) { numrows = getTableStructure(new_table_name, db); dumpTable(numrows, new_table_name); numrows= get_table_structure(new_table_name, db); dump_table(numrows, new_table_name); } my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; Loading @@ -2308,7 +2313,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables) if (was_views) { for (i=0 ; i < tables ; i++) getViewStructure(table_names[i], db); get_view_structure(table_names[i], db); } if (opt_xml) { Loading Loading @@ -2613,7 +2618,7 @@ static char *primary_key_fields(const char *table_name) Getting VIEW structure SYNOPSIS getViewStructure() get_view_structure() table view name db db name Loading @@ -2622,9 +2627,9 @@ static char *primary_key_fields(const char *table_name) 1 ERROR */ static my_bool getViewStructure(char *table, char* db) static my_bool get_view_structure(char *table, char* db) { MYSQL_RES *tableRes; MYSQL_RES *table_res; MYSQL_ROW row; MYSQL_FIELD *field; char *result_table, *opt_quoted_table; Loading @@ -2632,7 +2637,7 @@ static my_bool getViewStructure(char *table, char* db) char table_buff2[NAME_LEN*2+3]; char buff[20+FN_REFLEN]; FILE *sql_file = md_result_file; DBUG_ENTER("getViewStructure"); DBUG_ENTER("get_view_structure"); if (tFlag) DBUG_RETURN(0); Loading Loading @@ -2667,8 +2672,8 @@ static my_bool getViewStructure(char *table, char* db) } write_header(sql_file, db); } tableRes= mysql_store_result(sock); field= mysql_fetch_field_direct(tableRes, 0); table_res= mysql_store_result(sock); field= mysql_fetch_field_direct(table_res, 0); if (strcmp(field->name, "View") != 0) { if (verbose) Loading @@ -2688,10 +2693,10 @@ static my_bool getViewStructure(char *table, char* db) check_io(sql_file); } row= mysql_fetch_row(tableRes); row= mysql_fetch_row(table_res); fprintf(sql_file, "%s;\n", row[1]); check_io(sql_file); mysql_free_result(tableRes); mysql_free_result(table_res); if (sql_file != md_result_file) { Loading
innobase/row/row0sel.c +6 −2 Original line number Diff line number Diff line Loading @@ -2145,12 +2145,16 @@ row_sel_convert_mysql_key_to_innobase( } if (dtype_get_mysql_type(dfield_get_type(dfield)) == DATA_MYSQL_TRUE_VARCHAR) { == DATA_MYSQL_TRUE_VARCHAR && dfield_get_type(dfield)->mtype != DATA_INT) { /* In a MySQL key value format, a true VARCHAR is always preceded by 2 bytes of a length field. dfield_get_type(dfield)->len returns the maximum 'payload' len in bytes. That does not include the 2 bytes that tell the actual data length. */ 2 bytes that tell the actual data length. We added the check != DATA_INT to make sure we do not treat MySQL ENUM or SET as a true VARCHAR! */ data_len += 2; data_field_len += 2; Loading
mysql-test/r/strict.result +12 −0 Original line number Diff line number Diff line Loading @@ -1173,4 +1173,16 @@ col1 0000-00-00 00:00:00 NULL drop table t1; create table t1 (col1 tinyint); drop procedure if exists t1; Warnings: Note 1305 PROCEDURE t1 does not exist create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| call t1(); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 select * from t1; col1 drop procedure t1; drop table t1; set sql_mode=@org_mode;
mysql-test/t/strict.test +15 −0 Original line number Diff line number Diff line Loading @@ -1031,6 +1031,21 @@ insert into t1 select * from t1; select * from t1; drop table t1; # # Test of inserting an invalid value via a stored procedure (Bug #5907) # create table t1 (col1 tinyint); drop procedure if exists t1; delimiter |; create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| delimiter ;| --error 1264 call t1(); select * from t1; drop procedure t1; drop table t1; # # Restore mode # Loading
sql/ha_innodb.cc +42 −20 Original line number Diff line number Diff line Loading @@ -2272,12 +2272,42 @@ ulint get_innobase_type_from_mysql_type( /*==============================*/ /* out: DATA_BINARY, DATA_VARCHAR, ... */ ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type'; at least ENUM and SET, and unsigned integer types are 'unsigned types' */ Field* field) /* in: MySQL field */ { /* The following asserts try to check that the MySQL type code fits in 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to the type */ DBUG_ASSERT((ulint)FIELD_TYPE_STRING < 256); DBUG_ASSERT((ulint)FIELD_TYPE_VAR_STRING < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DOUBLE < 256); DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256); if (field->flags & UNSIGNED_FLAG) { *unsigned_flag = DATA_UNSIGNED; } else { *unsigned_flag = 0; } if (field->real_type() == FIELD_TYPE_ENUM || field->real_type() == FIELD_TYPE_SET) { /* MySQL has field->type() a string type for these, but the data is actually internally stored as an unsigned integer code! */ *unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned flag set to zero, even though internally this is an unsigned integer type */ return(DATA_INT); } switch (field->type()) { /* NOTE that we only allow string types in DATA_MYSQL and DATA_VARMYSQL */ Loading Loading @@ -2313,8 +2343,6 @@ get_innobase_type_from_mysql_type( case FIELD_TYPE_DATETIME: case FIELD_TYPE_YEAR: case FIELD_TYPE_NEWDATE: case FIELD_TYPE_ENUM: case FIELD_TYPE_SET: case FIELD_TYPE_TIME: case FIELD_TYPE_TIMESTAMP: return(DATA_INT); Loading Loading @@ -2686,7 +2714,7 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); templ->type = get_innobase_type_from_mysql_type(field); templ->type = index->table->cols[i].type.mtype; templ->mysql_type = (ulint)field->type(); if (templ->mysql_type == DATA_MYSQL_TRUE_VARCHAR) { Loading @@ -2698,8 +2726,8 @@ build_template( index->table->cols[i].type.prtype); templ->mbminlen = index->table->cols[i].type.mbminlen; templ->mbmaxlen = index->table->cols[i].type.mbmaxlen; templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); templ->is_unsigned = index->table->cols[i].type.prtype & DATA_UNSIGNED; if (templ->type == DATA_BLOB) { prebuilt->templ_contains_blob = TRUE; } Loading Loading @@ -2962,7 +2990,6 @@ calc_row_difference( byte* buf; upd_field_t* ufield; ulint col_type; ulint is_unsigned; ulint n_changed = 0; dfield_t dfield; uint i; Loading Loading @@ -2998,8 +3025,7 @@ calc_row_difference( field_mysql_type = field->type(); col_type = get_innobase_type_from_mysql_type(field); is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); col_type = prebuilt->table->cols[i].type.mtype; switch (col_type) { Loading Loading @@ -3072,8 +3098,7 @@ calc_row_difference( } ufield->exp = NULL; ufield->field_no = (prebuilt->table->cols + i)->clust_pos; ufield->field_no = prebuilt->table->cols[i].clust_pos; n_changed++; } } Loading Loading @@ -3932,19 +3957,14 @@ create_table_def( for (i = 0; i < n_cols; i++) { field = form->field[i]; col_type = get_innobase_type_from_mysql_type(field); col_type = get_innobase_type_from_mysql_type(&unsigned_type, field); if (field->null_ptr) { nulls_allowed = 0; } else { nulls_allowed = DATA_NOT_NULL; } if (field->flags & UNSIGNED_FLAG) { unsigned_type = DATA_UNSIGNED; } else { unsigned_type = 0; } if (field->binary()) { binary_type = DATA_BINARY_TYPE; } else { Loading Loading @@ -4021,6 +4041,7 @@ create_index( ulint ind_type; ulint col_type; ulint prefix_len; ulint is_unsigned; ulint i; ulint j; Loading Loading @@ -4070,7 +4091,8 @@ create_index( ut_a(j < form->s->fields); col_type = get_innobase_type_from_mysql_type(key_part->field); col_type = get_innobase_type_from_mysql_type( &is_unsigned, key_part->field); if (DATA_BLOB == col_type || (key_part->length < field->pack_length() Loading