Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
eae8c963
Commit
eae8c963
authored
Jul 12, 2006
by
mikael/pappa@dator5.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge mronstrom@bk-internal.mysql.com:/home/bk/bugs/bug18198
into dator5.(none):/home/pappa/bug18198
parents
4e23f975
d6d6783b
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
309 additions
and
142 deletions
+309
-142
mysql-test/r/partition.result
mysql-test/r/partition.result
+1
-1
mysql-test/r/partition_error.result
mysql-test/r/partition_error.result
+17
-0
mysql-test/t/partition.test
mysql-test/t/partition.test
+1
-1
mysql-test/t/partition_error.test
mysql-test/t/partition_error.test
+22
-0
sql/item.h
sql/item.h
+43
-21
sql/item_cmpfunc.h
sql/item_cmpfunc.h
+24
-15
sql/item_func.h
sql/item_func.h
+36
-31
sql/item_strfunc.h
sql/item_strfunc.h
+40
-24
sql/item_timefunc.h
sql/item_timefunc.h
+32
-30
sql/item_xmlfunc.h
sql/item_xmlfunc.h
+2
-1
sql/partition_info.cc
sql/partition_info.cc
+26
-11
sql/partition_info.h
sql/partition_info.h
+7
-2
sql/sql_partition.cc
sql/sql_partition.cc
+47
-2
sql/sql_table.cc
sql/sql_table.cc
+2
-1
sql/sql_yacc.yy
sql/sql_yacc.yy
+9
-2
No files found.
mysql-test/r/partition.result
View file @
eae8c963
...
...
@@ -756,7 +756,7 @@ t2 CREATE TABLE `t2` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' /*!50100 PARTITION BY KEY (a) */
drop table t2;
create table t1 (s1 char(2) character set utf8)
partition by list (cas
e when s1 > 'cz' then 1 else 2 end
)
partition by list (cas
t(s1 as signed)
)
(partition p1 values in (1),
partition p2 values in (2));
drop table t1;
...
...
mysql-test/r/partition_error.result
View file @
eae8c963
drop table if exists t1;
create table t1 (a int)
partition by range (a)
(partition p0 values less than ((select count(*) from t1)));
ERROR HY000: This partition function is not allowed
create table t1 (a int)
partition by range (a)
(partition p0 values less than (a);
ERROR 42S22: Unknown column 'a' in 'partition function'
create table t1 (a int)
partition by range (a)
(partition p0 values less than (1));
alter table t1 add partition (partition p1 values less than (a));
ERROR 42S22: Unknown column 'a' in 'partition function'
alter table t1 add partition
(partition p1 values less than ((select count(*) from t1)));
ERROR HY000: This partition function is not allowed
drop table t1;
create table t1 (a int)
engine = x
partition by key (a);
Warnings:
...
...
mysql-test/t/partition.test
View file @
eae8c963
...
...
@@ -891,7 +891,7 @@ drop table t2;
# Bug#14367: Partitions: crash if utf8 column
#
create
table
t1
(
s1
char
(
2
)
character
set
utf8
)
partition
by
list
(
cas
e
when
s1
>
'cz'
then
1
else
2
end
)
partition
by
list
(
cas
t
(
s1
as
signed
)
)
(
partition
p1
values
in
(
1
),
partition
p2
values
in
(
2
));
drop
table
t1
;
...
...
mysql-test/t/partition_error.test
View file @
eae8c963
...
...
@@ -8,6 +8,28 @@
drop
table
if
exists
t1
;
--
enable_warnings
#
# Bug 18198: Partitions: Too flexible functions
#
--
error
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create
table
t1
(
a
int
)
partition
by
range
(
a
)
(
partition
p0
values
less
than
((
select
count
(
*
)
from
t1
)));
--
error
1054
create
table
t1
(
a
int
)
partition
by
range
(
a
)
(
partition
p0
values
less
than
(
a
);
create
table
t1
(
a
int
)
partition
by
range
(
a
)
(
partition
p0
values
less
than
(
1
));
--
error
1054
alter
table
t1
add
partition
(
partition
p1
values
less
than
(
a
));
--
error
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
alter
table
t1
add
partition
(
partition
p1
values
less
than
((
select
count
(
*
)
from
t1
)));
drop
table
t1
;
#
# Bug 20397: Partitions: Crash when using non-existing engine
#
...
...
sql/item.h
View file @
eae8c963
...
...
@@ -789,7 +789,7 @@ class Item {
Check if a partition function is allowed
SYNOPSIS
check_partition_func_processor()
bool
_arg Return argument
int
_arg Return argument
RETURN VALUE
0
DESCRIPTION
...
...
@@ -806,8 +806,28 @@ class Item {
whether this should be inherited to the new class. If not the function
below should be defined in the new Item class.
*/
virtual
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
*
(
bool
*
)
bool_arg
=
FALSE
;
return
0
;
}
#define PF_SAFE_BINARY_COLLATION 3
#define PF_SAFE_SINGLE_CHAR_COLLATION 2
#define PF_SAFE 1
#define PF_UNSAFE 0
bool
safe_for_binary_collation
(
byte
*
int_arg
)
{
if
(
*
(
int
*
)
int_arg
!=
PF_UNSAFE
)
*
(
int
*
)
int_arg
=
PF_SAFE_BINARY_COLLATION
;
return
0
;
}
bool
safe_for_single_char_collation
(
byte
*
int_arg
)
{
if
(
*
(
int
*
)
int_arg
==
PF_SAFE
)
*
(
int
*
)
int_arg
=
PF_SAFE_SINGLE_CHAR_COLLATION
;
return
0
;
}
virtual
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAFE
;
return
0
;
}
virtual
Item
*
equal_fields_propagator
(
byte
*
arg
)
{
return
this
;
}
virtual
Item
*
set_no_const_sub
(
byte
*
arg
)
{
return
this
;
}
...
...
@@ -1106,7 +1126,8 @@ class Item_name_const : public Item
Item
::
maybe_null
=
TRUE
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
bool
fix_fields
(
THD
*
,
Item
**
);
enum
Type
type
()
const
;
...
...
@@ -1153,7 +1174,7 @@ class Item_num: public Item
Item_num
()
{}
/* Remove gcc warning */
virtual
Item_num
*
neg
()
=
0
;
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
#define NO_CACHED_FIELD_INDEX ((uint)(-1))
...
...
@@ -1289,7 +1310,7 @@ class Item_field :public Item_ident
bool
collect_item_field_processor
(
byte
*
arg
);
bool
find_item_in_field_list_processor
(
byte
*
arg
);
bool
register_field_in_read_map
(
byte
*
arg
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;
}
void
cleanup
();
bool
result_as_longlong
()
{
...
...
@@ -1337,7 +1358,7 @@ class Item_null :public Item
bool
is_null
()
{
return
1
;
}
void
print
(
String
*
str
)
{
str
->
append
(
STRING_WITH_LEN
(
"NULL"
));
}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_null_result
:
public
Item_null
...
...
@@ -1350,8 +1371,8 @@ class Item_null_result :public Item_null
{
save_in_field
(
result_field
,
no_conversions
);
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
/* Item represents one placeholder ('?') of prepared statement */
...
...
@@ -1642,8 +1663,8 @@ class Item_static_float_func :public Item_float
{}
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
...
...
@@ -1721,7 +1742,7 @@ class Item_string :public Item
void
print
(
String
*
str
);
// to prevent drop fixed flag (no need parent cleanup call)
void
cleanup
()
{}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -1736,8 +1757,8 @@ class Item_static_string_func :public Item_string
{}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
...
...
@@ -1750,8 +1771,8 @@ class Item_datetime :public Item_string
&
my_charset_bin
)
{
max_length
=
19
;}
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_DATETIME
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
class
Item_empty_string
:
public
Item_string
...
...
@@ -1774,8 +1795,8 @@ class Item_return_int :public Item_int
unsigned_flag
=
1
;
}
enum_field_types
field_type
()
const
{
return
int_field_type
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
...
...
@@ -1799,7 +1820,8 @@ class Item_hex_string: public Item
void
cleanup
()
{}
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
virtual
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_binary_collation
(
int_arg
);}
};
...
...
@@ -2026,8 +2048,8 @@ class Item_int_with_ref :public Item_int
}
Item
*
new_item
();
virtual
Item
*
real_item
()
{
return
ref
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
#ifdef MYSQL_SERVER
...
...
sql/item_cmpfunc.h
View file @
eae8c963
...
...
@@ -240,7 +240,8 @@ class Item_bool_rowready_func2 :public Item_bool_func2
}
Item
*
neg_transformer
(
THD
*
thd
);
virtual
Item
*
negated_item
();
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
class
Item_func_not
:
public
Item_bool_func
...
...
@@ -251,7 +252,8 @@ class Item_func_not :public Item_bool_func
enum
Functype
functype
()
const
{
return
NOT_FUNC
;
}
const
char
*
func_name
()
const
{
return
"not"
;
}
Item
*
neg_transformer
(
THD
*
thd
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
class
Item_maxmin_subselect
;
...
...
@@ -466,7 +468,8 @@ class Item_func_between :public Item_func_opt_neg
bool
is_bool_func
()
{
return
1
;
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
uint
decimal_precision
()
const
{
return
1
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
@@ -478,7 +481,8 @@ class Item_func_strcmp :public Item_bool_func2
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"strcmp"
;
}
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
@@ -541,7 +545,7 @@ class Item_func_ifnull :public Item_func_coalesce
const
char
*
func_name
()
const
{
return
"ifnull"
;
}
Field
*
tmp_table_field
(
TABLE
*
table
);
uint
decimal_precision
()
const
;
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -582,7 +586,7 @@ class Item_func_nullif :public Item_bool_func2
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
table_map
not_null_tables
()
const
{
return
0
;
}
bool
is_null
();
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -625,7 +629,8 @@ class Item_func_case :public Item_func
void
print
(
String
*
str
);
Item
*
find_item
(
String
*
str
);
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
@@ -976,7 +981,8 @@ class Item_func_in :public Item_func_opt_neg
bool
nulls_in_row
();
bool
is_bool_func
()
{
return
1
;
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
/* Functions used by where clause */
...
...
@@ -1018,7 +1024,7 @@ class Item_func_isnull :public Item_bool_func
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NULL
;
}
Item
*
neg_transformer
(
THD
*
thd
);
CHARSET_INFO
*
compare_collation
()
{
return
args
[
0
]
->
collation
.
collation
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
/* Functions used by HAVING for rewriting IN subquery */
...
...
@@ -1040,8 +1046,8 @@ class Item_is_not_null_test :public Item_func_isnull
*/
table_map
used_tables
()
const
{
return
used_tables_cache
|
RAND_TABLE_BIT
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
...
...
@@ -1064,7 +1070,7 @@ class Item_func_isnotnull :public Item_bool_func
void
print
(
String
*
str
);
CHARSET_INFO
*
compare_collation
()
{
return
args
[
0
]
->
collation
.
collation
;
}
void
top_level_item
()
{
abort_on_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -1103,7 +1109,8 @@ class Item_func_like :public Item_bool_func2
const
char
*
func_name
()
const
{
return
"like"
;
}
bool
fix_fields
(
THD
*
thd
,
Item
**
ref
);
void
cleanup
();
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
#ifdef USE_REGEX
...
...
@@ -1126,7 +1133,8 @@ class Item_func_regex :public Item_bool_func
const
char
*
func_name
()
const
{
return
"regexp"
;
}
void
print
(
String
*
str
)
{
print_op
(
str
);
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
#else
...
...
@@ -1183,7 +1191,8 @@ class Item_cond :public Item_bool_func
Item
*
transform
(
Item_transformer
transformer
,
byte
*
arg
);
void
traverse_cond
(
Cond_traverser
,
void
*
arg
,
traverse_order
order
);
void
neg_arguments
(
THD
*
thd
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
sql/item_func.h
View file @
eae8c963
This diff is collapsed.
Click to expand it.
sql/item_strfunc.h
View file @
eae8c963
...
...
@@ -47,7 +47,8 @@ class Item_func_md5 :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"md5"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -58,7 +59,8 @@ class Item_func_sha :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"sha"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
class
Item_func_aes_encrypt
:
public
Item_str_func
...
...
@@ -89,7 +91,8 @@ class Item_func_concat :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"concat"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
class
Item_func_concat_ws
:
public
Item_str_func
...
...
@@ -110,7 +113,8 @@ class Item_func_reverse :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"reverse"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -148,7 +152,8 @@ class Item_str_conv :public Item_str_func
public:
Item_str_conv
(
Item
*
item
)
:
Item_str_func
(
item
)
{}
String
*
val_str
(
String
*
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_binary_collation
(
int_arg
);}
};
...
...
@@ -212,7 +217,8 @@ class Item_func_substr :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"substr"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -224,7 +230,8 @@ class Item_func_substr_index :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"substring_index"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -239,7 +246,8 @@ class Item_func_trim :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"trim"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -419,7 +427,8 @@ class Item_func_soundex :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"soundex"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -527,7 +536,8 @@ class Item_func_rpad :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"rpad"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -540,7 +550,8 @@ class Item_func_lpad :public Item_str_func
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"lpad"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -555,7 +566,8 @@ class Item_func_conv :public Item_str_func
collation
.
set
(
default_charset
());
max_length
=
64
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -572,7 +584,8 @@ class Item_func_hex :public Item_str_func
decimals
=
0
;
max_length
=
args
[
0
]
->
max_length
*
2
*
collation
.
collation
->
mbmaxlen
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_binary_collation
(
int_arg
);}
};
class
Item_func_unhex
:
public
Item_str_func
...
...
@@ -588,7 +601,8 @@ class Item_func_unhex :public Item_str_func
decimals
=
0
;
max_length
=
(
1
+
args
[
0
]
->
max_length
)
/
2
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_binary_collation
(
int_arg
);}
};
...
...
@@ -612,7 +626,8 @@ class Item_func_binary :public Item_str_func
}
void
print
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"cast_as_binary"
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
@@ -652,7 +667,7 @@ class Item_func_inet_ntoa : public Item_str_func
String
*
val_str
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"inet_ntoa"
;
}
void
fix_length_and_dec
()
{
decimals
=
0
;
max_length
=
3
*
8
+
7
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_quote
:
public
Item_str_func
...
...
@@ -667,7 +682,7 @@ class Item_func_quote :public Item_str_func
collation
.
set
(
args
[
0
]
->
collation
);
max_length
=
args
[
0
]
->
max_length
*
2
+
2
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_conv_charset
:
public
Item_str_func
...
...
@@ -711,7 +726,6 @@ class Item_func_conv_charset :public Item_str_func
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"convert"
;
}
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
};
class
Item_func_set_collation
:
public
Item_str_func
...
...
@@ -744,7 +758,6 @@ class Item_func_charset :public Item_str_func
maybe_null
=
0
;
};
table_map
not_null_tables
()
const
{
return
0
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
};
class
Item_func_collation
:
public
Item_str_func
...
...
@@ -760,7 +773,6 @@ class Item_func_collation :public Item_str_func
maybe_null
=
0
;
};
table_map
not_null_tables
()
const
{
return
0
;
}
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
};
class
Item_func_crc32
:
public
Item_int_func
...
...
@@ -771,7 +783,8 @@ class Item_func_crc32 :public Item_int_func
const
char
*
func_name
()
const
{
return
"crc32"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
longlong
val_int
();
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
class
Item_func_uncompressed_length
:
public
Item_int_func
...
...
@@ -782,7 +795,8 @@ class Item_func_uncompressed_length : public Item_int_func
const
char
*
func_name
()
const
{
return
"uncompressed_length"
;}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
longlong
val_int
();
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
#ifdef HAVE_COMPRESS
...
...
@@ -799,7 +813,8 @@ class Item_func_compress: public Item_str_func
void
fix_length_and_dec
(){
max_length
=
(
args
[
0
]
->
max_length
*
120
)
/
100
+
12
;}
const
char
*
func_name
()
const
{
return
"compress"
;}
String
*
val_str
(
String
*
)
ZLIB_DEPENDED_FUNCTION
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
class
Item_func_uncompress
:
public
Item_str_func
...
...
@@ -810,7 +825,8 @@ class Item_func_uncompress: public Item_str_func
void
fix_length_and_dec
(){
max_length
=
MAX_BLOB_WIDTH
;}
const
char
*
func_name
()
const
{
return
"uncompress"
;}
String
*
val_str
(
String
*
)
ZLIB_DEPENDED_FUNCTION
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)
...
...
sql/item_timefunc.h
View file @
eae8c963
...
...
@@ -39,7 +39,7 @@ class Item_func_period_add :public Item_int_func
{
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -54,7 +54,7 @@ class Item_func_period_diff :public Item_int_func
decimals
=
0
;
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -71,7 +71,7 @@ class Item_func_to_days :public Item_int_func
maybe_null
=
1
;
}
enum_monotonicity_info
get_monotonicity_info
()
const
;
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -87,7 +87,7 @@ class Item_func_dayofmonth :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -112,7 +112,7 @@ class Item_func_month :public Item_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -145,7 +145,7 @@ class Item_func_dayofyear :public Item_int_func
max_length
=
3
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -161,7 +161,7 @@ class Item_func_hour :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -177,7 +177,7 @@ class Item_func_minute :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -193,7 +193,7 @@ class Item_func_quarter :public Item_int_func
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -209,7 +209,7 @@ class Item_func_second :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -225,7 +225,7 @@ class Item_func_week :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_yearweek
:
public
Item_int_func
...
...
@@ -240,7 +240,7 @@ class Item_func_yearweek :public Item_int_func
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -257,7 +257,7 @@ class Item_func_year :public Item_int_func
max_length
=
4
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -287,7 +287,7 @@ class Item_func_weekday :public Item_func
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_dayname
:
public
Item_func_weekday
...
...
@@ -320,7 +320,7 @@ class Item_func_unix_timestamp :public Item_int_func
decimals
=
0
;
max_length
=
10
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -335,7 +335,7 @@ class Item_func_time_to_sec :public Item_int_func
decimals
=
0
;
max_length
=
10
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -545,7 +545,7 @@ class Item_func_from_days :public Item_date
Item_func_from_days
(
Item
*
a
)
:
Item_date
(
a
)
{}
const
char
*
func_name
()
const
{
return
"from_days"
;
}
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -563,7 +563,7 @@ class Item_func_date_format :public Item_str_func
void
fix_length_and_dec
();
uint
format_length
(
const
String
*
format
);
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -582,7 +582,7 @@ class Item_func_from_unixtime :public Item_date_func
const
char
*
func_name
()
const
{
return
"from_unixtime"
;
}
void
fix_length_and_dec
();
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -651,7 +651,7 @@ class Item_func_sec_to_time :public Item_str_func
return
tmp_table_field_from_field_type
(
table
,
0
);
}
bool
result_as_longlong
()
{
return
TRUE
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -674,7 +674,7 @@ class Item_date_add_interval :public Item_date_func
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -692,7 +692,8 @@ class Item_extract :public Item_int_func
void
fix_length_and_dec
();
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
@@ -729,7 +730,7 @@ class Item_typecast_maybe_null :public Item_typecast
max_length
=
args
[
0
]
->
max_length
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -749,7 +750,8 @@ class Item_char_typecast :public Item_typecast
String
*
val_str
(
String
*
a
);
void
fix_length_and_dec
();
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);
}
};
...
...
@@ -829,7 +831,7 @@ class Item_func_makedate :public Item_str_func
}
bool
result_as_longlong
()
{
return
TRUE
;
}
longlong
val_int
();
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -852,7 +854,7 @@ class Item_func_add_time :public Item_str_func
}
void
print
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"add_time"
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_timediff
:
public
Item_str_func
...
...
@@ -892,7 +894,7 @@ class Item_func_maketime :public Item_str_func
{
return
tmp_table_field_from_field_type
(
table
,
0
);
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
class
Item_func_microsecond
:
public
Item_int_func
...
...
@@ -906,7 +908,7 @@ class Item_func_microsecond :public Item_int_func
decimals
=
0
;
maybe_null
=
1
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -924,7 +926,7 @@ class Item_func_timestamp_diff :public Item_int_func
maybe_null
=
1
;
}
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
@@ -971,7 +973,7 @@ class Item_func_str_to_date :public Item_str_func
{
return
tmp_table_field_from_field_type
(
table
,
1
);
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
return
0
;}
};
...
...
sql/item_xmlfunc.h
View file @
eae8c963
...
...
@@ -42,7 +42,8 @@ class Item_func_xml_extractvalue: public Item_xml_str_func
Item_func_xml_extractvalue
(
Item
*
a
,
Item
*
b
)
:
Item_xml_str_func
(
a
,
b
)
{}
const
char
*
func_name
()
const
{
return
"extractvalue"
;
}
String
*
val_str
(
String
*
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
bool
check_partition_func_processor
(
byte
*
int_arg
)
{
return
safe_for_single_char_collation
(
int_arg
);}
};
...
...
sql/partition_info.cc
View file @
eae8c963
...
...
@@ -695,6 +695,7 @@ bool partition_info::check_list_constants()
file A reference to a handler of the table
info Create info
engine_type Return value for used engine in partitions
check_partition_function Should we check the partition function
RETURN VALUE
TRUE Error, something went wrong
...
...
@@ -709,26 +710,40 @@ bool partition_info::check_list_constants()
*/
bool
partition_info
::
check_partition_info
(
THD
*
thd
,
handlerton
**
eng_type
,
handler
*
file
,
HA_CREATE_INFO
*
info
)
handler
*
file
,
HA_CREATE_INFO
*
info
,
bool
check_partition_function
)
{
handlerton
**
engine_array
=
NULL
;
uint
part_count
=
0
;
uint
i
,
tot_partitions
;
bool
result
=
TRUE
;
char
*
same_name
;
bool
part_expression_ok
=
TRU
E
;
int
part_expression_ok
=
PF_SAF
E
;
DBUG_ENTER
(
"partition_info::check_partition_info"
);
if
(
part_type
!=
HASH_PARTITION
||
!
list_of_part_fields
)
part_expr
->
walk
(
&
Item
::
check_partition_func_processor
,
0
,
(
byte
*
)(
&
part_expression_ok
));
if
(
is_sub_partitioned
()
&&
!
list_of_subpart_fields
)
subpart_expr
->
walk
(
&
Item
::
check_partition_func_processor
,
0
,
(
byte
*
)(
&
part_expression_ok
));
if
(
!
part_expression_ok
)
pf_collation_allowed
=
PF_SAFE
;
spf_collation_allowed
=
PF_SAFE
;
if
(
check_partition_function
)
{
my_error
(
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
,
MYF
(
0
));
goto
end
;
if
(
part_type
!=
HASH_PARTITION
||
!
list_of_part_fields
)
{
part_expr
->
walk
(
&
Item
::
check_partition_func_processor
,
0
,
(
byte
*
)(
&
part_expression_ok
));
pf_collation_allowed
=
(
char
)
part_expression_ok
;
part_expression_ok
=
PF_SAFE
;
if
(
is_sub_partitioned
()
&&
!
list_of_subpart_fields
)
{
subpart_expr
->
walk
(
&
Item
::
check_partition_func_processor
,
0
,
(
byte
*
)(
&
part_expression_ok
));
}
spf_collation_allowed
=
(
char
)
part_expression_ok
;
}
if
(
!
pf_collation_allowed
||
!
spf_collation_allowed
)
{
my_error
(
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
,
MYF
(
0
));
goto
end
;
}
}
if
(
unlikely
(
!
is_sub_partitioned
()
&&
!
(
use_default_subpartitions
&&
use_default_no_subpartitions
)))
...
...
sql/partition_info.h
View file @
eae8c963
...
...
@@ -188,6 +188,8 @@ class partition_info : public Sql_alloc
bool
is_auto_partitioned
;
bool
from_openfrm
;
bool
has_null_value
;
char
pf_collation_allowed
;
char
spf_collation_allowed
;
partition_info
()
...
...
@@ -217,7 +219,9 @@ class partition_info : public Sql_alloc
list_of_part_fields
(
FALSE
),
list_of_subpart_fields
(
FALSE
),
linear_hash_ind
(
FALSE
),
fixed
(
FALSE
),
is_auto_partitioned
(
FALSE
),
from_openfrm
(
FALSE
),
has_null_value
(
FALSE
)
has_null_value
(
FALSE
),
pf_collation_allowed
(
0
),
spf_collation_allowed
(
0
)
{
all_fields_in_PF
.
clear_all
();
all_fields_in_PPF
.
clear_all
();
...
...
@@ -250,7 +254,8 @@ class partition_info : public Sql_alloc
bool
check_range_constants
();
bool
check_list_constants
();
bool
check_partition_info
(
THD
*
thd
,
handlerton
**
eng_type
,
handler
*
file
,
HA_CREATE_INFO
*
info
);
handler
*
file
,
HA_CREATE_INFO
*
info
,
bool
check_partition_function
);
void
print_no_partition_found
(
TABLE
*
table
);
private:
static
int
list_part_cmp
(
const
void
*
a
,
const
void
*
b
);
...
...
sql/sql_partition.cc
View file @
eae8c963
...
...
@@ -525,6 +525,7 @@ static bool set_up_field_array(TABLE *table,
}
/*
Create a field array including all fields of both the partitioning and the
subpartitioning functions.
...
...
@@ -549,6 +550,7 @@ static bool create_full_part_field_array(TABLE *table,
partition_info
*
part_info
)
{
bool
result
=
FALSE
;
Field
**
ptr
;
DBUG_ENTER
(
"create_full_part_field_array"
);
if
(
!
part_info
->
is_sub_partitioned
())
...
...
@@ -558,7 +560,7 @@ static bool create_full_part_field_array(TABLE *table,
}
else
{
Field
*
*
ptr
,
*
field
,
**
field_array
;
Field
*
field
,
**
field_array
;
uint
no_part_fields
=
0
,
size_field_array
;
ptr
=
table
->
field
;
while
((
field
=
*
(
ptr
++
)))
...
...
@@ -1369,6 +1371,38 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
return
part_id
;
}
/*
Check that partition function do not contain any forbidden
character sets and collations.
SYNOPSIS
check_part_func_collation()
part_info Partition info
ptr Array of Field pointers
RETURN VALUES
FALSE Success
TRUE Error
*/
static
bool
check_part_func_collation
(
int
collation_allowed
,
Field
**
ptr
)
{
Field
*
field
;
while
((
field
=
*
(
ptr
++
)))
{
if
(
field
->
result_type
()
==
STRING_RESULT
)
{
CHARSET_INFO
*
cs
=
((
Field_str
*
)
field
)
->
charset
();
if
(
use_strnxfrm
(
cs
)
||
(
collation_allowed
==
PF_SAFE_BINARY_COLLATION
&&
(
!
(
cs
->
state
&
MY_CS_BINSORT
))))
return
TRUE
;
}
}
return
FALSE
;
}
/*
fix partition functions
...
...
@@ -1514,6 +1548,17 @@ 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
))
||
(
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
)))
{
my_error
(
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
,
MYF
(
0
));
goto
end
;
}
if
(
unlikely
(
create_full_part_field_array
(
table
,
part_info
)))
goto
end
;
if
(
unlikely
(
check_primary_key
(
table
)))
...
...
@@ -4533,7 +4578,7 @@ the generated partition syntax in a correct manner.
tab_part_info
->
use_default_no_subpartitions
=
FALSE
;
}
if
(
tab_part_info
->
check_partition_info
(
thd
,
(
handlerton
**
)
NULL
,
table
->
file
,
ULL
(
0
)))
table
->
file
,
ULL
(
0
)
,
FALSE
))
{
DBUG_RETURN
(
TRUE
);
}
...
...
sql/sql_table.cc
View file @
eae8c963
...
...
@@ -3185,7 +3185,8 @@ bool mysql_create_table_internal(THD *thd,
}
DBUG_PRINT
(
"info"
,
(
"db_type = %d"
,
ha_legacy_type
(
part_info
->
default_engine_type
)));
if
(
part_info
->
check_partition_info
(
thd
,
&
engine_type
,
file
,
create_info
))
if
(
part_info
->
check_partition_info
(
thd
,
&
engine_type
,
file
,
create_info
,
TRUE
))
goto
err
;
part_info
->
default_engine_type
=
engine_type
;
...
...
sql/sql_yacc.yy
View file @
eae8c963
...
...
@@ -3619,6 +3619,7 @@ part_bit_expr:
{
Item *part_expr= $1;
bool not_corr_func;
bool part_expression_ok= TRUE;
LEX *lex= Lex;
THD *thd= YYTHD;
longlong item_value;
...
...
@@ -3636,13 +3637,19 @@ part_bit_expr:
mem_alloc_error(sizeof(part_elem_value));
YYABORT;
}
part_expr->walk(&Item::check_partition_func_processor, 0,
(byte*)(&part_expression_ok));
if (!part_expression_ok)
{
my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
YYABORT;
}
if (part_expr->fix_fields(YYTHD, (Item**)0) ||
((context->table_list= save_list), FALSE) ||
(!part_expr->const_item()) ||
(!lex->safe_to_cache_query))
{
yyerror(ER(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
));
my_error(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR, MYF(0
));
YYABORT;
}
thd->where= save_where;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment