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` (
...
@@ -756,7 +756,7 @@ t2 CREATE TABLE `t2` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' /*!50100 PARTITION BY KEY (a) */
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' /*!50100 PARTITION BY KEY (a) */
drop table t2;
drop table t2;
create table t1 (s1 char(2) character set utf8)
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 p1 values in (1),
partition p2 values in (2));
partition p2 values in (2));
drop table t1;
drop table t1;
...
...
mysql-test/r/partition_error.result
View file @
eae8c963
drop table if exists t1;
drop table if exists t1;
create table t1 (a int)
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
engine = x
partition by key (a);
partition by key (a);
Warnings:
Warnings:
...
...
mysql-test/t/partition.test
View file @
eae8c963
...
@@ -891,7 +891,7 @@ drop table t2;
...
@@ -891,7 +891,7 @@ drop table t2;
# Bug#14367: Partitions: crash if utf8 column
# Bug#14367: Partitions: crash if utf8 column
#
#
create
table
t1
(
s1
char
(
2
)
character
set
utf8
)
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
p1
values
in
(
1
),
partition
p2
values
in
(
2
));
partition
p2
values
in
(
2
));
drop
table
t1
;
drop
table
t1
;
...
...
mysql-test/t/partition_error.test
View file @
eae8c963
...
@@ -8,6 +8,28 @@
...
@@ -8,6 +8,28 @@
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
--
enable_warnings
--
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
# Bug 20397: Partitions: Crash when using non-existing engine
#
#
...
...
sql/item.h
View file @
eae8c963
...
@@ -789,7 +789,7 @@ class Item {
...
@@ -789,7 +789,7 @@ class Item {
Check if a partition function is allowed
Check if a partition function is allowed
SYNOPSIS
SYNOPSIS
check_partition_func_processor()
check_partition_func_processor()
bool
_arg Return argument
int
_arg Return argument
RETURN VALUE
RETURN VALUE
0
0
DESCRIPTION
DESCRIPTION
...
@@ -806,8 +806,28 @@ class Item {
...
@@ -806,8 +806,28 @@ class Item {
whether this should be inherited to the new class. If not the function
whether this should be inherited to the new class. If not the function
below should be defined in the new Item class.
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
*
equal_fields_propagator
(
byte
*
arg
)
{
return
this
;
}
virtual
Item
*
set_no_const_sub
(
byte
*
arg
)
{
return
this
;
}
virtual
Item
*
set_no_const_sub
(
byte
*
arg
)
{
return
this
;
}
...
@@ -1106,7 +1126,8 @@ class Item_name_const : public Item
...
@@ -1106,7 +1126,8 @@ class Item_name_const : public Item
Item
::
maybe_null
=
TRUE
;
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
**
);
bool
fix_fields
(
THD
*
,
Item
**
);
enum
Type
type
()
const
;
enum
Type
type
()
const
;
...
@@ -1153,7 +1174,7 @@ class Item_num: public Item
...
@@ -1153,7 +1174,7 @@ class Item_num: public Item
Item_num
()
{}
/* Remove gcc warning */
Item_num
()
{}
/* Remove gcc warning */
virtual
Item_num
*
neg
()
=
0
;
virtual
Item_num
*
neg
()
=
0
;
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
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))
#define NO_CACHED_FIELD_INDEX ((uint)(-1))
...
@@ -1289,7 +1310,7 @@ class Item_field :public Item_ident
...
@@ -1289,7 +1310,7 @@ class Item_field :public Item_ident
bool
collect_item_field_processor
(
byte
*
arg
);
bool
collect_item_field_processor
(
byte
*
arg
);
bool
find_item_in_field_list_processor
(
byte
*
arg
);
bool
find_item_in_field_list_processor
(
byte
*
arg
);
bool
register_field_in_read_map
(
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
();
void
cleanup
();
bool
result_as_longlong
()
bool
result_as_longlong
()
{
{
...
@@ -1337,7 +1358,7 @@ class Item_null :public Item
...
@@ -1337,7 +1358,7 @@ class Item_null :public Item
bool
is_null
()
{
return
1
;
}
bool
is_null
()
{
return
1
;
}
void
print
(
String
*
str
)
{
str
->
append
(
STRING_WITH_LEN
(
"NULL"
));
}
void
print
(
String
*
str
)
{
str
->
append
(
STRING_WITH_LEN
(
"NULL"
));
}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
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
class
Item_null_result
:
public
Item_null
...
@@ -1350,8 +1371,8 @@ 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
);
save_in_field
(
result_field
,
no_conversions
);
}
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
/* Item represents one placeholder ('?') of prepared statement */
/* Item represents one placeholder ('?') of prepared statement */
...
@@ -1642,8 +1663,8 @@ class Item_static_float_func :public Item_float
...
@@ -1642,8 +1663,8 @@ class Item_static_float_func :public Item_float
{}
{}
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
...
@@ -1721,7 +1742,7 @@ class Item_string :public Item
...
@@ -1721,7 +1742,7 @@ class Item_string :public Item
void
print
(
String
*
str
);
void
print
(
String
*
str
);
// to prevent drop fixed flag (no need parent cleanup call)
// to prevent drop fixed flag (no need parent cleanup call)
void
cleanup
()
{}
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
...
@@ -1736,8 +1757,8 @@ class Item_static_string_func :public Item_string
{}
{}
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
void
print
(
String
*
str
)
{
str
->
append
(
func_name
);
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
...
@@ -1750,8 +1771,8 @@ class Item_datetime :public Item_string
...
@@ -1750,8 +1771,8 @@ class Item_datetime :public Item_string
&
my_charset_bin
)
&
my_charset_bin
)
{
max_length
=
19
;}
{
max_length
=
19
;}
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_DATETIME
;
}
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_DATETIME
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
class
Item_empty_string
:
public
Item_string
class
Item_empty_string
:
public
Item_string
...
@@ -1774,8 +1795,8 @@ class Item_return_int :public Item_int
...
@@ -1774,8 +1795,8 @@ class Item_return_int :public Item_int
unsigned_flag
=
1
;
unsigned_flag
=
1
;
}
}
enum_field_types
field_type
()
const
{
return
int_field_type
;
}
enum_field_types
field_type
()
const
{
return
int_field_type
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
...
@@ -1799,7 +1820,8 @@ class Item_hex_string: public Item
...
@@ -1799,7 +1820,8 @@ class Item_hex_string: public Item
void
cleanup
()
{}
void
cleanup
()
{}
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
virtual
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
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
...
@@ -2026,8 +2048,8 @@ class Item_int_with_ref :public Item_int
}
}
Item
*
new_item
();
Item
*
new_item
();
virtual
Item
*
real_item
()
{
return
ref
;
}
virtual
Item
*
real_item
()
{
return
ref
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
#ifdef MYSQL_SERVER
#ifdef MYSQL_SERVER
...
...
sql/item_cmpfunc.h
View file @
eae8c963
...
@@ -240,7 +240,8 @@ class Item_bool_rowready_func2 :public Item_bool_func2
...
@@ -240,7 +240,8 @@ class Item_bool_rowready_func2 :public Item_bool_func2
}
}
Item
*
neg_transformer
(
THD
*
thd
);
Item
*
neg_transformer
(
THD
*
thd
);
virtual
Item
*
negated_item
();
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
class
Item_func_not
:
public
Item_bool_func
...
@@ -251,7 +252,8 @@ 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
;
}
enum
Functype
functype
()
const
{
return
NOT_FUNC
;
}
const
char
*
func_name
()
const
{
return
"not"
;
}
const
char
*
func_name
()
const
{
return
"not"
;
}
Item
*
neg_transformer
(
THD
*
thd
);
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
;
class
Item_maxmin_subselect
;
...
@@ -466,7 +468,8 @@ class Item_func_between :public Item_func_opt_neg
...
@@ -466,7 +468,8 @@ class Item_func_between :public Item_func_opt_neg
bool
is_bool_func
()
{
return
1
;
}
bool
is_bool_func
()
{
return
1
;
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
uint
decimal_precision
()
const
{
return
1
;
}
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
...
@@ -478,7 +481,8 @@ class Item_func_strcmp :public Item_bool_func2
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"strcmp"
;
}
const
char
*
func_name
()
const
{
return
"strcmp"
;
}
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
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
...
@@ -541,7 +545,7 @@ class Item_func_ifnull :public Item_func_coalesce
const
char
*
func_name
()
const
{
return
"ifnull"
;
}
const
char
*
func_name
()
const
{
return
"ifnull"
;
}
Field
*
tmp_table_field
(
TABLE
*
table
);
Field
*
tmp_table_field
(
TABLE
*
table
);
uint
decimal_precision
()
const
;
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
...
@@ -582,7 +586,7 @@ class Item_func_nullif :public Item_bool_func2
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
table_map
not_null_tables
()
const
{
return
0
;
}
table_map
not_null_tables
()
const
{
return
0
;
}
bool
is_null
();
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
...
@@ -625,7 +629,8 @@ class Item_func_case :public Item_func
void
print
(
String
*
str
);
void
print
(
String
*
str
);
Item
*
find_item
(
String
*
str
);
Item
*
find_item
(
String
*
str
);
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
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
...
@@ -976,7 +981,8 @@ class Item_func_in :public Item_func_opt_neg
bool
nulls_in_row
();
bool
nulls_in_row
();
bool
is_bool_func
()
{
return
1
;
}
bool
is_bool_func
()
{
return
1
;
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
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 */
/* Functions used by where clause */
...
@@ -1018,7 +1024,7 @@ class Item_func_isnull :public Item_bool_func
...
@@ -1018,7 +1024,7 @@ class Item_func_isnull :public Item_bool_func
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NULL
;
}
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NULL
;
}
Item
*
neg_transformer
(
THD
*
thd
);
Item
*
neg_transformer
(
THD
*
thd
);
CHARSET_INFO
*
compare_collation
()
{
return
args
[
0
]
->
collation
.
collation
;
}
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 */
/* Functions used by HAVING for rewriting IN subquery */
...
@@ -1040,8 +1046,8 @@ class Item_is_not_null_test :public Item_func_isnull
...
@@ -1040,8 +1046,8 @@ class Item_is_not_null_test :public Item_func_isnull
*/
*/
table_map
used_tables
()
const
table_map
used_tables
()
const
{
return
used_tables_cache
|
RAND_TABLE_BIT
;
}
{
return
used_tables_cache
|
RAND_TABLE_BIT
;
}
bool
check_partition_func_processor
(
byte
*
bool
_arg
)
bool
check_partition_func_processor
(
byte
*
int
_arg
)
{
*
(
bool
*
)
bool_arg
=
FALS
E
;
return
0
;
}
{
*
(
int
*
)
int_arg
=
PF_UNSAF
E
;
return
0
;
}
};
};
...
@@ -1064,7 +1070,7 @@ class Item_func_isnotnull :public Item_bool_func
...
@@ -1064,7 +1070,7 @@ class Item_func_isnotnull :public Item_bool_func
void
print
(
String
*
str
);
void
print
(
String
*
str
);
CHARSET_INFO
*
compare_collation
()
{
return
args
[
0
]
->
collation
.
collation
;
}
CHARSET_INFO
*
compare_collation
()
{
return
args
[
0
]
->
collation
.
collation
;
}
void
top_level_item
()
{
abort_on_null
=
1
;
}
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
...
@@ -1103,7 +1109,8 @@ class Item_func_like :public Item_bool_func2
const
char
*
func_name
()
const
{
return
"like"
;
}
const
char
*
func_name
()
const
{
return
"like"
;
}
bool
fix_fields
(
THD
*
thd
,
Item
**
ref
);
bool
fix_fields
(
THD
*
thd
,
Item
**
ref
);
void
cleanup
();
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
#ifdef USE_REGEX
...
@@ -1126,7 +1133,8 @@ class Item_func_regex :public Item_bool_func
...
@@ -1126,7 +1133,8 @@ class Item_func_regex :public Item_bool_func
const
char
*
func_name
()
const
{
return
"regexp"
;
}
const
char
*
func_name
()
const
{
return
"regexp"
;
}
void
print
(
String
*
str
)
{
print_op
(
str
);
}
void
print
(
String
*
str
)
{
print_op
(
str
);
}
CHARSET_INFO
*
compare_collation
()
{
return
cmp_collation
.
collation
;
}
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
#else
...
@@ -1183,7 +1191,8 @@ class Item_cond :public Item_bool_func
...
@@ -1183,7 +1191,8 @@ class Item_cond :public Item_bool_func
Item
*
transform
(
Item_transformer
transformer
,
byte
*
arg
);
Item
*
transform
(
Item_transformer
transformer
,
byte
*
arg
);
void
traverse_cond
(
Cond_traverser
,
void
*
arg
,
traverse_order
order
);
void
traverse_cond
(
Cond_traverser
,
void
*
arg
,
traverse_order
order
);
void
neg_arguments
(
THD
*
thd
);
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
...
@@ -47,7 +47,8 @@ class Item_func_md5 :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"md5"
;
}
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
...
@@ -58,7 +59,8 @@ class Item_func_sha :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"sha"
;
}
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
class
Item_func_aes_encrypt
:
public
Item_str_func
...
@@ -89,7 +91,8 @@ class Item_func_concat :public Item_str_func
...
@@ -89,7 +91,8 @@ class Item_func_concat :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"concat"
;
}
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
class
Item_func_concat_ws
:
public
Item_str_func
...
@@ -110,7 +113,8 @@ class Item_func_reverse :public Item_str_func
...
@@ -110,7 +113,8 @@ class Item_func_reverse :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"reverse"
;
}
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
...
@@ -148,7 +152,8 @@ class Item_str_conv :public Item_str_func
public:
public:
Item_str_conv
(
Item
*
item
)
:
Item_str_func
(
item
)
{}
Item_str_conv
(
Item
*
item
)
:
Item_str_func
(
item
)
{}
String
*
val_str
(
String
*
);
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
...
@@ -212,7 +217,8 @@ class Item_func_substr :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"substr"
;
}
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
...
@@ -224,7 +230,8 @@ class Item_func_substr_index :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"substring_index"
;
}
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
...
@@ -239,7 +246,8 @@ class Item_func_trim :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"trim"
;
}
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
...
@@ -419,7 +427,8 @@ class Item_func_soundex :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"soundex"
;
}
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
...
@@ -527,7 +536,8 @@ class Item_func_rpad :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"rpad"
;
}
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
...
@@ -540,7 +550,8 @@ class Item_func_lpad :public Item_str_func
String
*
val_str
(
String
*
);
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"lpad"
;
}
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
...
@@ -555,7 +566,8 @@ class Item_func_conv :public Item_str_func
collation
.
set
(
default_charset
());
collation
.
set
(
default_charset
());
max_length
=
64
;
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
...
@@ -572,7 +584,8 @@ class Item_func_hex :public Item_str_func
decimals
=
0
;
decimals
=
0
;
max_length
=
args
[
0
]
->
max_length
*
2
*
collation
.
collation
->
mbmaxlen
;
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
class
Item_func_unhex
:
public
Item_str_func
...
@@ -588,7 +601,8 @@ class Item_func_unhex :public Item_str_func
...
@@ -588,7 +601,8 @@ class Item_func_unhex :public Item_str_func
decimals
=
0
;
decimals
=
0
;
max_length
=
(
1
+
args
[
0
]
->
max_length
)
/
2
;
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
...
@@ -612,7 +626,8 @@ class Item_func_binary :public Item_str_func
}
}
void
print
(
String
*
str
);
void
print
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"cast_as_binary"
;
}
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
...
@@ -652,7 +667,7 @@ class Item_func_inet_ntoa : public Item_str_func
String
*
val_str
(
String
*
str
);
String
*
val_str
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"inet_ntoa"
;
}
const
char
*
func_name
()
const
{
return
"inet_ntoa"
;
}
void
fix_length_and_dec
()
{
decimals
=
0
;
max_length
=
3
*
8
+
7
;
}
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
class
Item_func_quote
:
public
Item_str_func
...
@@ -667,7 +682,7 @@ 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
);
collation
.
set
(
args
[
0
]
->
collation
);
max_length
=
args
[
0
]
->
max_length
*
2
+
2
;
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
class
Item_func_conv_charset
:
public
Item_str_func
...
@@ -711,7 +726,6 @@ 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
();
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"convert"
;
}
const
char
*
func_name
()
const
{
return
"convert"
;
}
void
print
(
String
*
str
);
void
print
(
String
*
str
);
bool
check_partition_func_processor
(
byte
*
bool_arg
)
{
return
0
;}
};
};
class
Item_func_set_collation
:
public
Item_str_func
class
Item_func_set_collation
:
public
Item_str_func
...
@@ -744,7 +758,6 @@ class Item_func_charset :public Item_str_func
...
@@ -744,7 +758,6 @@ class Item_func_charset :public Item_str_func
maybe_null
=
0
;
maybe_null
=
0
;
};
};
table_map
not_null_tables
()
const
{
return
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
class
Item_func_collation
:
public
Item_str_func
...
@@ -760,7 +773,6 @@ class Item_func_collation :public Item_str_func
...
@@ -760,7 +773,6 @@ class Item_func_collation :public Item_str_func
maybe_null
=
0
;
maybe_null
=
0
;
};
};
table_map
not_null_tables
()
const
{
return
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
class
Item_func_crc32
:
public
Item_int_func
...
@@ -771,7 +783,8 @@ 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"
;
}
const
char
*
func_name
()
const
{
return
"crc32"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
longlong
val_int
();
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
class
Item_func_uncompressed_length
:
public
Item_int_func
...
@@ -782,7 +795,8 @@ 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"
;}
const
char
*
func_name
()
const
{
return
"uncompressed_length"
;}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
longlong
val_int
();
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
#ifdef HAVE_COMPRESS
...
@@ -799,7 +813,8 @@ class Item_func_compress: public Item_str_func
...
@@ -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
;}
void
fix_length_and_dec
(){
max_length
=
(
args
[
0
]
->
max_length
*
120
)
/
100
+
12
;}
const
char
*
func_name
()
const
{
return
"compress"
;}
const
char
*
func_name
()
const
{
return
"compress"
;}
String
*
val_str
(
String
*
)
ZLIB_DEPENDED_FUNCTION
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
class
Item_func_uncompress
:
public
Item_str_func
...
@@ -810,7 +825,8 @@ 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
;}
void
fix_length_and_dec
(){
max_length
=
MAX_BLOB_WIDTH
;}
const
char
*
func_name
()
const
{
return
"uncompress"
;}
const
char
*
func_name
()
const
{
return
"uncompress"
;}
String
*
val_str
(
String
*
)
ZLIB_DEPENDED_FUNCTION
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)
#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
...
@@ -39,7 +39,7 @@ class Item_func_period_add :public Item_int_func
{
{
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
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
...
@@ -54,7 +54,7 @@ class Item_func_period_diff :public Item_int_func
decimals
=
0
;
decimals
=
0
;
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
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
...
@@ -71,7 +71,7 @@ class Item_func_to_days :public Item_int_func
maybe_null
=
1
;
maybe_null
=
1
;
}
}
enum_monotonicity_info
get_monotonicity_info
()
const
;
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
...
@@ -87,7 +87,7 @@ class Item_func_dayofmonth :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -112,7 +112,7 @@ class Item_func_month :public Item_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -145,7 +145,7 @@ class Item_func_dayofyear :public Item_int_func
max_length
=
3
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
3
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -161,7 +161,7 @@ class Item_func_hour :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -177,7 +177,7 @@ class Item_func_minute :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -193,7 +193,7 @@ class Item_func_quarter :public Item_int_func
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -209,7 +209,7 @@ class Item_func_second :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -225,7 +225,7 @@ class Item_func_week :public Item_int_func
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
2
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
class
Item_func_yearweek
:
public
Item_int_func
...
@@ -240,7 +240,7 @@ 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
;
max_length
=
6
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -257,7 +257,7 @@ class Item_func_year :public Item_int_func
max_length
=
4
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
4
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
...
@@ -287,7 +287,7 @@ class Item_func_weekday :public Item_func
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
max_length
=
1
*
MY_CHARSET_BIN_MB_MAXLEN
;
maybe_null
=
1
;
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
class
Item_func_dayname
:
public
Item_func_weekday
...
@@ -320,7 +320,7 @@ class Item_func_unix_timestamp :public Item_int_func
...
@@ -320,7 +320,7 @@ class Item_func_unix_timestamp :public Item_int_func
decimals
=
0
;
decimals
=
0
;
max_length
=
10
*
MY_CHARSET_BIN_MB_MAXLEN
;
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
...
@@ -335,7 +335,7 @@ class Item_func_time_to_sec :public Item_int_func
decimals
=
0
;
decimals
=
0
;
max_length
=
10
*
MY_CHARSET_BIN_MB_MAXLEN
;
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
...
@@ -545,7 +545,7 @@ class Item_func_from_days :public Item_date
Item_func_from_days
(
Item
*
a
)
:
Item_date
(
a
)
{}
Item_func_from_days
(
Item
*
a
)
:
Item_date
(
a
)
{}
const
char
*
func_name
()
const
{
return
"from_days"
;
}
const
char
*
func_name
()
const
{
return
"from_days"
;
}
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
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
...
@@ -563,7 +563,7 @@ class Item_func_date_format :public Item_str_func
void
fix_length_and_dec
();
void
fix_length_and_dec
();
uint
format_length
(
const
String
*
format
);
uint
format_length
(
const
String
*
format
);
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
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
...
@@ -582,7 +582,7 @@ class Item_func_from_unixtime :public Item_date_func
const
char
*
func_name
()
const
{
return
"from_unixtime"
;
}
const
char
*
func_name
()
const
{
return
"from_unixtime"
;
}
void
fix_length_and_dec
();
void
fix_length_and_dec
();
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
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
...
@@ -651,7 +651,7 @@ class Item_func_sec_to_time :public Item_str_func
return
tmp_table_field_from_field_type
(
table
,
0
);
return
tmp_table_field_from_field_type
(
table
,
0
);
}
}
bool
result_as_longlong
()
{
return
TRUE
;
}
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
...
@@ -674,7 +674,7 @@ class Item_date_add_interval :public Item_date_func
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
bool
get_date
(
TIME
*
res
,
uint
fuzzy_date
);
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
void
print
(
String
*
str
);
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
...
@@ -692,7 +692,8 @@ class Item_extract :public Item_int_func
void
fix_length_and_dec
();
void
fix_length_and_dec
();
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
bool
eq
(
const
Item
*
item
,
bool
binary_cmp
)
const
;
void
print
(
String
*
str
);
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
...
@@ -729,7 +730,7 @@ class Item_typecast_maybe_null :public Item_typecast
max_length
=
args
[
0
]
->
max_length
;
max_length
=
args
[
0
]
->
max_length
;
maybe_null
=
1
;
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
...
@@ -749,7 +750,8 @@ class Item_char_typecast :public Item_typecast
String
*
val_str
(
String
*
a
);
String
*
val_str
(
String
*
a
);
void
fix_length_and_dec
();
void
fix_length_and_dec
();
void
print
(
String
*
str
);
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
...
@@ -829,7 +831,7 @@ class Item_func_makedate :public Item_str_func
}
}
bool
result_as_longlong
()
{
return
TRUE
;
}
bool
result_as_longlong
()
{
return
TRUE
;
}
longlong
val_int
();
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
...
@@ -852,7 +854,7 @@ class Item_func_add_time :public Item_str_func
}
}
void
print
(
String
*
str
);
void
print
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"add_time"
;
}
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
class
Item_func_timediff
:
public
Item_str_func
...
@@ -892,7 +894,7 @@ class Item_func_maketime :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
);
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
class
Item_func_microsecond
:
public
Item_int_func
...
@@ -906,7 +908,7 @@ class Item_func_microsecond :public Item_int_func
...
@@ -906,7 +908,7 @@ class Item_func_microsecond :public Item_int_func
decimals
=
0
;
decimals
=
0
;
maybe_null
=
1
;
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
...
@@ -924,7 +926,7 @@ class Item_func_timestamp_diff :public Item_int_func
maybe_null
=
1
;
maybe_null
=
1
;
}
}
void
print
(
String
*
str
);
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
...
@@ -971,7 +973,7 @@ class Item_func_str_to_date :public Item_str_func
{
{
return
tmp_table_field_from_field_type
(
table
,
1
);
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
...
@@ -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
)
{}
Item_func_xml_extractvalue
(
Item
*
a
,
Item
*
b
)
:
Item_xml_str_func
(
a
,
b
)
{}
const
char
*
func_name
()
const
{
return
"extractvalue"
;
}
const
char
*
func_name
()
const
{
return
"extractvalue"
;
}
String
*
val_str
(
String
*
);
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()
...
@@ -695,6 +695,7 @@ bool partition_info::check_list_constants()
file A reference to a handler of the table
file A reference to a handler of the table
info Create info
info Create info
engine_type Return value for used engine in partitions
engine_type Return value for used engine in partitions
check_partition_function Should we check the partition function
RETURN VALUE
RETURN VALUE
TRUE Error, something went wrong
TRUE Error, something went wrong
...
@@ -709,26 +710,40 @@ bool partition_info::check_list_constants()
...
@@ -709,26 +710,40 @@ bool partition_info::check_list_constants()
*/
*/
bool
partition_info
::
check_partition_info
(
THD
*
thd
,
handlerton
**
eng_type
,
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
;
handlerton
**
engine_array
=
NULL
;
uint
part_count
=
0
;
uint
part_count
=
0
;
uint
i
,
tot_partitions
;
uint
i
,
tot_partitions
;
bool
result
=
TRUE
;
bool
result
=
TRUE
;
char
*
same_name
;
char
*
same_name
;
bool
part_expression_ok
=
TRU
E
;
int
part_expression_ok
=
PF_SAF
E
;
DBUG_ENTER
(
"partition_info::check_partition_info"
);
DBUG_ENTER
(
"partition_info::check_partition_info"
);
if
(
part_type
!=
HASH_PARTITION
||
!
list_of_part_fields
)
pf_collation_allowed
=
PF_SAFE
;
part_expr
->
walk
(
&
Item
::
check_partition_func_processor
,
0
,
spf_collation_allowed
=
PF_SAFE
;
(
byte
*
)(
&
part_expression_ok
));
if
(
check_partition_function
)
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
)
{
{
my_error
(
ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
,
MYF
(
0
));
if
(
part_type
!=
HASH_PARTITION
||
!
list_of_part_fields
)
goto
end
;
{
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
()
&&
if
(
unlikely
(
!
is_sub_partitioned
()
&&
!
(
use_default_subpartitions
&&
use_default_no_subpartitions
)))
!
(
use_default_subpartitions
&&
use_default_no_subpartitions
)))
...
...
sql/partition_info.h
View file @
eae8c963
...
@@ -188,6 +188,8 @@ class partition_info : public Sql_alloc
...
@@ -188,6 +188,8 @@ class partition_info : public Sql_alloc
bool
is_auto_partitioned
;
bool
is_auto_partitioned
;
bool
from_openfrm
;
bool
from_openfrm
;
bool
has_null_value
;
bool
has_null_value
;
char
pf_collation_allowed
;
char
spf_collation_allowed
;
partition_info
()
partition_info
()
...
@@ -217,7 +219,9 @@ class partition_info : public Sql_alloc
...
@@ -217,7 +219,9 @@ class partition_info : public Sql_alloc
list_of_part_fields
(
FALSE
),
list_of_subpart_fields
(
FALSE
),
list_of_part_fields
(
FALSE
),
list_of_subpart_fields
(
FALSE
),
linear_hash_ind
(
FALSE
),
fixed
(
FALSE
),
linear_hash_ind
(
FALSE
),
fixed
(
FALSE
),
is_auto_partitioned
(
FALSE
),
from_openfrm
(
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_PF
.
clear_all
();
all_fields_in_PPF
.
clear_all
();
all_fields_in_PPF
.
clear_all
();
...
@@ -250,7 +254,8 @@ class partition_info : public Sql_alloc
...
@@ -250,7 +254,8 @@ class partition_info : public Sql_alloc
bool
check_range_constants
();
bool
check_range_constants
();
bool
check_list_constants
();
bool
check_list_constants
();
bool
check_partition_info
(
THD
*
thd
,
handlerton
**
eng_type
,
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
);
void
print_no_partition_found
(
TABLE
*
table
);
private:
private:
static
int
list_part_cmp
(
const
void
*
a
,
const
void
*
b
);
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,
...
@@ -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
Create a field array including all fields of both the partitioning and the
subpartitioning functions.
subpartitioning functions.
...
@@ -549,6 +550,7 @@ static bool create_full_part_field_array(TABLE *table,
...
@@ -549,6 +550,7 @@ static bool create_full_part_field_array(TABLE *table,
partition_info
*
part_info
)
partition_info
*
part_info
)
{
{
bool
result
=
FALSE
;
bool
result
=
FALSE
;
Field
**
ptr
;
DBUG_ENTER
(
"create_full_part_field_array"
);
DBUG_ENTER
(
"create_full_part_field_array"
);
if
(
!
part_info
->
is_sub_partitioned
())
if
(
!
part_info
->
is_sub_partitioned
())
...
@@ -558,7 +560,7 @@ static bool create_full_part_field_array(TABLE *table,
...
@@ -558,7 +560,7 @@ static bool create_full_part_field_array(TABLE *table,
}
}
else
else
{
{
Field
*
*
ptr
,
*
field
,
**
field_array
;
Field
*
field
,
**
field_array
;
uint
no_part_fields
=
0
,
size_field_array
;
uint
no_part_fields
=
0
,
size_field_array
;
ptr
=
table
->
field
;
ptr
=
table
->
field
;
while
((
field
=
*
(
ptr
++
)))
while
((
field
=
*
(
ptr
++
)))
...
@@ -1369,6 +1371,38 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
...
@@ -1369,6 +1371,38 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
return
part_id
;
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
fix partition functions
...
@@ -1514,6 +1548,17 @@ bool fix_partition_func(THD *thd, TABLE *table,
...
@@ -1514,6 +1548,17 @@ bool fix_partition_func(THD *thd, TABLE *table,
goto
end
;
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
)))
if
(
unlikely
(
create_full_part_field_array
(
table
,
part_info
)))
goto
end
;
goto
end
;
if
(
unlikely
(
check_primary_key
(
table
)))
if
(
unlikely
(
check_primary_key
(
table
)))
...
@@ -4533,7 +4578,7 @@ the generated partition syntax in a correct manner.
...
@@ -4533,7 +4578,7 @@ the generated partition syntax in a correct manner.
tab_part_info
->
use_default_no_subpartitions
=
FALSE
;
tab_part_info
->
use_default_no_subpartitions
=
FALSE
;
}
}
if
(
tab_part_info
->
check_partition_info
(
thd
,
(
handlerton
**
)
NULL
,
if
(
tab_part_info
->
check_partition_info
(
thd
,
(
handlerton
**
)
NULL
,
table
->
file
,
ULL
(
0
)))
table
->
file
,
ULL
(
0
)
,
FALSE
))
{
{
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
}
}
...
...
sql/sql_table.cc
View file @
eae8c963
...
@@ -3185,7 +3185,8 @@ bool mysql_create_table_internal(THD *thd,
...
@@ -3185,7 +3185,8 @@ bool mysql_create_table_internal(THD *thd,
}
}
DBUG_PRINT
(
"info"
,
(
"db_type = %d"
,
DBUG_PRINT
(
"info"
,
(
"db_type = %d"
,
ha_legacy_type
(
part_info
->
default_engine_type
)));
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
;
goto
err
;
part_info
->
default_engine_type
=
engine_type
;
part_info
->
default_engine_type
=
engine_type
;
...
...
sql/sql_yacc.yy
View file @
eae8c963
...
@@ -3619,6 +3619,7 @@ part_bit_expr:
...
@@ -3619,6 +3619,7 @@ part_bit_expr:
{
{
Item *part_expr= $1;
Item *part_expr= $1;
bool not_corr_func;
bool not_corr_func;
bool part_expression_ok= TRUE;
LEX *lex= Lex;
LEX *lex= Lex;
THD *thd= YYTHD;
THD *thd= YYTHD;
longlong item_value;
longlong item_value;
...
@@ -3636,13 +3637,19 @@ part_bit_expr:
...
@@ -3636,13 +3637,19 @@ part_bit_expr:
mem_alloc_error(sizeof(part_elem_value));
mem_alloc_error(sizeof(part_elem_value));
YYABORT;
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) ||
if (part_expr->fix_fields(YYTHD, (Item**)0) ||
((context->table_list= save_list), FALSE) ||
((context->table_list= save_list), FALSE) ||
(!part_expr->const_item()) ||
(!part_expr->const_item()) ||
(!lex->safe_to_cache_query))
(!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;
YYABORT;
}
}
thd->where= save_where;
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