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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
64aa3861
Commit
64aa3861
authored
Feb 15, 2006
by
mskold@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.1-new
into mysql.com:/usr/local/home/marty/MySQL/mysql-5.1-work
parents
00fc4cab
dafc2c7a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
104 additions
and
2 deletions
+104
-2
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.cc
+45
-0
sql/handler.h
sql/handler.h
+1
-0
sql/sql_partition.cc
sql/sql_partition.cc
+58
-2
No files found.
sql/ha_ndbcluster.cc
View file @
64aa3861
...
...
@@ -2198,6 +2198,7 @@ int ha_ndbcluster::full_table_scan(byte *buf)
int
res
;
NdbScanOperation
*
op
;
NdbTransaction
*
trans
=
m_active_trans
;
part_id_range
part_spec
;
DBUG_ENTER
(
"full_table_scan"
);
DBUG_PRINT
(
"enter"
,
(
"Starting new scan on %s"
,
m_tabname
));
...
...
@@ -2209,6 +2210,35 @@ int ha_ndbcluster::full_table_scan(byte *buf)
op
->
readTuples
(
lm
,
0
,
parallelism
))
ERR_RETURN
(
trans
->
getNdbError
());
m_active_cursor
=
op
;
if
(
m_use_partition_function
)
{
part_spec
.
start_part
=
0
;
part_spec
.
end_part
=
get_tot_partitions
(
m_part_info
)
-
1
;
prune_partition_set
(
table
,
&
part_spec
);
DBUG_PRINT
(
"info"
,
(
"part_spec.start_part = %u, part_spec.end_part = %u"
,
part_spec
.
start_part
,
part_spec
.
end_part
));
/*
If partition pruning has found no partition in set
we can return HA_ERR_END_OF_FILE
If partition pruning has found exactly one partition in set
we can optimize scan to run towards that partition only.
*/
if
(
part_spec
.
start_part
>
part_spec
.
end_part
)
{
DBUG_RETURN
(
HA_ERR_END_OF_FILE
);
}
else
if
(
part_spec
.
start_part
==
part_spec
.
end_part
)
{
/*
Only one partition is required to scan, if sorted is required we
don't need it any more since output from one ordered partitioned
index is always sorted.
*/
m_active_cursor
->
setPartitionId
(
part_spec
.
start_part
);
}
}
if
(
generate_scan_filter
(
m_cond_stack
,
op
))
DBUG_RETURN
(
ndb_err
(
trans
));
if
((
res
=
define_read_attrs
(
buf
,
op
)))
...
...
@@ -3012,6 +3042,14 @@ int ha_ndbcluster::read_range_first_to_buf(const key_range *start_key,
if
(
m_use_partition_function
)
{
get_partition_set
(
table
,
buf
,
active_index
,
start_key
,
&
part_spec
);
DBUG_PRINT
(
"info"
,
(
"part_spec.start_part = %u, part_spec.end_part = %u"
,
part_spec
.
start_part
,
part_spec
.
end_part
));
/*
If partition pruning has found no partition in set
we can return HA_ERR_END_OF_FILE
If partition pruning has found exactly one partition in set
we can optimize scan to run towards that partition only.
*/
if
(
part_spec
.
start_part
>
part_spec
.
end_part
)
{
DBUG_RETURN
(
HA_ERR_END_OF_FILE
);
...
...
@@ -3026,6 +3064,7 @@ int ha_ndbcluster::read_range_first_to_buf(const key_range *start_key,
sorted
=
FALSE
;
}
}
m_write_op
=
FALSE
;
switch
(
type
){
case
PRIMARY_KEY_ORDERED_INDEX
:
...
...
@@ -7003,6 +7042,12 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
get_partition_set
(
table
,
curr
,
active_index
,
&
multi_range_curr
->
start_key
,
&
part_spec
);
DBUG_PRINT
(
"info"
,
(
"part_spec.start_part = %u, part_spec.end_part = %u"
,
part_spec
.
start_part
,
part_spec
.
end_part
));
/*
If partition pruning has found no partition in set
we can skip this scan
*/
if
(
part_spec
.
start_part
>
part_spec
.
end_part
)
{
/*
...
...
sql/handler.h
View file @
64aa3861
...
...
@@ -1126,6 +1126,7 @@ char *generate_partition_syntax(partition_info *part_info,
uint
*
buf_length
,
bool
use_sql_alloc
,
bool
write_all
);
bool
partition_key_modified
(
TABLE
*
table
,
List
<
Item
>
&
fields
);
void
prune_partition_set
(
const
TABLE
*
table
,
part_id_range
*
part_spec
);
void
get_partition_set
(
const
TABLE
*
table
,
byte
*
buf
,
const
uint
index
,
const
key_range
*
key_spec
,
part_id_range
*
part_spec
);
...
...
sql/sql_partition.cc
View file @
64aa3861
...
...
@@ -3605,7 +3605,52 @@ void get_full_part_id_from_key(const TABLE *table, byte *buf,
part_spec
->
start_part
++
;
DBUG_VOID_RETURN
;
}
/*
Prune the set of partitions to use in query
SYNOPSIS
prune_partition_set()
table The table object
out:part_spec Contains start part, end part
DESCRIPTION
This function is called to prune the range of partitions to scan by
checking the used_partitions bitmap.
If start_part > end_part at return it means no partition needs to be
scanned. If start_part == end_part it always means a single partition
needs to be scanned.
RETURN VALUE
part_spec
*/
void
prune_partition_set
(
const
TABLE
*
table
,
part_id_range
*
part_spec
)
{
int
last_partition
=
-
1
;
uint
i
;
partition_info
*
part_info
=
table
->
part_info
;
DBUG_ENTER
(
"prune_partition_set"
);
for
(
i
=
part_spec
->
start_part
;
i
<=
part_spec
->
end_part
;
i
++
)
{
if
(
bitmap_is_set
(
&
(
part_info
->
used_partitions
),
i
))
{
DBUG_PRINT
(
"info"
,
(
"Partition %d is set"
,
i
));
if
(
last_partition
==
-
1
)
/* First partition found in set and pruned bitmap */
part_spec
->
start_part
=
i
;
last_partition
=
i
;
}
}
if
(
last_partition
==
-
1
)
/* No partition found in pruned bitmap */
part_spec
->
start_part
=
part_spec
->
end_part
+
1
;
else
//if (last_partition != -1)
part_spec
->
end_part
=
last_partition
;
DBUG_VOID_RETURN
;
}
/*
Get the set of partitions to use in query.
...
...
@@ -3669,6 +3714,10 @@ void get_partition_set(const TABLE *table, byte *buf, const uint index,
is needed.
*/
get_full_part_id_from_key
(
table
,
buf
,
key_info
,
key_spec
,
part_spec
);
/*
Check if range can be adjusted by looking in used_partitions
*/
prune_partition_set
(
table
,
part_spec
);
DBUG_VOID_RETURN
;
}
else
if
(
is_sub_partitioned
(
part_info
))
...
...
@@ -3711,6 +3760,10 @@ void get_partition_set(const TABLE *table, byte *buf, const uint index,
*/
get_full_part_id_from_key
(
table
,
buf
,
key_info
,
key_spec
,
part_spec
);
clear_indicator_in_key_fields
(
key_info
);
/*
Check if range can be adjusted by looking in used_partitions
*/
prune_partition_set
(
table
,
part_spec
);
DBUG_VOID_RETURN
;
}
else
if
(
is_sub_partitioned
(
part_info
))
...
...
@@ -3770,10 +3823,13 @@ void get_partition_set(const TABLE *table, byte *buf, const uint index,
}
if
(
found_part_field
)
clear_indicator_in_key_fields
(
key_info
);
/*
Check if range can be adjusted by looking in used_partitions
*/
prune_partition_set
(
table
,
part_spec
);
DBUG_VOID_RETURN
;
}
/*
If the table is partitioned we will read the partition info into the
.frm file here.
...
...
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