summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/field.h7
-rw-r--r--sql/ha_federated.cc44
2 files changed, 33 insertions, 18 deletions
diff --git a/sql/field.h b/sql/field.h
index cd6439d1787..de76132f093 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -118,6 +118,11 @@ public:
*/
virtual String *val_str(String*,String *)=0;
String *val_int_as_str(String *val_buffer, my_bool unsigned_flag);
+ /*
+ str_needs_quotes() returns TRUE if the value returned by val_str() needs
+ to be quoted when used in constructing an SQL query.
+ */
+ virtual bool str_needs_quotes() { return FALSE; }
virtual Item_result result_type () const=0;
virtual Item_result cmp_type () const { return result_type(); }
virtual Item_result cast_to_int_type () const { return result_type(); }
@@ -412,6 +417,7 @@ public:
uint32 max_length() { return field_length; }
friend class create_field;
my_decimal *val_decimal(my_decimal *);
+ virtual bool str_needs_quotes() { return TRUE; }
uint is_equal(create_field *new_field);
};
@@ -1379,6 +1385,7 @@ public:
double val_real(void);
longlong val_int(void);
String *val_str(String*, String *);
+ virtual bool str_needs_quotes() { return TRUE; }
my_decimal *val_decimal(my_decimal *);
int cmp(const char *a, const char *b)
{ return cmp_binary(a, b); }
diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc
index bf3c3ac1beb..8aca6362462 100644
--- a/sql/ha_federated.cc
+++ b/sql/ha_federated.cc
@@ -1142,7 +1142,7 @@ bool ha_federated::create_where_from_key(String *to,
Field *field= key_part->field;
uint store_length= key_part->store_length;
uint part_length= min(store_length, length);
- needs_quotes= 1;
+ needs_quotes= field->str_needs_quotes();
DBUG_DUMP("key, start of loop", (char *) ptr, length);
if (key_part->null_bit)
@@ -1663,23 +1663,22 @@ int ha_federated::write_row(byte *buf)
{
commas_added= TRUE;
if ((*field)->is_null())
- insert_field_value_string.append(STRING_WITH_LEN(" NULL "));
+ values_string.append(STRING_WITH_LEN(" NULL "));
else
{
+ bool needs_quote= (*field)->str_needs_quotes();
(*field)->val_str(&insert_field_value_string);
- values_string.append('\'');
+ if (needs_quote)
+ values_string.append('\'');
insert_field_value_string.print(&values_string);
- values_string.append('\'');
+ if (needs_quote)
+ values_string.append('\'');
insert_field_value_string.length(0);
}
/* append the field name */
insert_string.append((*field)->field_name);
- /* append the value */
- values_string.append(insert_field_value_string);
- insert_field_value_string.length(0);
-
/* append commas between both fields and fieldnames */
/*
unfortunately, we can't use the logic if *(fields + 1) to
@@ -1884,12 +1883,15 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
update_string.append(STRING_WITH_LEN(" NULL "));
else
{
- my_bitmap_map *old_map= tmp_use_all_columns(table, table->read_set);
/* otherwise = */
+ my_bitmap_map *old_map= tmp_use_all_columns(table, table->read_set);
+ bool needs_quote= (*field)->str_needs_quotes();
(*field)->val_str(&field_value);
- update_string.append('\'');
+ if (needs_quote)
+ update_string.append('\'');
field_value.print(&update_string);
- update_string.append('\'');
+ if (needs_quote)
+ update_string.append('\'');
field_value.length(0);
tmp_restore_column_map(table->read_set, old_map);
}
@@ -1903,12 +1905,15 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
where_string.append(STRING_WITH_LEN(" IS NULL "));
else
{
+ bool needs_quote= (*field)->str_needs_quotes();
where_string.append(STRING_WITH_LEN(" = "));
(*field)->val_str(&field_value,
(char*) (old_data + (*field)->offset()));
- where_string.append('\'');
+ if (needs_quote)
+ where_string.append('\'');
field_value.print(&where_string);
- where_string.append('\'');
+ if (needs_quote)
+ where_string.append('\'');
field_value.length(0);
}
where_string.append(STRING_WITH_LEN(" AND "));
@@ -1983,11 +1988,14 @@ int ha_federated::delete_row(const byte *buf)
}
else
{
- delete_string.append(STRING_WITH_LEN(" = "));
- cur_field->val_str(&data_string);
- delete_string.append('\'');
- data_string.print(&delete_string);
- delete_string.append('\'');
+ bool needs_quote= cur_field->str_needs_quotes();
+ delete_string.append(STRING_WITH_LEN(" = "));
+ cur_field->val_str(&data_string);
+ if (needs_quote)
+ delete_string.append('\'');
+ data_string.print(&delete_string);
+ if (needs_quote)
+ delete_string.append('\'');
}
delete_string.append(STRING_WITH_LEN(" AND "));
}