Skip to content

Commit

Permalink
MDEV-16912: Spider Order By column[datatime] limit 5 returns 3 rows
Browse files Browse the repository at this point in the history
The problem occurs in 10.2 and earlier releases of MariaDB Server because the
Partition Engine was not pushing the engine conditions to the underlying
storage engine of each partition.  This caused Spider to return the first 5
rows in the table with the data provided by the customer.  2 of the 5 rows
did not qualify the WHERE clause, so they were removed from the result set by
the server.

To fix the problem, I have back-ported support for engine condition pushdown
in the Partition Engine from MariaDB Server 10.3.

Author:
  Jacob Mathew.

Reviewer:
  Kentoku Shiba.

Merged:
  Commit eb2ca3d on branch bb-10.2-MDEV-16912
  • Loading branch information
Jacob Mathew committed Sep 13, 2018
2 parents 8e68876 + eb2ca3d commit 3866589
Show file tree
Hide file tree
Showing 6 changed files with 234 additions and 0 deletions.
50 changes: 50 additions & 0 deletions sql/ha_partition.cc
Expand Up @@ -9130,6 +9130,56 @@ int ha_partition::check_for_upgrade(HA_CHECK_OPT *check_opt)
}


/**
Push an engine condition to the condition stack of the storage engine
for each partition.
@param cond Pointer to the engine condition to be pushed.
@return NULL Underlying engine will not return rows that
do not match the passed condition.
<> NULL 'Remainder' condition that the caller must use
to filter out records.
*/

const COND *ha_partition::cond_push(const COND *cond)
{
handler **file= m_file;
COND *res_cond= NULL;
DBUG_ENTER("ha_partition::cond_push");

do
{
if ((*file)->pushed_cond != cond)
{
if ((*file)->cond_push(cond))
res_cond= (COND *) cond;
else
(*file)->pushed_cond= cond;
}
} while (*(++file));
DBUG_RETURN(res_cond);
}


/**
Pop the top condition from the condition stack of the storage engine
for each partition.
*/

void ha_partition::cond_pop()
{
handler **file= m_file;
DBUG_ENTER("ha_partition::cond_pop");

do
{
(*file)->cond_pop();
} while (*(++file));
DBUG_VOID_RETURN;
}


struct st_mysql_storage_engine partition_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION };

Expand Down
8 changes: 8 additions & 0 deletions sql/ha_partition.h
Expand Up @@ -1200,6 +1200,14 @@ class ha_partition :public handler
virtual bool is_crashed() const;
virtual int check_for_upgrade(HA_CHECK_OPT *check_opt);

/*
-----------------------------------------------------------------------
MODULE condition pushdown
-----------------------------------------------------------------------
*/
virtual const COND *cond_push(const COND *cond);
virtual void cond_pop();

