summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorOleg Smirnov <olernov@gmail.com>2023-01-29 19:39:14 +0700
committerOleg Smirnov <olernov@gmail.com>2023-04-19 17:08:29 +0700
commit135f877f278d4e85cf8ecb83385b5631cb20229d (patch)
treeea6a78f52701104fc08246ceda172a35657b2328 /sql/sql_select.cc
parent2e1c532bd2d9f9a35559e54f66d33c81e33009b1 (diff)
downloadmariadb-git-bb-10.4-mdev-30143.tar.gz
MDEV-30143 Segfault on select query using index for group-by and filesortbb-10.4-mdev-30143
The problem was trying to access JOIN_TAB::select which is set to NULL when using the filesort. The correct way is accessing either JOIN_TAB::select or JOIN_TAB::filesort->select depending on whether the filesort is used. This commit introduces member function JOIN_TAB::get_sql_select() encapsulating that check so the code duplication is eliminated
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 0651c1d58bd..0048d36d2ea 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8100,6 +8100,7 @@ best_access_path(JOIN *join,
if ((records >= s->found_records || best > s->read_time) && // (1)
!(best_key && best_key->key == MAX_KEY) && // (2)
!(s->quick && best_key && s->quick->index == best_key->key && // (2)
+ s->table->quick_keys.is_set(best_key->key) && // (2)
best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2)
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3)
@@ -13761,7 +13762,7 @@ double JOIN_TAB::scan_time()
ha_rows JOIN_TAB::get_examined_rows()
{
double examined_rows;
- SQL_SELECT *sel= filesort? filesort->select : this->select;
+ const SQL_SELECT *sel= get_sql_select();
if (sel && sel->quick && use_quick != 2)
examined_rows= (double)sel->quick->records;
@@ -26770,13 +26771,12 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta,
eta->key.clear();
eta->quick_info= NULL;
- SQL_SELECT *tab_select;
/*
We assume that if this table does pre-sorting, then it doesn't do filtering
with SQL_SELECT.
*/
DBUG_ASSERT(!(select && filesort));
- tab_select= (filesort)? filesort->select : select;
+ const SQL_SELECT *tab_select= get_sql_select();
if (filesort)
{