Bug #115465 Not allowing move semantic on variadic template arguments
Submitted: 30 Jun 2:35 Modified: 1 Jul 9:56
Reporter: Ali Asadpoor Email Updates:
Status: Closed Impact on me:
None 
Category:Connector / C++ Severity:S5 (Performance)
Version:8 OS:Any
Assigned to: MySQL Verification Team CPU Architecture:Any

[30 Jun 2:35] Ali Asadpoor
Description:
My Code:

std::pair<std::size_t, std::string> handler::create_session(
    mysqlx::Session& sql_session, std::size_t user_id)
{
    uuid_t token;
    uuid_generate(token);
    auto query = sql_session.getDefaultSchema()
        .getTable("session")
        .insert("user", "token", "version", "when")
        .values(user_id, mysqlx::bytes{ std::begin(token), std::end(token) },
            "0.0.0", mysqlx::expr("UNIX_TIMESTAMP()"))
        .execute();
    return { query.getAutoIncrementValue(), unhex(token) };
}

Compiler Error:

In file included from /usr/include/mysql-cppconn-8/mysqlx/xdevapi.h:96,
                 from /tmp/deploy/mirakat-api/main/deb/repo/src/handler.h:19,
                 from /tmp/deploy/mirakat-api/main/deb/repo/src/http.h:10,
                 from /tmp/deploy/mirakat-api/main/deb/repo/src/handler.cpp:12:
/usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h: In instantiation of ‘mysqlx::abi2::r0
::TableInsert& mysqlx::abi2::r0::TableInsert::values(Types ...) [with Types = {long unsigned i
nt, mysqlx::abi2::r0::bytes, const char*, mysqlx::abi2::r0::internal::Expression}]’:
/tmp/deploy/mirakat-api/main/deb/repo/src/handler.cpp:521:16:   required from here
/usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h:157:17: error: ‘mysqlx::abi2::r0::inte
rnal::Expression::Expression(V&&) [with V = mysqlx::abi2::r0::internal::Expression&]’ is priva
te within this context
  157 |       add_values(get_impl(), rest...);
      |       ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/mysql-cppconn-8/mysqlx/devapi/result.h:40,
                 from /usr/include/mysql-cppconn-8/mysqlx/xdevapi.h:94:
/usr/include/mysql-cppconn-8/mysqlx/devapi/document.h:600:3: note: declared private here
  600 |   Expression(V&& val)
      |   ^~~~~~~~~~
In file included from /usr/include/mysql-cppconn-8/mysqlx/devapi/crud.h:41,
                 from /usr/include/mysql-cppconn-8/mysqlx/devapi/collection_crud.h:75,
                 from /usr/include/mysql-cppconn-8/mysqlx/xdevapi.h:95:
/usr/include/mysql-cppconn-8/mysqlx/devapi/detail/crud.h:259:39: note:   initializing argument
 5 of ‘static void mysqlx::abi2::r0::internal::Table_insert_detail::add_values(Impl*, T ...) [
with T = {long unsigned int, mysqlx::abi2::r0::bytes, const char*, mysqlx::abi2::r0::internal:
:Expression}; Impl = mysqlx::abi2::r0::common::Table_insert_if<mysqlx::abi2::r0::internal::Row
_detail::Impl>]’
  259 |   static void add_values(Impl *impl, T... args)
      |                                      ~^~~~~~~~
gmake[2]: *** [src/CMakeFiles/mirakat-api-main-lib.dir/build.make:90: src/CMakeFiles/mirakat-a
pi-main-lib.dir/handler.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:1026: src/CMakeFiles/mirakat-api-main-lib.dir/all] Error 2
gmake: *** [Makefile:166: all] Error 2
command failed

How to repeat:
Compiling the code will cause the error.

Suggested fix:
sudo patch /usr/include/mysql-cppconn-8/mysqlx/devapi/detail/crud.h <<"EOFF"
--- /usr/include/mysql-cppconn-8/mysqlx/devapi/detail/crud.h.old        2022-10-21 19:27:02.069606084 -0400
+++ /usr/include/mysql-cppconn-8/mysqlx/devapi/detail/crud.h    2022-10-21 19:26:22.529044685 -0400
@@ -256,10 +256,10 @@
   }
 
   template <typename... T>
-  static void add_values(Impl *impl, T... args)
+  static void add_values(Impl *impl, T&&... args)
   {
     Add_value::Impl row{ {}, 0 };
-    Args_processor<Add_value>::process_args(&row, args...);
+    Args_processor<Add_value>::process_args(&row, std::forward<T>(args)...);
     Add_row::process_one(impl, row.first);
   }
 
EOFF

sudo patch /usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h <<"EOFF"
--- /usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h.old 2022-10-05 05:00:58.000000000 -0400
+++ /usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h     2022-10-21 18:27:22.683909434 -0400
@@ -151,10 +151,10 @@
   */
 
   template<typename... Types>
-  TableInsert& values(Types... rest)
+  TableInsert& values(Types&&... rest)
   {
     try {
-      add_values(get_impl(), rest...);
+      add_values(get_impl(), std::forward<Types>(rest)...);
       return *this;
     }
     CATCH_AND_WRAP
EOFF