private:
int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, uint flags);
int handle_opt_part(THD *thd, HA_CHECK_OPT *check_opt, uint part_id,
Expand Down
14 changes: 14 additions & 0 deletions storage/spider/mysql-test/spider/include/init_child2_1.inc
Expand Up @@ -69,6 +69,20 @@ let $CHILD2_1_CREATE_TABLES6=
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
let $CHILD2_1_SELECT_TABLES6=
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r_3 ORDER BY a;
let $CHILD2_1_DROP_TABLES7=
DROP TABLE IF EXISTS ta_ob;
let $CHILD2_1_CREATE_TABLES7=
CREATE TABLE ta_ob (
a VARCHAR(50) NOT NULL,
b VARCHAR(50) NULL DEFAULT NULL,
c VARCHAR(100) NULL DEFAULT NULL,
d DATETIME(0) NULL DEFAULT NULL,
e INT(11) NOT NULL,
f INT(10) NULL DEFAULT NULL,
PRIMARY KEY (a, e)
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
let $CHILD2_1_SELECT_TABLES7=
SELECT * FROM ta_ob WHERE c LIKE "%510411106%" AND e = 510411 AND f != 1 ORDER BY d,c LIMIT 6 OFFSET 0;
let $CHILD2_1_DROP_FT_TABLES=
DROP TABLE IF EXISTS ft_r;
let $CHILD2_1_CREATE_FT_TABLES=
Expand Down
4 changes: 4 additions & 0 deletions storage/spider/mysql-test/spider/include/init_master_1.inc
Expand Up @@ -94,6 +94,10 @@ if (!$VERSION_COMPILE_OS_WIN)
CONNECTION='host "localhost", socket "$CHILD2_1_MYSOCK", user "root",
password ""';
}
let $MASTER_1_COMMENT6_P_1_1=
COMMENT='database "auto_test_remote", table "ta_ob"'
PARTITION BY LIST COLUMNS (e) PARTITIONS 1
(PARTITION pt1 values in (510411) COMMENT = 'srv "s_2_1"');
if ($VERSION_COMPILE_OS_WIN)
{
let $MASTER_1_COMMENT_FT_2_1=
Expand Down
49 changes: 49 additions & 0 deletions storage/spider/mysql-test/spider/r/spider_fixes_part.result
Expand Up @@ -214,6 +214,55 @@ id
10000
connection master_1;

Test ORDER BY with LIMIT and OFFSET
connection master_1;
CREATE TABLE ta_ob (
a VARCHAR(50) NOT NULL,
b VARCHAR(50) NULL DEFAULT NULL,
c VARCHAR(100) NULL DEFAULT NULL,
d DATETIME(0) NULL DEFAULT NULL,
e INT(11) NOT NULL,
f INT(10) NULL DEFAULT NULL,
PRIMARY KEY (a, e)
) ENGINE=Spider COMMENT='database "auto_test_remote", table "ta_ob"'
PARTITION BY LIST COLUMNS (e) PARTITIONS 1
(PARTITION pt1 values in (510411) COMMENT = 'srv "s_2_1"')
INSERT INTO ta_ob VALUES ('0B95CD65DF994BC9A09A6AABE53A2733',
'6CFED89FF6A84C7AA55C3C432663D094',
'51041110620304', '2018-08-02 13:41:13',
510411, 1);
INSERT INTO ta_ob VALUES ('15E8D55EF099443BAEE639E60A4650BD',
'879DC2A0B6AC46D9A62E8EA47E2970F2',
'51041110620301', NULL,
510411, 0);
INSERT INTO ta_ob VALUES ('51ECF2C0CD3C48D99C91792E99D3C1A0',
'017B8A460DBC444682B791305EF75356',
'51041110620308', '2018-08-02 13:48:29',
510411, 0);
INSERT INTO ta_ob VALUES ('093B37A93A534DF883787AF5F6799674',
'996C7F14989D480589A553717D735E3E',
'51041110620302', '2018-08-02 13:48:30',
510411, 0);
INSERT INTO ta_ob VALUES ('53F5266FB069499AB6234755CACA2583',
'017B8A460DBC444682B791305EF75356',
'51041110620308', '2018-08-02 13:48:28',
510411, 0);
INSERT INTO ta_ob VALUES ('56E59BC4BDC143868D4A219C2D07A24B',
'821E71E6ABB4404EBAA349BB681089F8',
'51041110620310', '2018-08-02 13:48:27',
510411, 0);
INSERT INTO ta_ob VALUES ('56B68DA68D6D4A04A08B453D09AD7B70',
'821E71E6ABB4404EBAA349BB681089F8',
'51041110620310', '2018-08-02 13:48:28',
510411, 0);
SELECT * FROM ta_ob WHERE c LIKE "%510411106%" AND e = 510411 AND f != 1 ORDER BY d,c LIMIT 5 OFFSET 1;
a b c d e f
56E59BC4BDC143868D4A219C2D07A24B 821E71E6ABB4404EBAA349BB681089F8 51041110620310 2018-08-02 13:48:27 510411 0
53F5266FB069499AB6234755CACA2583 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:28 510411 0
56B68DA68D6D4A04A08B453D09AD7B70 821E71E6ABB4404EBAA349BB681089F8 51041110620310 2018-08-02 13:48:28 510411 0
51ECF2C0CD3C48D99C91792E99D3C1A0 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:29 510411 0
093B37A93A534DF883787AF5F6799674 996C7F14989D480589A553717D735E3E 51041110620302 2018-08-02 13:48:30 510411 0

deinit
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
Expand Down
109 changes: 109 additions & 0 deletions storage/spider/mysql-test/spider/t/spider_fixes_part.test
Expand Up @@ -616,6 +616,115 @@ if ($HAVE_PARTITION)
}
}

