summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <venu@myvenu.com>2003-04-28 22:58:19 -0700
committerunknown <venu@myvenu.com>2003-04-28 22:58:19 -0700
commit1f4309fa7e3fa703145374e7050647766a25cd02 (patch)
treecce04f77890e16d1d376d47b5ed166aafe2a37b3
parent75093e53364dc19b16bbfb663861cbd80b352074 (diff)
parent4eaed50bbee00ffd5cb8f8da49c6d0537dfdaced (diff)
downloadmariadb-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.h6
-rw-r--r--mysql-test/r/warnings.result24
-rw-r--r--mysql-test/std_data/warnings_loaddata.dat8
-rw-r--r--mysql-test/t/warnings.test12
-rw-r--r--sql/field.cc7
-rw-r--r--sql/share/english/errmsg.txt7
-rw-r--r--sql/sql_load.cc60
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