Commit 5a1b7ddb authored by unknown's avatar unknown

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.





mysql-test/r/bdb.result:
  Rollback of bug #30059 fix.
mysql-test/r/heap.result:
  Rollback of bug #30059 fix.
mysql-test/r/innodb.result:
  Rollback of bug #30059 fix.
mysql-test/r/myisam.result:
  Rollback of bug #30059 fix.
mysql-test/r/strict.result:
  Rollback of bug #30059 fix.
mysql-test/r/type_binary.result:
  Rollback of bug #30059 fix.
mysql-test/r/warnings.result:
  Updated test case for bug #30059.
sql/field.cc:
  Post-commit fix for bug #30059.
  
  The Field_longstr::report_if_important_data method
  has been changed to notify about trailing spaces only if
  the new count_spaces parameter is TRUE.
  
  The Field_string::store method has been changed to
  ignore trailing whitespace truncation (CHAR column
  type).
sql/field.h:
  Post-commit fix for bug #30059.
  
  The Field_longstr::report_if_important_data method declaration
  has been changed to accept extra parameter: bool count_spaces.
parent 65a310fe
...@@ -1325,7 +1325,6 @@ set @a=repeat(' ',20); ...@@ -1325,7 +1325,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings: Warnings:
Note 1265 Data truncated for column 'v' at row 1 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; select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*') concat('*',v,'*',c,'*',t,'*')
*+ *+*+ * *+ *+*+ *
......
...@@ -256,7 +256,6 @@ set @a=repeat(' ',20); ...@@ -256,7 +256,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings: Warnings:
Note 1265 Data truncated for column 'v' at row 1 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; select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*') concat('*',v,'*',c,'*',t,'*')
*+ *+*+ * *+ *+*+ *
......
...@@ -1901,7 +1901,6 @@ set @a=repeat(' ',20); ...@@ -1901,7 +1901,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings: Warnings:
Note 1265 Data truncated for column 'v' at row 1 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; select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*') concat('*',v,'*',c,'*',t,'*')
*+ *+*+ * *+ *+*+ *
......
...@@ -1104,7 +1104,6 @@ set @a=repeat(' ',20); ...@@ -1104,7 +1104,6 @@ set @a=repeat(' ',20);
insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a));
Warnings: Warnings:
Note 1265 Data truncated for column 'v' at row 1 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; select concat('*',v,'*',c,'*',t,'*') from t1;
concat('*',v,'*',c,'*',t,'*') concat('*',v,'*',c,'*',t,'*')
*+ *+*+ * *+ *+*+ *
......
...@@ -934,8 +934,6 @@ NULL NULL ...@@ -934,8 +934,6 @@ NULL NULL
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (col1 CHAR(5), col2 VARCHAR(6)); CREATE TABLE t1 (col1 CHAR(5), col2 VARCHAR(6));
INSERT INTO t1 VALUES ('hello', 'hello'),('he', 'he'),('hello ', 'hello '); 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'); INSERT INTO t1 (col1) VALUES ('hellobob');
ERROR 22001: Data too long for column 'col1' at row 1 ERROR 22001: Data too long for column 'col1' at row 1
INSERT INTO t1 (col2) VALUES ('hellobob'); INSERT INTO t1 (col2) VALUES ('hellobob');
......
...@@ -125,7 +125,6 @@ create table t1 (c char(2), vc varchar(2)); ...@@ -125,7 +125,6 @@ create table t1 (c char(2), vc varchar(2));
insert into t1 values(0x4120, 0x4120); insert into t1 values(0x4120, 0x4120);
insert into t1 values(0x412020, 0x412020); insert into t1 values(0x412020, 0x412020);
Warnings: Warnings:
Note 1265 Data truncated for column 'c' at row 1
Note 1265 Data truncated for column 'vc' at row 1 Note 1265 Data truncated for column 'vc' at row 1
drop table t1; drop table t1;
set @old_sql_mode= @@sql_mode, sql_mode= 'traditional'; set @old_sql_mode= @@sql_mode, sql_mode= 'traditional';
......
...@@ -305,7 +305,6 @@ set @q = repeat('q', 256); ...@@ -305,7 +305,6 @@ set @q = repeat('q', 256);
set sql_mode = ''; set sql_mode = '';
insert into t1 values(@c, @c, @c); insert into t1 values(@c, @c, @c);
Warnings: 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_varchar' at row 1
Note 1265 Data truncated for column 'c_tinytext' at row 1 Note 1265 Data truncated for column 'c_tinytext' at row 1
insert into t2 values(@c); insert into t2 values(@c);
...@@ -322,7 +321,6 @@ Warning 1265 Data truncated for column 'c_tinyblob' at row 1 ...@@ -322,7 +321,6 @@ Warning 1265 Data truncated for column 'c_tinyblob' at row 1
set sql_mode = 'traditional'; set sql_mode = 'traditional';
insert into t1 values(@c, @c, @c); insert into t1 values(@c, @c, @c);
Warnings: 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_varchar' at row 1
Note 1265 Data truncated for column 'c_tinytext' at row 1 Note 1265 Data truncated for column 'c_tinytext' at row 1
insert into t2 values(@c); insert into t2 values(@c);
......
...@@ -5868,6 +5868,7 @@ check_string_copy_error(Field_str *field, ...@@ -5868,6 +5868,7 @@ check_string_copy_error(Field_str *field,
Field_longstr::report_if_important_data() Field_longstr::report_if_important_data()
ptr - Truncated rest of string ptr - Truncated rest of string
end - End of truncated string end - End of truncated string
count_spaces - Treat traling spaces as important data
RETURN VALUES RETURN VALUES
0 - None was truncated (or we don't count cut fields) 0 - None was truncated (or we don't count cut fields)
...@@ -5877,10 +5878,12 @@ check_string_copy_error(Field_str *field, ...@@ -5877,10 +5878,12 @@ check_string_copy_error(Field_str *field,
Check if we lost any important data (anything in a binary string, Check if we lost any important data (anything in a binary string,
or any non-space in others). If only trailing spaces was lost, or any non-space in others). If only trailing spaces was lost,
send a truncation note, otherwise send a truncation error. send a truncation note, otherwise send a truncation error.
Silently ignore traling spaces if the count_space parameter is FALSE.
*/ */
int 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) if ((ptr < end) && table->in_use->count_cuted_fields)
{ {
...@@ -5890,11 +5893,14 @@ Field_longstr::report_if_important_data(const char *ptr, const char *end) ...@@ -5890,11 +5893,14 @@ Field_longstr::report_if_important_data(const char *ptr, const char *end)
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1); set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
else else
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); 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); set_warning(MYSQL_ERROR::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1);
return 2; return 2;
} }
}
return 0; return 0;
} }
...@@ -5929,7 +5935,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -5929,7 +5935,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length)) cannot_convert_error_pos, from + length))
return 2; 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) ...@@ -6388,7 +6394,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length)) cannot_convert_error_pos, from + length))
return 2; 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) ...@@ -7025,7 +7031,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
cannot_convert_error_pos, from + length)) cannot_convert_error_pos, from + length))
return 2; 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: oom_error:
/* Fatal OOM error */ /* Fatal OOM error */
......
...@@ -455,7 +455,8 @@ public: ...@@ -455,7 +455,8 @@ public:
class Field_longstr :public Field_str class Field_longstr :public Field_str
{ {
protected: 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: public:
Field_longstr(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, Field_longstr(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg, utype unireg_check_arg, uchar null_bit_arg, utype unireg_check_arg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment