summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgshchepa/uchum@host.loc <>2008-05-06 21:43:46 +0500
committergshchepa/uchum@host.loc <>2008-05-06 21:43:46 +0500
commit1c45081b5285a9ae2c5401cffd1fcfe0a312f4e7 (patch)
tree274f7ab47cd2d388e2f9a34437a09d2eaba46f74
parent5eaa779436743ce156d91cdb4ff8b41b6bcc5cda (diff)
downloadmariadb-git-1c45081b5285a9ae2c5401cffd1fcfe0a312f4e7.tar.gz
Partial rollback of fix for bug #30059: End-space truncation is inconsistent
or incorrect. For better conformance with standard, truncation procedure of CHAR columns has been changed to ignore truncation of trailing whitespace characters (note has been removed). Finally, for columns with non-binary charsets: 1. CHAR(N) columns silently ignore trailing whitespace truncation; 2. VARCHAR and TEXT columns issue Note about truncation. BLOBs and other columns with BINARY charset are unaffected.
-rw-r--r--mysql-test/r/bdb.result1
-rw-r--r--mysql-test/r/heap.result1
-rw-r--r--mysql-test/r/innodb.result1
-rw-r--r--mysql-test/r/myisam.result1
-rw-r--r--mysql-test/r/strict.result2
-rw-r--r--mysql-test/r/type_binary.result1
-rw-r--r--mysql-test/r/warnings.result2
-rw-r--r--sql/field.cc18
-rw-r--r--sql/field.h3
9 files changed, 14 insertions, 16 deletions
diff --git a/mysql-test/r/bdb.result b/mysql-test/r/bdb.result
index fefeeb405c5..3356d23053f 100644
--- a/mysql-test/r/bdb.result
+++ b/mysql-test/r/bdb.result
@@ -1325,7 +1325,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings:
Note 1265 Data truncated for column 'v' at row 1
-Note 1265 Data truncated for column 'c' at row 1
select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*')
*+ *+*+ *
diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result
index adfcc00174f..906c431b834 100644
--- a/mysql-test/r/heap.result
+++ b/mysql-test/r/heap.result
@@ -256,7 +256,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings:
Note 1265 Data truncated for column 'v' at row 1
-Note 1265 Data truncated for column 'c' at row 1
select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*')
*+ *+*+ *
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index 774e0bd167b..854712fdb1d 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -1901,7 +1901,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings:
Note 1265 Data truncated for column 'v' at row 1
-Note 1265 Data truncated for column 'c' at row 1
select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*')
*+ *+*+ *
diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result
index 24c1cecfb4f..33f64d600bb 100644
--- a/mysql-test/r/myisam.result
+++ b/mysql-test/r/myisam.result
@@ -1104,7 +1104,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings:
Note 1265 Data truncated for column 'v' at row 1
-Note 1265 Data truncated for column 'c' at row 1
select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*')
*+ *+*+ *
diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result
index 0a714635f70..34869862a63 100644
--- a/mysql-test/r/strict.result
+++ b/mysql-test/r/strict.result
@@ -934,8 +934,6 @@ NULL NULL
DROP TABLE t1;
CREATE TABLE t1 (col1 CHAR(5), col2 VARCHAR(6));
INSERT INTO t1 VALUES ('hello', 'hello'),('he', 'he'),('hello ', 'hello ');
-Warnings:
-Note 1265 Data truncated for column 'col1' at row 3
INSERT INTO t1 (col1) VALUES ('hellobob');
ERROR 22001: Data too long for column 'col1' at row 1
INSERT INTO t1 (col2) VALUES ('hellobob');
diff --git a/mysql-test/r/type_binary.result b/mysql-test/r/type_binary.result
index aaa46ab415e..debf4ff8fb8 100644
--- a/mysql-test/r/type_binary.result
+++ b/mysql-test/r/type_binary.result
@@ -125,7 +125,6 @@ create table t1 (c char(2), vc varchar(2));
insert into t1 values(0x4120, 0x4120);
insert into t1 values(0x412020, 0x412020);
Warnings:
-Note 1265 Data truncated for column 'c' at row 1
Note 1265 Data truncated for column 'vc' at row 1
drop table t1;
set @old_sql_mode= @@sql_mode, sql_mode= 'traditional';
diff --git a/mysql-test/r/warnings.result b/mysql-test/r/warnings.result
index e74f92205aa..94170a04674 100644
--- a/mysql-test/r/warnings.result
+++ b/mysql-test/r/warnings.result
@@ -305,7 +305,6 @@ set @q = repeat('q', 256);
set sql_mode = '';
insert into t1 values(@c, @c, @c);
Warnings:
-Note 1265 Data truncated for column 'c_char' at row 1
Note 1265 Data truncated for column 'c_varchar' at row 1
Note 1265 Data truncated for column 'c_tinytext' at row 1
insert into t2 values(@c);
@@ -322,7 +321,6 @@ Warning 1265 Data truncated for column 'c_tinyblob' at row 1
set sql_mode = 'traditional';
insert into t1 values(@c, @c, @c);
Warnings:
-Note 1265 Data truncated for column 'c_char' at row 1
Note 1265 Data truncated for column 'c_varchar' at row 1
Note 1265 Data truncated for column 'c_tinytext' at row 1
insert into t2 values(@c);
diff --git a/sql/field.cc b/sql/field.cc
index 18bb7153060..d840034f8dc 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5868,6 +5868,7 @@ check_string_copy_error(Field_str *field,
Field_longstr::report_if_important_data()
ptr - Truncated rest of string
end - End of truncated string
+ count_spaces - Treat traling spaces as important data
RETURN VALUES
0 - None was truncated (or we don't count cut fields)
@@ -5877,10 +5878,12 @@ check_string_copy_error(Field_str *field,
Check if we lost any important data (anything in a binary string,
or any non-space in others). If only trailing spaces was lost,
send a truncation note, otherwise send a truncation error.
+ Silently ignore traling spaces if the count_space parameter is FALSE.
*/
int
-Field_longstr::report_if_important_data(const char *ptr, const char *end)
+Field_longstr::report_if_important_data(const char *ptr, const char *end,
+ bool count_spaces)
{
if ((ptr < end) && table->in_use->count_cuted_fields)
{
@@ -5890,10 +5893,13 @@ Field_longstr::report_if_important_data(const char *ptr, const char *end)
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
else
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
+ return 2;
}
- else /* If we lost only spaces then produce a NOTE, not a WARNING */
+ else if (count_spaces)
+ { /* If we lost only spaces then produce a NOTE, not a WARNING */
set_warning(MYSQL_ERROR::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1);
- return 2;
+ return 2;
+ }
}
return 0;
}
@@ -5929,7 +5935,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length))
return 2;
- return report_if_important_data(from_end_pos, from + length);
+ return report_if_important_data(from_end_pos, from + length, FALSE);
}
@@ -6388,7 +6394,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length))
return 2;
- return report_if_important_data(from_end_pos, from + length);
+ return report_if_important_data(from_end_pos, from + length, TRUE);
}
@@ -7025,7 +7031,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length))
return 2;
- return report_if_important_data(from_end_pos, from + length);
+ return report_if_important_data(from_end_pos, from + length, TRUE);
oom_error:
/* Fatal OOM error */
diff --git a/sql/field.h b/sql/field.h
index c82d65147ac..8d771a151a7 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -455,7 +455,8 @@ public:
class Field_longstr :public Field_str
{
protected:
- int report_if_important_data(const char *ptr, const char *end);
+ int report_if_important_data(const char *ptr, const char *end,
+ bool count_spaces);
public:
Field_longstr(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg, utype unireg_check_arg,