summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2018-09-16 10:22:32 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2018-09-16 10:22:32 +0400
commite89b611dc9535183d617391c4d1229f0bca66d31 (patch)
treea1cfac73b56fd51e901fd9e58ecc203e0cd31e22 /sql
parent7419f72b7183e40a24cd53a139b78aeaf41503d2 (diff)
downloadmariadb-git-e89b611dc9535183d617391c4d1229f0bca66d31.tar.gz
MDEV-16050 cte + geometry functions lead to crash.
Structures based on Gcalc_dyn_list need to be treated properly when copied in Item::get_copy().
Diffstat (limited to 'sql')
-rw-r--r--sql/gcalc_slicescan.cc11
-rw-r--r--sql/gcalc_slicescan.h7
-rw-r--r--sql/gcalc_tools.cc11
-rw-r--r--sql/gcalc_tools.h1
4 files changed, 30 insertions, 0 deletions
diff --git a/sql/gcalc_slicescan.cc b/sql/gcalc_slicescan.cc
index ab48542add6..68764205302 100644
--- a/sql/gcalc_slicescan.cc
+++ b/sql/gcalc_slicescan.cc
@@ -177,6 +177,17 @@ Gcalc_dyn_list::Gcalc_dyn_list(size_t blk_size, size_t sizeof_item):
{}
+Gcalc_dyn_list::Gcalc_dyn_list(const Gcalc_dyn_list &dl)
+{
+ m_blk_size= dl.m_blk_size;
+ m_sizeof_item= dl.m_sizeof_item;
+ m_points_per_blk= dl.m_points_per_blk;
+ m_blk_hook= &m_first_blk;
+ m_free= NULL;
+ m_keep= NULL;
+}
+
+
void Gcalc_dyn_list::format_blk(void* block)
{
Item *pi_end, *cur_pi, *first_pi;
diff --git a/sql/gcalc_slicescan.h b/sql/gcalc_slicescan.h
index b9516fc8d8c..ebf173c1a57 100644
--- a/sql/gcalc_slicescan.h
+++ b/sql/gcalc_slicescan.h
@@ -63,6 +63,7 @@ public:
};
Gcalc_dyn_list(size_t blk_size, size_t sizeof_item);
+ Gcalc_dyn_list(const Gcalc_dyn_list &dl);
~Gcalc_dyn_list();
Item *new_item()
{
@@ -229,6 +230,12 @@ public:
Gcalc_dyn_list(blk_size, sizeof(Info)),
m_hook(&m_first), m_n_points(0)
{}
+
+ Gcalc_heap(const Gcalc_heap &gh) :
+ Gcalc_dyn_list(gh),
+ m_hook(&m_first), m_n_points(0)
+ {}
+
void set_extent(double xmin, double xmax, double ymin, double ymax);
Info *new_point_info(double x, double y, gcalc_shape_info shape);
void free_point_info(Info *i, Gcalc_dyn_list::Item **i_hook);
diff --git a/sql/gcalc_tools.cc b/sql/gcalc_tools.cc
index 71118ae1c9f..b472665d0d2 100644
--- a/sql/gcalc_tools.cc
+++ b/sql/gcalc_tools.cc
@@ -663,6 +663,17 @@ Gcalc_operation_reducer::Gcalc_operation_reducer(size_t blk_size) :
{}
+Gcalc_operation_reducer::Gcalc_operation_reducer(
+ const Gcalc_operation_reducer &gor) :
+ Gcalc_dyn_list(gor),
+#ifndef GCALC_DBUG_OFF
+ n_res_points(0),
+#endif /*GCALC_DBUG_OFF*/
+ m_res_hook((Gcalc_dyn_list::Item **)&m_result),
+ m_first_active_thread(NULL)
+{}
+
+
void Gcalc_operation_reducer::init(Gcalc_function *fn, modes mode)
{
m_fn= fn;
diff --git a/sql/gcalc_tools.h b/sql/gcalc_tools.h
index 8bda3c144a6..4d5aec0d443 100644
--- a/sql/gcalc_tools.h
+++ b/sql/gcalc_tools.h
@@ -224,6 +224,7 @@ public:
};
Gcalc_operation_reducer(size_t blk_size=8192);
+ Gcalc_operation_reducer(const Gcalc_operation_reducer &gor);
void init(Gcalc_function *fn, modes mode= default_mode);
Gcalc_operation_reducer(Gcalc_function *fn, modes mode= default_mode,
size_t blk_size=8192);