diff options
author | unknown <venu@myvenu.com> | 2003-04-28 22:58:19 -0700 |
---|---|---|
committer | unknown <venu@myvenu.com> | 2003-04-28 22:58:19 -0700 |
commit | 1f4309fa7e3fa703145374e7050647766a25cd02 (patch) | |
tree | cce04f77890e16d1d376d47b5ed166aafe2a37b3 | |
parent | 75093e53364dc19b16bbfb663861cbd80b352074 (diff) | |
parent | 4eaed50bbee00ffd5cb8f8da49c6d0537dfdaced (diff) | |
download | mariadb-git-1f4309fa7e3fa703145374e7050647766a25cd02.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into myvenu.com:/home/venu/work/sql/dev-4.1
-rw-r--r-- | include/mysqld_error.h | 6 | ||||
-rw-r--r-- | mysql-test/r/warnings.result | 24 | ||||
-rw-r--r-- | mysql-test/std_data/warnings_loaddata.dat | 8 | ||||
-rw-r--r-- | mysql-test/t/warnings.test | 12 | ||||
-rw-r--r-- | sql/field.cc | 7 | ||||
-rw-r--r-- | sql/share/english/errmsg.txt | 7 | ||||
-rw-r--r-- | sql/sql_load.cc | 60 |
7 files changed, 114 insertions, 10 deletions
diff --git a/include/mysqld_error.h b/include/mysqld_error.h index f42ecc5015a..3fa08645193 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -275,5 +275,9 @@ #define ER_ZLIB_Z_BUF_ERROR 1256 #define ER_ZLIB_Z_DATA_ERROR 1257 #define ER_CUT_VALUE_GROUP_CONCAT 1258 -#define ER_ERROR_MESSAGES 259 +#define ER_WARN_TOO_FEW_RECORDS 1259 +#define ER_WARN_TOO_MANY_RECORDS 1260 +#define ER_WARN_DATA_TRUNCATED 1261 +#define ER_WARN_NULL_TO_NOTNULL 1262 +#define ER_ERROR_MESSAGES 263 diff --git a/mysql-test/r/warnings.result b/mysql-test/r/warnings.result index f2a105827da..c1f3041bf12 100644 --- a/mysql-test/r/warnings.result +++ b/mysql-test/r/warnings.result @@ -30,3 +30,27 @@ create table if not exists t1(id int); select @@warning_count; @@warning_count 0 +drop table t1; +create table t1(a tinyint, b int not null, c date, d char(5)); +load data infile '../../std_data/warnings_loaddata.dat' into table t1 fields terminated by ','; +Warnings: +Warning 1262 Data truncated, NULL supplied to NOT NULL column 'b' at row 2 +Warning 1261 Data truncated for column 'd' at row 3 +Warning 1261 Data truncated for column 'c' at row 4 +Warning 1259 Value count is fewer than the column count at row 5 +Warning 1261 Data truncated for column 'b' at row 6 +Warning 1260 Value count is more than the column count at row 7 +Warning 1261 Data truncated for column 'a' at row 8 +select @@warning_count; +@@warning_count +7 +show warnings; +Level Code Message +Warning 1262 Data truncated, NULL supplied to NOT NULL column 'b' at row 2 +Warning 1261 Data truncated for column 'd' at row 3 +Warning 1261 Data truncated for column 'c' at row 4 +Warning 1259 Value count is fewer than the column count at row 5 +Warning 1261 Data truncated for column 'b' at row 6 +Warning 1260 Value count is more than the column count at row 7 +Warning 1261 Data truncated for column 'a' at row 8 +drop table t1; diff --git a/mysql-test/std_data/warnings_loaddata.dat b/mysql-test/std_data/warnings_loaddata.dat new file mode 100644 index 00000000000..e645de775ab --- /dev/null +++ b/mysql-test/std_data/warnings_loaddata.dat @@ -0,0 +1,8 @@ +10,20,2003-04-21,mysql +20,\N,2003-04-22,MySQL +30,40,2003-04-23,MySQL is Open Source Database +40,50,monty,30 +50,60,2003-04-24 +60,67 abc,2003-04-25,mysql +70,80,2003-04-26,mysql,open,source +500,90,2003-04-27,mysql diff --git a/mysql-test/t/warnings.test b/mysql-test/t/warnings.test index 8cff8706c43..bfdbb8f025a 100644 --- a/mysql-test/t/warnings.test +++ b/mysql-test/t/warnings.test @@ -17,6 +17,7 @@ set SQL_WARNINGS=0; # # Test other warnings +# drop temporary table if exists not_exists; drop table if exists not_exists_table; @@ -26,3 +27,14 @@ show count(*) warnings; create table t1(id int); create table if not exists t1(id int); select @@warning_count; +drop table t1; + +# +# Test warnings for LOAD DATA INFILE +# + +create table t1(a tinyint, b int not null, c date, d char(5)); +load data infile '../../std_data/warnings_loaddata.dat' into table t1 fields terminated by ','; +select @@warning_count; +show warnings; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 0ea206a4fa7..134f3712d0d 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1677,6 +1677,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) !test_if_int(from,len,end,cs))) { current_thd->cuted_fields++; + error= 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -1932,7 +1933,10 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) if (error || (from+len != end && current_thd->count_cuted_fields && !test_if_int(from,len,end,cs))) - current_thd->cuted_fields++; + { + current_thd->cuted_fields++; + error= 1; + } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -2416,6 +2420,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) if (err || current_thd->count_cuted_fields && !test_if_real(from,len,cs)) { current_thd->cuted_fields++; + err= 1; } if (unsigned_flag && j < 0) { diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 2628f806d15..dd01ef1d60f 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -259,4 +259,9 @@ "Z_BUF_ERROR: Not enough memory available for zlib" "Z_MEM_ERROR: Not enough room in the output buffer for zlib (probably, length of uncompressed data was corrupted)" "Z_DATA_ERROR: Input data was corrupted for zlib" -"%d line(s) was(were) cut by group_concat()"
\ No newline at end of file +"%d line(s) was(were) cut by group_concat()"; +"Value count is fewer than the column count at row %ld"; +"Value count is more than the column count at row %ld"; +"Data truncated for column '%s' at row %ld"; +"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld" + diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 3c43c3d9e3a..47e4be16b8e 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -368,9 +368,11 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields, List_iterator_fast<Item> it(fields); Item_field *sql_field; ulonglong id; + ulong row_pos; DBUG_ENTER("read_fixed_length"); - id=0; + id= 0; + row_pos= 1; /* No fields can be null in this format. mark all fields as not null */ while ((sql_field= (Item_field*) it++)) sql_field->field->set_notnull(); @@ -392,8 +394,11 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields, Field *field=sql_field->field; if (pos == read_info.row_end) { - thd->cuted_fields++; /* Not enough fields */ - field->reset(); + thd->cuted_fields++; /* Not enough fields */ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_FEW_RECORDS, + ER(ER_WARN_TOO_FEW_RECORDS), row_pos); + field->reset(); } else { @@ -403,14 +408,25 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields, field->field_length) length=field->field_length; save_chr=pos[length]; pos[length]='\0'; // Safeguard aganst malloc - field->store((char*) pos,length,read_info.read_charset); + if (field->store((char*) pos,length,read_info.read_charset)) + { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_DATA_TRUNCATED, + ER(ER_WARN_DATA_TRUNCATED), + field->field_name, row_pos); + } pos[length]=save_chr; if ((pos+=length) > read_info.row_end) pos= read_info.row_end; /* Fills rest with space */ } } if (pos != read_info.row_end) + { thd->cuted_fields++; /* To long row */ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_MANY_RECORDS, + ER(ER_WARN_TOO_MANY_RECORDS), row_pos); + } if (write_record(table,&info)) DBUG_RETURN(1); /* @@ -426,7 +442,13 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List<Item> &fields, if (read_info.next_line()) // Skip to next line break; if (read_info.line_cuted) + { thd->cuted_fields++; /* To long row */ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_MANY_RECORDS, + ER(ER_WARN_TOO_MANY_RECORDS), row_pos); + } + row_pos++; } if (id && !read_info.error) thd->insert_id(id); // For binary/update log @@ -444,11 +466,13 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table, Item_field *sql_field; uint enclosed_length; ulonglong id; + ulong row_pos; DBUG_ENTER("read_sep_field"); enclosed_length=enclosed.length(); - id=0; - + id= 0; + row_pos= 1; + for (;;it.rewind()) { if (thd->killed) @@ -478,13 +502,26 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table, if (field->type() == FIELD_TYPE_TIMESTAMP) ((Field_timestamp*) field)->set_time(); else if (field != table->next_number_field) + { thd->cuted_fields++; + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_NULL_TO_NOTNULL, + ER(ER_WARN_NULL_TO_NOTNULL), + field->field_name, row_pos); + } } continue; } field->set_notnull(); read_info.row_end[0]=0; // Safe to change end marker - field->store((char*) read_info.row_start,length,read_info.read_charset); + if (field->store((char*) read_info.row_start,length,read_info.read_charset)) + { + // Data truncated or out of bounds + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_DATA_TRUNCATED, + ER(ER_WARN_DATA_TRUNCATED), + field->field_name, row_pos); + } } if (read_info.error) break; @@ -497,6 +534,9 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table, sql_field->field->set_null(); sql_field->field->reset(); thd->cuted_fields++; + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_FEW_RECORDS, + ER(ER_WARN_TOO_FEW_RECORDS), row_pos); } } if (write_record(table,&info)) @@ -514,7 +554,13 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table, if (read_info.next_line()) // Skip to next line break; if (read_info.line_cuted) + { thd->cuted_fields++; /* To long row */ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_MANY_RECORDS, + ER(ER_WARN_TOO_MANY_RECORDS), row_pos); + } + row_pos++; } if (id && !read_info.error) thd->insert_id(id); // For binary/update log |