--echo
--echo Test ORDER BY with LIMIT and OFFSET
if ($HAVE_PARTITION)
{
if ($USE_CHILD_GROUP2)
{
if (!$OUTPUT_CHILD_GROUP2)
{
--disable_query_log
--disable_result_log
}
--connection child2_1
if ($OUTPUT_CHILD_GROUP2)
{
--disable_query_log
echo CHILD2_1_DROP_TABLES7;
echo CHILD2_1_CREATE_TABLES7;
}
--disable_warnings
eval $CHILD2_1_DROP_TABLES7;
--enable_warnings
eval $CHILD2_1_CREATE_TABLES7;
if ($OUTPUT_CHILD_GROUP2)
{
--enable_query_log
}
if ($USE_GENERAL_LOG)
{
TRUNCATE TABLE mysql.general_log;
}
if (!$OUTPUT_CHILD_GROUP2)
{
--enable_query_log
--enable_result_log
}
}
--connection master_1
--disable_query_log
--disable_warnings
DROP TABLE IF EXISTS ta_ob;
--enable_warnings
echo CREATE TABLE ta_ob (
a VARCHAR(50) NOT NULL,
b VARCHAR(50) NULL DEFAULT NULL,
c VARCHAR(100) NULL DEFAULT NULL,
d DATETIME(0) NULL DEFAULT NULL,
e INT(11) NOT NULL,
f INT(10) NULL DEFAULT NULL,
PRIMARY KEY (a, e)
) $MASTER_1_ENGINE $MASTER_1_COMMENT6_P_1_1;
eval CREATE TABLE ta_ob (
a VARCHAR(50) NOT NULL,
b VARCHAR(50) NULL DEFAULT NULL,
c VARCHAR(100) NULL DEFAULT NULL,
d DATETIME(0) NULL DEFAULT NULL,
e INT(11) NOT NULL,
f INT(10) NULL DEFAULT NULL,
PRIMARY KEY (a, e)
) $MASTER_1_ENGINE $MASTER_1_COMMENT6_P_1_1;
--enable_query_log
INSERT INTO ta_ob VALUES ('0B95CD65DF994BC9A09A6AABE53A2733',
'6CFED89FF6A84C7AA55C3C432663D094',
'51041110620304', '2018-08-02 13:41:13',
510411, 1);
INSERT INTO ta_ob VALUES ('15E8D55EF099443BAEE639E60A4650BD',
'879DC2A0B6AC46D9A62E8EA47E2970F2',
'51041110620301', NULL,
510411, 0);
INSERT INTO ta_ob VALUES ('51ECF2C0CD3C48D99C91792E99D3C1A0',
'017B8A460DBC444682B791305EF75356',
'51041110620308', '2018-08-02 13:48:29',
510411, 0);
INSERT INTO ta_ob VALUES ('093B37A93A534DF883787AF5F6799674',
'996C7F14989D480589A553717D735E3E',
'51041110620302', '2018-08-02 13:48:30',
510411, 0);
INSERT INTO ta_ob VALUES ('53F5266FB069499AB6234755CACA2583',
'017B8A460DBC444682B791305EF75356',
'51041110620308', '2018-08-02 13:48:28',
510411, 0);
INSERT INTO ta_ob VALUES ('56E59BC4BDC143868D4A219C2D07A24B',
'821E71E6ABB4404EBAA349BB681089F8',
'51041110620310', '2018-08-02 13:48:27',
510411, 0);
INSERT INTO ta_ob VALUES ('56B68DA68D6D4A04A08B453D09AD7B70',
'821E71E6ABB4404EBAA349BB681089F8',
'51041110620310', '2018-08-02 13:48:28',
510411, 0);
SELECT * FROM ta_ob WHERE c LIKE "%510411106%" AND e = 510411 AND f != 1 ORDER BY d,c LIMIT 5 OFFSET 1;
if ($USE_CHILD_GROUP2)
{
if (!$OUTPUT_CHILD_GROUP2)
{
--disable_query_log
--disable_result_log
}
--connection child2_1
if ($USE_GENERAL_LOG)
{
SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
}
eval $CHILD2_1_SELECT_TABLES7;
if (!$OUTPUT_CHILD_GROUP2)
{
--enable_query_log
--enable_result_log
}
}
}

--echo
--echo deinit
Expand Down

0 comments on commit 3866589

Please sign in to comment.