1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Merge remote-tracking branch 'origin/10.5' into 10.6

This commit is contained in:
Vladislav Vaintroub
2022-06-23 06:29:57 +02:00
5 changed files with 73 additions and 14 deletions

View File

@ -3635,6 +3635,25 @@ SELECT * FROM t1 LEFT JOIN t2 ON a = pk WHERE b >= 0 AND pk IS NULL;
a pk b a pk b
DROP TABLE t1, t2; DROP TABLE t1, t2;
SET @@optimizer_switch= @save_optimizer_switch; SET @@optimizer_switch= @save_optimizer_switch;
# MDEV-28858 Wrong result with table elimination combined with
# not_null_range_scan
#
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (10,1),(null,2);
CREATE TABLE t2 (pk INT PRIMARY KEY) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1),(2);
SET @save_optimizer_switch= @@optimizer_switch;
SET optimizer_switch= 'not_null_range_scan=on';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
b
2
SET optimizer_switch= 'not_null_range_scan=off';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
b
2
SET @@optimizer_switch=@save_optimizer_switch;
drop table t1,t2;
# #
# End of 10.5 tests # End of 10.5 tests
# #

View File

@ -2492,6 +2492,24 @@ DROP TABLE t1, t2;
SET @@optimizer_switch= @save_optimizer_switch; SET @@optimizer_switch= @save_optimizer_switch;
--echo
--echo # MDEV-28858 Wrong result with table elimination combined with
--echo # not_null_range_scan
--echo #
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (10,1),(null,2);
CREATE TABLE t2 (pk INT PRIMARY KEY) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1),(2);
SET @save_optimizer_switch= @@optimizer_switch;
SET optimizer_switch= 'not_null_range_scan=on';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
SET optimizer_switch= 'not_null_range_scan=off';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
SET @@optimizer_switch=@save_optimizer_switch;
drop table t1,t2;
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.5 tests
--echo # --echo #

View File

@ -3624,6 +3624,25 @@ SELECT * FROM t1 LEFT JOIN t2 ON a = pk WHERE b >= 0 AND pk IS NULL;
a pk b a pk b
DROP TABLE t1, t2; DROP TABLE t1, t2;
SET @@optimizer_switch= @save_optimizer_switch; SET @@optimizer_switch= @save_optimizer_switch;
# MDEV-28858 Wrong result with table elimination combined with
# not_null_range_scan
#
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (10,1),(null,2);
CREATE TABLE t2 (pk INT PRIMARY KEY) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1),(2);
SET @save_optimizer_switch= @@optimizer_switch;
SET optimizer_switch= 'not_null_range_scan=on';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
b
2
SET optimizer_switch= 'not_null_range_scan=off';
SELECT t1.b FROM t1 LEFT JOIN t2 ON t1.a = t2.pk WHERE t1.a IS NULL ORDER BY t1.b;
b
2
SET @@optimizer_switch=@save_optimizer_switch;
drop table t1,t2;
# #
# End of 10.5 tests # End of 10.5 tests
# #

View File

@ -29976,11 +29976,12 @@ bool build_notnull_conds_for_range_scans(JOIN *join, Item *cond,
DBUG_ENTER("build_notnull_conds_for_range_scans"); DBUG_ENTER("build_notnull_conds_for_range_scans");
for (JOIN_TAB *s= join->join_tab + join->const_tables ; for (JOIN_TAB *s= join->join_tab;
s < join->join_tab + join->table_count ; s++) s < join->join_tab + join->table_count ; s++)
{ {
/* Clear all needed bitmaps to mark found fields */ /* Clear all needed bitmaps to mark found fields */
if (allowed & s->table->map) if ((allowed & s->table->map) &&
!(s->table->map && join->const_table_map))
bitmap_clear_all(&s->table->tmp_set); bitmap_clear_all(&s->table->tmp_set);
} }
@ -29995,17 +29996,18 @@ bool build_notnull_conds_for_range_scans(JOIN *join, Item *cond,
For each table t from 'allowed' build a conjunction of NOT NULL predicates For each table t from 'allowed' build a conjunction of NOT NULL predicates
constructed for all found fields if they are included in some indexes. constructed for all found fields if they are included in some indexes.
If the construction of the conjunction succeeds attach the formula to If the construction of the conjunction succeeds attach the formula to
t->table->notnull_cond. The condition will be used to look for complementary t->table->notnull_cond. The condition will be used to look for
range scans. complementary range scans.
*/ */
for (JOIN_TAB *s= join->join_tab + join->const_tables ; for (JOIN_TAB *s= join->join_tab ;
s < join->join_tab + join->table_count ; s++) s < join->join_tab + join->table_count ; s++)
{ {
TABLE *tab= s->table; TABLE *tab= s->table;
List<Item> notnull_list; List<Item> notnull_list;
Item *notnull_cond= 0; Item *notnull_cond= 0;
if (!(allowed & tab->map)) if (!(allowed & tab->map) ||
(s->table->map && join->const_table_map))
continue; continue;
for (Field** field_ptr= tab->field; *field_ptr; field_ptr++) for (Field** field_ptr= tab->field; *field_ptr; field_ptr++)

View File

@ -327,21 +327,22 @@ public:
int m_period; int m_period;
std::mutex m_mtx; std::mutex m_mtx;
bool m_on; bool m_on;
std::atomic<bool> m_running; std::atomic<int> m_running;
void run() void run()
{ {
/* /*
In rare cases, multiple callbacks can be scheduled, In rare cases, multiple callbacks can be scheduled,
e.g with set_time(0,0) in a loop. at the same time,. e.g with set_time(0,0) in a loop.
We do not allow parallel execution, as user is not prepared. We do not allow parallel execution, since it is against the expectations.
*/ */
bool expected = false; if (m_running.fetch_add(1, std::memory_order_acquire) > 0)
if (!m_running.compare_exchange_strong(expected, true))
return; return;
do
m_callback(m_data); {
m_running = false; m_callback(m_data);
}
while (m_running.fetch_sub(1, std::memory_order_release) != 1);
if (m_pool && m_period) if (m_pool && m_period)
{ {