Skip to content

Commit

Permalink
MDEV-27581 Wrong result with DESC key on partitioned Spider table
Browse files Browse the repository at this point in the history
take descending indexes into account when generating a query
  • Loading branch information
vuvova committed Jan 25, 2022
1 parent 8e814c3 commit 7efd3c5
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 43 deletions.
17 changes: 17 additions & 0 deletions storage/spider/mysql-test/spider/bugfix/r/index.result
Expand Up @@ -38,6 +38,23 @@ id
5
6
drop table t_sp1;
#
# MDEV-27581 Wrong result with DESC key on partitioned Spider table
#
create table auto_test_local.t1 (a int primary key);
create table auto_test_local.t2 (a int primary key);
create table t (a int, primary key (a desc)) engine=spider
engine=spider comment='wrapper "mysql", srv "s_1"'
partition by range (a)
(partition p1 values less than (4) comment "table 't1'",
partition p2 values less than (maxvalue) comment "table 't2'");
insert into t values (1),(2),(10),(11);
select * from t where a > 1 order by a;
a
2
10
11
drop table t, auto_test_local.t1, auto_test_local.t2;
drop database auto_test_local;
for master_1
connection master_1;
Expand Down
16 changes: 15 additions & 1 deletion storage/spider/mysql-test/spider/bugfix/t/index.test
Expand Up @@ -5,7 +5,7 @@ set spider_same_server_link= on;
--echo #
--echo # MDEV-27590 Auto-increment on Spider tables with DESC PK does not work properly
--echo #

select @@spider_auto_increment_mode;
create or replace table auto_test_local.t (id int primary key) engine=InnoDB;
create or replace table t_sp1 (id int auto_increment, primary key(id desc))
Expand All @@ -15,6 +15,20 @@ insert into t_sp1 () values (),(),();
select * from t_sp1;
drop table t_sp1;

--echo #
--echo # MDEV-27581 Wrong result with DESC key on partitioned Spider table
--echo #
create table auto_test_local.t1 (a int primary key);
create table auto_test_local.t2 (a int primary key);
create table t (a int, primary key (a desc)) engine=spider
engine=spider comment='wrapper "mysql", srv "s_1"'
partition by range (a)
(partition p1 values less than (4) comment "table 't1'",
partition p2 values less than (maxvalue) comment "table 't2'");

insert into t values (1),(2),(10),(11);
select * from t where a > 1 order by a;
drop table t, auto_test_local.t1, auto_test_local.t2;

drop database auto_test_local;
--source ../t/test_deinit.inc
139 changes: 97 additions & 42 deletions storage/spider/spd_db_conn.cc
Expand Up @@ -1732,6 +1732,7 @@ int spider_db_append_key_where_internal(
key_count++
) {
DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
bool rev = key_part->key_part_flag & HA_REVERSE_SORT;
store_length = key_part->store_length;
field = key_part->field;
key_name_length = dbton_share->get_column_name_length(field->field_index);
Expand Down Expand Up @@ -1901,11 +1902,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_GT_STR;
op_len = SPIDER_SQL_GT_LEN;
op_str = rev ? SPIDER_SQL_LT_STR : SPIDER_SQL_GT_STR;
op_len = rev ? SPIDER_SQL_LT_LEN : SPIDER_SQL_GT_LEN;
} else {
op_str = SPIDER_SQL_GTEQUAL_STR;
op_len = SPIDER_SQL_GTEQUAL_LEN;
op_str = rev ? SPIDER_SQL_LTEQUAL_STR : SPIDER_SQL_GTEQUAL_STR;
op_len = rev ? SPIDER_SQL_LTEQUAL_LEN : SPIDER_SQL_GTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
Expand All @@ -1930,7 +1931,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
else
str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -1943,7 +1947,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (rev)
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
else
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -1954,7 +1961,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (rev)
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
else
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand All @@ -1971,11 +1981,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
op_str = rev ? SPIDER_SQL_GT_STR : SPIDER_SQL_LT_STR;
op_len = rev ? SPIDER_SQL_GT_LEN : SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
op_str = rev ? SPIDER_SQL_GTEQUAL_STR : SPIDER_SQL_LTEQUAL_STR;
op_len = rev ? SPIDER_SQL_GTEQUAL_LEN : SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
Expand All @@ -2000,7 +2010,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -2013,7 +2026,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -2024,7 +2040,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand All @@ -2050,7 +2069,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr,
share->access_charset))
Expand All @@ -2067,8 +2089,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -2081,8 +2105,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -2093,8 +2119,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand Down Expand Up @@ -2201,7 +2229,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr,
share->access_charset))
Expand All @@ -2218,8 +2249,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
else
str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -2232,8 +2265,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -2244,8 +2279,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand Down Expand Up @@ -2358,11 +2395,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (end_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
op_str = rev ? SPIDER_SQL_GT_STR : SPIDER_SQL_LT_STR;
op_len = rev ? SPIDER_SQL_GT_LEN : SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
op_str = rev ? SPIDER_SQL_GTEQUAL_STR : SPIDER_SQL_LTEQUAL_STR;
op_len = rev ? SPIDER_SQL_GTEQUAL_LEN : SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
Expand All @@ -2386,7 +2423,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -2399,7 +2439,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -2410,7 +2453,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (rev)
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
else
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand All @@ -2428,7 +2474,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr,
share->access_charset))
Expand All @@ -2444,8 +2493,10 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part2, field, ptr,
share->access_charset))
Expand All @@ -2458,8 +2509,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
Expand All @@ -2470,8 +2523,10 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (rev)
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
else
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
share->access_charset))
Expand Down

0 comments on commit 7efd3c5

Please sign in to comment.