diff --git a/sql/create_options.cc b/sql/create_options.cc
index d956d01aa66abf80f69a92bc5cff13c34d09f8ed..774d739f153e40c8e4c248275a91a0532e86979d 100644
--- a/sql/create_options.cc
+++ b/sql/create_options.cc
@@ -743,9 +743,9 @@ engine_option_value *merge_engine_table_options(engine_option_value *first,
   DBUG_ENTER("merge_engine_table_options");
   LINT_INIT(end);
 
-  /* find last element */
-  if (first && second)
-    for (end= first; end->next; end= end->next) /* no-op */;
+  /* Create copy of first list */
+  for (opt= first, first= 0; opt; opt= opt->next)
+    new (root) engine_option_value(opt, &first, &end);
 
   for (opt= second; opt; opt= opt->next)
     new (root) engine_option_value(opt->name, opt->value, opt->quoted_value,
diff --git a/sql/create_options.h b/sql/create_options.h
index ea05bf75facc8e2fa38f189d871ad6874f235538..c7fac8b37fd2ec0d8992bf5f02f886c140548095 100644
--- a/sql/create_options.h
+++ b/sql/create_options.h
@@ -34,6 +34,13 @@ class engine_option_value: public Sql_alloc
   bool parsed;                  ///< to detect unrecognized options
   bool quoted_value;            ///< option=VAL vs. option='VAL'
 
+  engine_option_value(engine_option_value *src,
+                      engine_option_value **start, engine_option_value **end) :
+    name(src->name), value(src->value),
+    next(NULL), parsed(src->parsed), quoted_value(src->quoted_value)
+  {
+    link(start, end);
+  }
   engine_option_value(LEX_STRING &name_arg, LEX_STRING &value_arg, bool quoted,
                       engine_option_value **start, engine_option_value **end) :
     name(name_arg), value(value_arg),