summaryrefslogtreecommitdiff
path: root/sql/sql_partition.cc
diff options
context:
space:
mode:
authorunknown <mikael/pappa@dator5.(none)>2006-07-21 10:23:32 -0400
committerunknown <mikael/pappa@dator5.(none)>2006-07-21 10:23:32 -0400
commit670b65739b507f1b89d05875ca675c4c5d994378 (patch)
treec8d1714d195c94380bced1bb36b53a9bb474844b /sql/sql_partition.cc
parentf8a91e3140bace5fa36e9e27dab29f50df7e00e6 (diff)
downloadmariadb-git-670b65739b507f1b89d05875ca675c4c5d994378.tar.gz
BUG#18198: Partition function handling
Review fixes sql/item.h: Review fixes sql/item_cmpfunc.h: Review fixes sql/item_func.h: Review fixes sql/item_strfunc.h: Review fixes sql/item_timefunc.h: Review fixes sql/item_xmlfunc.h: Review fixes sql/partition_info.cc: Review fixes sql/partition_info.h: Review fixes sql/sql_partition.cc: Review fixes sql/sql_yacc.yy: Review fixes
Diffstat (limited to 'sql/sql_partition.cc')
-rw-r--r--sql/sql_partition.cc29
1 files changed, 15 insertions, 14 deletions
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index db2307597ba..d11a7b8bccd 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -1376,7 +1376,7 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
Check that partition function do not contain any forbidden
character sets and collations.
SYNOPSIS
- check_part_func_collation()
+ check_part_func_fields()
part_info Partition info
ptr Array of Field pointers
RETURN VALUES
@@ -1384,19 +1384,24 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
TRUE Error
*/
-static bool check_part_func_collation(int collation_allowed,
- Field **ptr)
+static bool check_part_func_fields(Field **ptr)
{
Field *field;
while ((field= *(ptr++)))
{
- if (field->result_type() == STRING_RESULT)
+ /*
+ For CHAR/VARCHAR fields we need to take special precautions.
+ Binary collation with CHAR is automatically supported. Other
+ types need some kind of standardisation function handling
+ */
+ if (field->type() == MYSQL_TYPE_STRING ||
+ field->type() == MYSQL_TYPE_VARCHAR)
{
CHARSET_INFO *cs= ((Field_str*)field)->charset();
- if (use_strnxfrm(cs) ||
- (collation_allowed == PF_SAFE_BINARY_COLLATION &&
- (!(cs->state & MY_CS_BINSORT))))
- return TRUE;
+ if (field->type() == MYSQL_TYPE_STRING &&
+ cs->state & MY_CS_BINSORT)
+ return FALSE;
+ return TRUE;
}
}
return FALSE;
@@ -1548,13 +1553,9 @@ bool fix_partition_func(THD *thd, TABLE *table,
goto end;
}
}
- if (((part_info->pf_collation_allowed != PF_SAFE) &&
- check_part_func_collation(part_info->pf_collation_allowed,
- part_info->part_field_array)) ||
+ if ((check_part_func_fields(part_info->part_field_array)) ||
(part_info->is_sub_partitioned() &&
- part_info->spf_collation_allowed != PF_SAFE &&
- check_part_func_collation(part_info->spf_collation_allowed,
- part_info->subpart_field_array)))
+ check_part_func_fields(part_info->subpart_field_array)))
{
my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
goto end;