From 1fa1ea0f2df62796a89df8f00f49a4e77d7cf478 Mon Sep 17 00:00:00 2001
From: Sergei Golubchik <sergii@pisem.net>
Date: Wed, 19 Mar 2014 09:58:18 +0100
Subject: [PATCH] MDEV-5404 Can't free data returned by mariadb_dyncol_unpack
 on windows

add mariadb_dyncol_unpack_free()
---
 include/ma_dyncol.h               |  3 +++
 libmysql/CMakeLists.txt           |  1 +
 mysys/ma_dyncol.c                 | 12 ++++++++++++
 storage/cassandra/ha_cassandra.cc | 13 +++----------
 4 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/include/ma_dyncol.h b/include/ma_dyncol.h
index cacd8f66c50..cb03ccb5382 100644
--- a/include/ma_dyncol.h
+++ b/include/ma_dyncol.h
@@ -220,6 +220,9 @@ mariadb_dyncol_unpack(DYNAMIC_COLUMN *str,
                       uint *count,
                       MYSQL_LEX_STRING **names, DYNAMIC_COLUMN_VALUE **vals);
 
+void mariadb_dyncol_unpack_free(MYSQL_LEX_STRING *names,
+                                DYNAMIC_COLUMN_VALUE *vals);
+
 int mariadb_dyncol_column_cmp_named(const MYSQL_LEX_STRING *s1,
                                     const MYSQL_LEX_STRING *s2);
 
diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt
index e3c932c88f0..9480b2b218c 100644
--- a/libmysql/CMakeLists.txt
+++ b/libmysql/CMakeLists.txt
@@ -248,6 +248,7 @@ mariadb_dyncol_val_str
 mariadb_dyncol_val_long
 mariadb_dyncol_val_double
 mariadb_dyncol_unpack
+mariadb_dyncol_unpack_free
 mariadb_dyncol_column_cmp_named
 mariadb_dyncol_column_count
 mariadb_dyncol_prepare_decimal
diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c
index 98319f2aafe..3b5e05f1b01 100644
--- a/mysys/ma_dyncol.c
+++ b/mysys/ma_dyncol.c
@@ -4316,6 +4316,18 @@ err:
   return rc;
 }
 
+/**
+  Free arrays allocated by mariadb_dyncol_unpack()
+
+  @param names           Where to put names (should be free by user)
+  @param vals            Where to put values (should be free by user)
+*/
+void mariadb_dyncol_unpack_free(LEX_STRING *names, DYNAMIC_COLUMN_VALUE *vals)
+{
+  my_free(names);
+  my_free(vals);
+}
+
 /**
   Get not NULL column count
 
diff --git a/storage/cassandra/ha_cassandra.cc b/storage/cassandra/ha_cassandra.cc
index 3fbe1834f89..7e2d7efe87d 100644
--- a/storage/cassandra/ha_cassandra.cc
+++ b/storage/cassandra/ha_cassandra.cc
@@ -1925,16 +1925,9 @@ int ha_cassandra::write_dynamic_row(uint count,
 void ha_cassandra::free_dynamic_row(DYNAMIC_COLUMN_VALUE **vals,
                                     LEX_STRING **names)
 {
-  if (*vals)
-  {
-    my_free(*vals);
-    *vals= 0;
-  }
-  if (*names)
-  {
-    my_free(*names);
-    *names= 0;
-  }
+  mariadb_dyncol_unpack_free(*names, *vals);
+  *vals= 0;
+  *names= 0;
 }
 
 int ha_cassandra::write_row(uchar *buf)