summaryrefslogtreecommitdiff
path: root/sql/field_conv.cc
diff options
context:
space:
mode:
authormonty@mishka.local <>2005-07-19 19:25:05 +0300
committermonty@mishka.local <>2005-07-19 19:25:05 +0300
commit7e83d09ce72e27266eb8f6deababd172c20bbfb6 (patch)
tree98d1121d654b01cf2306965326d1355704fc1218 /sql/field_conv.cc
parent8b3d39163af4075b039638ebad86ae21cbc81323 (diff)
downloadmariadb-git-7e83d09ce72e27266eb8f6deababd172c20bbfb6.tar.gz
Simple fixes during review of new code
Diffstat (limited to 'sql/field_conv.cc')
-rw-r--r--sql/field_conv.cc32
1 files changed, 31 insertions, 1 deletions
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index a447716a818..7998dd6d5f8 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -324,7 +324,34 @@ static void do_field_real(Copy_field *copy)
}
+/*
+ string copy for single byte characters set when to string is shorter than
+ from string
+*/
+
static void do_cut_string(Copy_field *copy)
+{
+ CHARSET_INFO *cs= copy->from_field->charset();
+ memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
+
+ /* Check if we loosed any important characters */
+ if (cs->cset->scan(cs,
+ copy->from_ptr + copy->to_length,
+ copy->from_ptr + copy->from_length,
+ MY_SEQ_SPACES) < copy->from_length - copy->to_length)
+ {
+ copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
+ ER_WARN_DATA_TRUNCATED, 1);
+ }
+}
+
+
+/*
+ string copy for multi byte characters set when to string is shorter than
+ from string
+*/
+
+static void do_cut_string_complex(Copy_field *copy)
{ // Shorter string field
int well_formed_error;
CHARSET_INFO *cs= copy->from_field->charset();
@@ -351,6 +378,8 @@ static void do_cut_string(Copy_field *copy)
}
+
+
static void do_expand_string(Copy_field *copy)
{
CHARSET_INFO *cs= copy->from_field->charset();
@@ -517,7 +546,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
from_length)
return do_varstring;
else if (to_length < from_length)
- return do_cut_string;
+ return (from->charset()->mbmaxlen == 1 ?
+ do_cut_string : do_cut_string_complex);
else if (to_length > from_length)
return do_expand_string;
}