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
6be97e4e
Commit
6be97e4e
authored
Sep 26, 2006
by
mikael/pappa@dator5.(none)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Final step of Take 7 on review fixes of this
fairly complex bug
parent
6df933a8
Changes
6
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
241 additions
and
153 deletions
+241
-153
mysql-test/r/partition.result
mysql-test/r/partition.result
+0
-5
sql/partition_info.cc
sql/partition_info.cc
+167
-1
sql/partition_info.h
sql/partition_info.h
+12
-6
sql/sql_partition.cc
sql/sql_partition.cc
+57
-138
sql/sql_partition.h
sql/sql_partition.h
+3
-0
sql/sql_yacc.yy
sql/sql_yacc.yy
+2
-3
No files found.
mysql-test/r/partition.result
View file @
6be97e4e
drop table if exists t1;
drop table if exists t1;
create table t1 (s1 char(2) character set utf8)
partition by list (case when s1 > 'cz' then 1 else 2 end)
(partition p1 values in (1),
partition p2 values in (2));
drop table t1;
create table t1 (a int)
create table t1 (a int)
partition by key(a)
partition by key(a)
partitions 0.2+e1;
partitions 0.2+e1;
...
...
sql/partition_info.cc
View file @
6be97e4e
...
@@ -859,5 +859,171 @@ void partition_info::print_no_partition_found(TABLE *table)
...
@@ -859,5 +859,171 @@ void partition_info::print_no_partition_found(TABLE *table)
my_error
(
ER_NO_PARTITION_FOR_GIVEN_VALUE
,
MYF
(
0
),
buf_ptr
);
my_error
(
ER_NO_PARTITION_FOR_GIVEN_VALUE
,
MYF
(
0
),
buf_ptr
);
dbug_tmp_restore_column_map
(
table
->
read_set
,
old_map
);
dbug_tmp_restore_column_map
(
table
->
read_set
,
old_map
);
}
}
/*
Set up buffers and arrays for fields requiring preparation
SYNOPSIS
set_up_charset_field_preps()
part_info Partition info object
RETURN VALUES
TRUE Memory Allocation error
FALSE Success
DESCRIPTION
Set up arrays and buffers for fields that require special care for
calculation of partition id. This is used for string fields with
variable length or string fields with fixed length that isn't using
the binary collation.
*/
#endif
/* WITH_PARTITION_STORAGE_ENGINE */
bool
partition_info
::
set_up_charset_field_preps
()
{
Field
*
field
,
**
ptr
;
char
*
field_buf
;
char
**
char_ptrs
;
unsigned
i
;
bool
found
;
size_t
size
;
uint
tot_fields
=
0
;
uint
tot_part_fields
=
0
;
uint
tot_subpart_fields
=
0
;
DBUG_ENTER
(
"set_up_charset_field_preps"
);
if
(
!
(
part_type
==
HASH_PARTITION
&&
list_of_part_fields
)
&&
check_part_func_fields
(
part_field_array
,
FALSE
))
{
ptr
=
part_field_array
;
/* Set up arrays and buffers for those fields */
i
=
0
;
while
((
field
=
*
(
ptr
++
)))
{
if
(
field_is_partition_charset
(
field
))
{
tot_part_fields
++
;
tot_fields
++
;
}
}
size
=
tot_part_fields
*
sizeof
(
char
*
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
part_field_buffers
=
char_ptrs
;
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
restore_part_field_ptrs
=
char_ptrs
;
size
=
(
tot_part_fields
+
1
)
*
sizeof
(
Field
*
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_alloc
(
size
)))
goto
error
;
part_charset_field_array
=
(
Field
**
)
char_ptrs
;
ptr
=
part_field_array
;
i
=
0
;
while
((
field
=
*
(
ptr
++
)))
{
if
(
field_is_partition_charset
(
field
))
{
CHARSET_INFO
*
cs
=
((
Field_str
*
)
field
)
->
charset
();
size
=
field
->
pack_length
();
if
(
!
(
field_buf
=
sql_calloc
(
size
)))
goto
error
;
part_charset_field_array
[
i
]
=
field
;
part_field_buffers
[
i
++
]
=
field_buf
;
}
}
part_charset_field_array
[
i
]
=
NULL
;
}
if
(
is_sub_partitioned
()
&&
list_of_subpart_fields
&&
check_part_func_fields
(
subpart_field_array
,
FALSE
))
{
/* Set up arrays and buffers for those fields */
ptr
=
subpart_field_array
;
while
((
field
=
*
(
ptr
++
)))
{
if
(
field_is_partition_charset
(
field
))
tot_subpart_fields
++
;
}
size
=
tot_subpart_fields
*
sizeof
(
char
*
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
subpart_field_buffers
=
char_ptrs
;
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
restore_subpart_field_ptrs
=
char_ptrs
;
size
=
(
tot_subpart_fields
+
1
)
*
sizeof
(
Field
*
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_alloc
(
size
)))
goto
error
;
subpart_charset_field_array
=
(
Field
**
)
char_ptrs
;
i
=
0
;
while
((
field
=
*
(
ptr
++
)))
{
unsigned
j
=
0
;
Field
*
part_field
;
CHARSET_INFO
*
cs
;
if
(
!
field_is_partition_charset
(
field
))
continue
;
cs
=
((
Field_str
*
)
field
)
->
charset
();
size
=
field
->
pack_length
();
found
=
FALSE
;
for
(
j
=
0
;
j
<
tot_part_fields
;
j
++
)
{
if
(
field
==
part_charset_field_array
[
i
])
found
=
TRUE
;
}
if
(
!
found
)
{
tot_fields
++
;
if
(
!
(
field_buf
=
sql_calloc
(
size
)))
goto
error
;
}
subpart_field_buffers
[
i
++
]
=
field_buf
;
}
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
restore_subpart_field_ptrs
=
char_ptrs
;
}
if
(
tot_fields
)
{
Field
*
part_field
,
*
subpart_field
;
uint
j
,
k
,
l
;
size
=
tot_fields
*
sizeof
(
char
**
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
full_part_field_buffers
=
char_ptrs
;
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
restore_full_part_field_ptrs
=
char_ptrs
;
size
=
(
tot_fields
+
1
)
*
sizeof
(
char
**
);
if
(
!
(
char_ptrs
=
(
char
**
)
sql_calloc
(
size
)))
goto
error
;
full_part_charset_field_array
=
(
Field
**
)
char_ptrs
;
for
(
i
=
0
;
i
<
tot_part_fields
;
i
++
)
{
full_part_charset_field_array
[
i
]
=
part_charset_field_array
[
i
];
full_part_field_buffers
[
i
]
=
part_field_buffers
[
i
];
}
k
=
tot_part_fields
;
l
=
0
;
for
(
i
=
0
;
i
<
tot_subpart_fields
;
i
++
)
{
field
=
subpart_charset_field_array
[
i
];
found
=
FALSE
;
for
(
j
=
0
;
j
<
tot_part_fields
;
j
++
)
{
if
(
field
==
part_charset_field_array
[
i
])
found
=
TRUE
;
}
if
(
!
found
)
{
full_part_charset_field_array
[
l
]
=
subpart_charset_field_array
[
k
];
full_part_field_buffers
[
l
]
=
subpart_field_buffers
[
k
];
k
++
;
l
++
;
}
}
full_part_charset_field_array
[
tot_fields
]
=
NULL
;
}
DBUG_RETURN
(
FALSE
);
error:
mem_alloc_error
(
size
);
DBUG_RETURN
(
TRUE
);
}
#endif
/* WITH_PARTITION_STORAGE_ENGINE */
sql/partition_info.h
View file @
6be97e4e
...
@@ -73,14 +73,15 @@ class partition_info : public Sql_alloc
...
@@ -73,14 +73,15 @@ class partition_info : public Sql_alloc
/* NULL-terminated array of fields used in partitioned expression */
/* NULL-terminated array of fields used in partitioned expression */
Field
**
part_field_array
;
Field
**
part_field_array
;
/* NULL-terminated array of fields used in subpartitioned expression */
Field
**
subpart_field_array
;
Field
**
subpart_field_array
;
Field
**
part_charset_field_array
;
Field
**
subpart_charset_field_array
;
/*
/*
Array of all fields used in partition and subpartition expression,
Array of all fields used in partition and subpartition expression,
without duplicates, NULL-terminated.
without duplicates, NULL-terminated.
*/
*/
Field
**
full_part_field_array
;
Field
**
full_part_field_array
;
Field
**
full_part_charset_field_array
;
/*
/*
When we have a field that requires transformation before calling the
When we have a field that requires transformation before calling the
...
@@ -89,8 +90,10 @@ class partition_info : public Sql_alloc
...
@@ -89,8 +90,10 @@ class partition_info : public Sql_alloc
*/
*/
char
**
part_field_buffers
;
char
**
part_field_buffers
;
char
**
subpart_field_buffers
;
char
**
subpart_field_buffers
;
char
**
full_part_field_buffers
;
char
**
restore_part_field_ptrs
;
char
**
restore_part_field_ptrs
;
char
**
restore_subpart_field_ptrs
;
char
**
restore_subpart_field_ptrs
;
char
**
restore_full_part_field_ptrs
;
Item
*
part_expr
;
Item
*
part_expr
;
Item
*
subpart_expr
;
Item
*
subpart_expr
;
...
@@ -208,17 +211,20 @@ class partition_info : public Sql_alloc
...
@@ -208,17 +211,20 @@ 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
;
bool
includes_charset_field_part
;
bool
includes_charset_field_subpart
;
partition_info
()
partition_info
()
:
get_partition_id
(
NULL
),
get_part_partition_id
(
NULL
),
:
get_partition_id
(
NULL
),
get_part_partition_id
(
NULL
),
get_subpartition_id
(
NULL
),
get_subpartition_id
(
NULL
),
part_field_array
(
NULL
),
subpart_field_array
(
NULL
),
part_field_array
(
NULL
),
subpart_field_array
(
NULL
),
part_charset_field_array
(
NULL
),
subpart_charset_field_array
(
NULL
),
full_part_field_array
(
NULL
),
full_part_field_array
(
NULL
),
full_part_charset_field_array
(
NULL
),
part_field_buffers
(
NULL
),
subpart_field_buffers
(
NULL
),
part_field_buffers
(
NULL
),
subpart_field_buffers
(
NULL
),
full_part_field_buffers
(
NULL
),
restore_part_field_ptrs
(
NULL
),
restore_subpart_field_ptrs
(
NULL
),
restore_part_field_ptrs
(
NULL
),
restore_subpart_field_ptrs
(
NULL
),
restore_full_part_field_ptrs
(
NULL
),
part_expr
(
NULL
),
subpart_expr
(
NULL
),
item_free_list
(
NULL
),
part_expr
(
NULL
),
subpart_expr
(
NULL
),
item_free_list
(
NULL
),
first_log_entry
(
NULL
),
exec_log_entry
(
NULL
),
frm_log_entry
(
NULL
),
first_log_entry
(
NULL
),
exec_log_entry
(
NULL
),
frm_log_entry
(
NULL
),
list_array
(
NULL
),
list_array
(
NULL
),
...
@@ -241,8 +247,7 @@ class partition_info : public Sql_alloc
...
@@ -241,8 +247,7 @@ 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
),
includes_charset_field_part
(
FALSE
),
has_null_value
(
FALSE
)
includes_charset_field_subpart
(
FALSE
)
{
{
all_fields_in_PF
.
clear_all
();
all_fields_in_PF
.
clear_all
();
all_fields_in_PPF
.
clear_all
();
all_fields_in_PPF
.
clear_all
();
...
@@ -278,6 +283,7 @@ class partition_info : public Sql_alloc
...
@@ -278,6 +283,7 @@ class partition_info : public Sql_alloc
handler
*
file
,
HA_CREATE_INFO
*
info
,
handler
*
file
,
HA_CREATE_INFO
*
info
,
bool
check_partition_function
);
bool
check_partition_function
);
void
print_no_partition_found
(
TABLE
*
table
);
void
print_no_partition_found
(
TABLE
*
table
);
bool
set_up_charset_field_preps
();
private:
private:
static
int
list_part_cmp
(
const
void
*
a
,
const
void
*
b
);
static
int
list_part_cmp
(
const
void
*
a
,
const
void
*
b
);
static
int
list_part_cmp_unsigned
(
const
void
*
a
,
const
void
*
b
);
static
int
list_part_cmp_unsigned
(
const
void
*
a
,
const
void
*
b
);
...
...
sql/sql_partition.cc
View file @
6be97e4e
This diff is collapsed.
Click to expand it.
sql/sql_partition.h
View file @
6be97e4e
...
@@ -93,6 +93,9 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
...
@@ -93,6 +93,9 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
bool
fix_fields_part_func
(
THD
*
thd
,
Item
*
func_expr
,
TABLE
*
table
,
bool
fix_fields_part_func
(
THD
*
thd
,
Item
*
func_expr
,
TABLE
*
table
,
bool
is_sub_part
,
bool
is_field_to_be_setup
);
bool
is_sub_part
,
bool
is_field_to_be_setup
);
bool
check_part_func_fields
(
Field
**
ptr
,
bool
ok_with_charsets
);
bool
field_is_partition_charset
(
Field
*
field
);
/*
/*
A "Get next" function for partition iterator.
A "Get next" function for partition iterator.
...
...
sql/sql_yacc.yy
View file @
6be97e4e
...
@@ -3618,9 +3618,8 @@ part_bit_expr:
...
@@ -3618,9 +3618,8 @@ 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,
if (part_expr->walk(&Item::check_partition_func_processor, 0,
(byte*)(&part_expression_ok));
NULL))
if (!part_expression_ok)
{
{
my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
YYABORT;
YYABORT;
...
...
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