summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorunknown <jimw@mysql.com>2005-12-06 18:27:39 -0800
committerunknown <jimw@mysql.com>2005-12-06 18:27:39 -0800
commit1365856e8ddac7f9f38db19b0c52d9a31f2c0144 (patch)
treec13b7408adbb0e7438c72b004f3c2ad11074a666 /sql/field.cc
parent440da8a700423f82295c404913003f974b62e681 (diff)
parent43dd386df9c1fb7f8ee6d8f0cf59c79fafd0f8a8 (diff)
downloadmariadb-git-1365856e8ddac7f9f38db19b0c52d9a31f2c0144.tar.gz
Merge mysql.com:/home/jimw/my/mysql-5.0-clean
into mysql.com:/home/jimw/my/mysql-5.1-clean mysql-test/r/sp.result: Auto merged sql/field.cc: Auto merged sql/ha_innodb.cc: Auto merged sql/ha_innodb.h: Auto merged sql/sp.cc: Auto merged sql/sp_head.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_yacc.yy: Auto merged storage/innobase/btr/btr0sea.c: Auto merged storage/innobase/dict/dict0dict.c: Auto merged storage/innobase/dict/dict0load.c: Auto merged storage/innobase/include/buf0buf.h: Auto merged storage/innobase/include/dict0dict.h: Auto merged storage/innobase/include/dict0load.h: Auto merged storage/innobase/include/rem0cmp.h: Auto merged storage/innobase/rem/rem0cmp.c: Auto merged storage/innobase/row/row0mysql.c: Auto merged storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp: Auto merged mysql-test/r/innodb.result: Resolve conflicts sql/share/errmsg.txt: Resolve conflict
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc57
1 files changed, 34 insertions, 23 deletions
diff --git a/sql/field.cc b/sql/field.cc
index 8c2b3b75573..09afbd346a8 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5859,44 +5859,52 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
char buff[STRING_BUFFER_USUAL_SIZE];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
uint copy_length;
-
+
/* See the comment for Field_long::store(long long) */
DBUG_ASSERT(table->in_use == current_thd);
-
+
/* Convert character set if necessary */
if (String::needs_conversion(length, cs, field_charset, &not_used))
- {
+ {
uint conv_errors;
tmpstr.copy(from, length, cs, field_charset, &conv_errors);
from= tmpstr.ptr();
- length= tmpstr.length();
+ length= tmpstr.length();
if (conv_errors)
error= 2;
}
- /*
- Make sure we don't break a multibyte sequence
- as well as don't copy a malformed data.
- */
+ /* Make sure we don't break a multibyte sequence or copy malformed data. */
copy_length= field_charset->cset->well_formed_len(field_charset,
from,from+length,
field_length/
field_charset->mbmaxlen,
&well_formed_error);
memcpy(ptr,from,copy_length);
- if (copy_length < field_length) // Append spaces if shorter
+
+ /* Append spaces if the string was shorter than the field. */
+ if (copy_length < field_length)
field_charset->cset->fill(field_charset,ptr+copy_length,
- field_length-copy_length,
+ field_length-copy_length,
field_charset->pad_char);
-
+
+ /*
+ Check if we lost any important data (anything in a binary string,
+ or any non-space in others).
+ */
if ((copy_length < length) && table->in_use->count_cuted_fields)
- { // Check if we loosed some info
- const char *end=from+length;
- from+= copy_length;
- from+= field_charset->cset->scan(field_charset, from, end,
- MY_SEQ_SPACES);
- if (from != end)
+ {
+ if (binary())
error= 2;
+ else
+ {
+ const char *end=from+length;
+ from+= copy_length;
+ from+= field_charset->cset->scan(field_charset, from, end,
+ MY_SEQ_SPACES);
+ if (from != end)
+ error= 2;
+ }
}
if (error)
{
@@ -6298,12 +6306,15 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
if ((copy_length < length) && table->in_use->count_cuted_fields &&
!error_code)
{
- const char *end= from + length;
- from+= copy_length;
- from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES);
- /* If we lost only spaces then produce a NOTE, not a WARNING */
- if (from == end)
- level= MYSQL_ERROR::WARN_LEVEL_NOTE;
+ if (!binary())
+ {
+ const char *end= from + length;
+ from+= copy_length;
+ from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES);
+ /* If we lost only spaces then produce a NOTE, not a WARNING */
+ if (from == end)
+ level= MYSQL_ERROR::WARN_LEVEL_NOTE;
+ }
error_code= WARN_DATA_TRUNCATED;
}
if (error_code)