Download raw body.
databases/mariadb: use bundled fmt
On Sun, Jan 14, 2024 at 07:48:48PM +0000, Klemens Nanni wrote:
> On Mon, Nov 06, 2023 at 10:03:22AM +0000, Stuart Henderson wrote:
> > Tried it before, this update breaks mariadb.
>
> libfmt is still behind, perhaps we want to stick to mariadb's 8.0.1 bundle?
> It'd be a downgrade from ports 8.1.1, but mariadb builds and libfmt could
> be updated.
>
> Just a tiny .cmake patch and usual DISTFILES goo.
>
> Builds, but I don't use MariaDB.
> Thoughts?
This should fix building with newer fmt. Only build tested with the
in tree version.
Index: Makefile
===================================================================
RCS file: /home/cvs/ports/databases/mariadb/Makefile,v
diff -u -p -u -p -r1.143 Makefile
--- Makefile 20 Sep 2023 13:30:06 -0000 1.143
+++ Makefile 15 Jan 2024 02:22:18 -0000
@@ -5,6 +5,7 @@ COMMENT-tests= multithreaded SQL databas
VERSION= 10.9.6
DISTNAME= mariadb-${VERSION}
PKGNAME-main= mariadb-client-${VERSION}
+REVISION-server= 0
EPOCH= 1
CATEGORIES= databases
SITES= https://downloads.mariadb.com/MariaDB/${DISTNAME}/source/ \
Index: patches/patch-cmake_libfmt_cmake
===================================================================
RCS file: patches/patch-cmake_libfmt_cmake
diff -N patches/patch-cmake_libfmt_cmake
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-cmake_libfmt_cmake 15 Jan 2024 01:15:46 -0000
@@ -0,0 +1,21 @@
+MDEV-31963 cmake: fix libfmt usage
+
+`fmt::detail::make_arg` does not accept temporaries, so the code snippet
+checking system libfmt needs to be adjusted.
+
+f4cec369a392c8a6056207012992ad4a5639965a
+
+Index: cmake/libfmt.cmake
+--- cmake/libfmt.cmake.orig
++++ cmake/libfmt.cmake
+@@ -33,8 +33,9 @@ MACRO (CHECK_LIBFMT)
+ #include <fmt/format-inl.h>
+ #include <iostream>
+ int main() {
++ int answer= 42;
+ fmt::format_args::format_arg arg=
+- fmt::detail::make_arg<fmt::format_context>(42);
++ fmt::detail::make_arg<fmt::format_context>(answer);
+ std::cout << fmt::vformat(\"The answer is {}.\",
+ fmt::format_args(&arg, 1));
+ }" HAVE_SYSTEM_LIBFMT)
Index: patches/patch-sql_item_strfunc_cc
===================================================================
RCS file: patches/patch-sql_item_strfunc_cc
diff -N patches/patch-sql_item_strfunc_cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-sql_item_strfunc_cc 15 Jan 2024 01:16:26 -0000
@@ -0,0 +1,98 @@
+[PATCH] MDEV-31963 Fix libfmt usage in SFORMAT
+
+`fmt::detail::make_arg` does not accept temporaries. Make it happy by
+storing the format arg values in a temporary array first.
+
+cd5808eb8da13c5626d4bdeb452cef6ada29cb1d
+
+Index: sql/item_strfunc.cc
+--- sql/item_strfunc.cc.orig
++++ sql/item_strfunc.cc
+@@ -1382,11 +1382,24 @@ namespace fmt {
+ */
+ String *Item_func_sformat::val_str(String *res)
+ {
++ /*
++ A union that stores a numeric format arg value.
++ fmt::detail::make_arg does not accept temporaries, so all of its numeric
++ args are temporarily stored in the fmt_args array.
++ See: https://github.com/fmtlib/fmt/issues/3596
++ */
++ union Format_arg_store {
++ longlong val_int;
++ float val_float;
++ double val_double;
++ };
++
+ DBUG_ASSERT(fixed());
+- using ctx= fmt::format_context;
+- String *fmt_arg= NULL;
+- String *parg= NULL;
+- fmt::format_args::format_arg *vargs= NULL;
++ using ctx= fmt::format_context;
++ String *fmt_arg= NULL;
++ String *parg= NULL;
++ fmt::format_args::format_arg *vargs= NULL;
++ Format_arg_store *fmt_args= NULL;
+
+ null_value= true;
+ if (!(fmt_arg= args[0]->val_str(res)))
+@@ -1395,25 +1408,39 @@ String *Item_func_sformat::val_str(String *res)
+ if (!(vargs= new fmt::format_args::format_arg[arg_count - 1]))
+ return NULL;
+
++ if (!(fmt_args= new Format_arg_store[arg_count - 1]))
++ {
++ delete [] vargs;
++ return NULL;
++ }
++
+ /* Creates the array of arguments for vformat */
+ for (uint carg= 1; carg < arg_count; carg++)
+ {
+ switch (args[carg]->result_type())
+ {
+ case INT_RESULT:
+- vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_int());
++ fmt_args[carg-1].val_int= args[carg]->val_int();
++ vargs[carg-1]= fmt::detail::make_arg<ctx>(fmt_args[carg-1].val_int);
+ break;
+ case DECIMAL_RESULT: // TODO
+ case REAL_RESULT:
+ if (args[carg]->field_type() == MYSQL_TYPE_FLOAT)
+- vargs[carg-1]= fmt::detail::make_arg<ctx>((float)args[carg]->val_real());
++ {
++ fmt_args[carg-1].val_float= (float)args[carg]->val_real();
++ vargs[carg-1]= fmt::detail::make_arg<ctx>(fmt_args[carg-1].val_float);
++ }
+ else
+- vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_real());
++ {
++ fmt_args[carg-1].val_double= args[carg]->val_real();
++ vargs[carg-1]= fmt::detail::make_arg<ctx>(fmt_args[carg-1].val_double);
++ }
+ break;
+ case STRING_RESULT:
+ if (!(parg= args[carg]->val_str(&val_arg[carg-1])))
+ {
+ delete [] vargs;
++ delete [] fmt_args;
+ return NULL;
+ }
+ vargs[carg-1]= fmt::detail::make_arg<ctx>(*parg);
+@@ -1423,6 +1450,7 @@ String *Item_func_sformat::val_str(String *res)
+ default:
+ DBUG_ASSERT(0);
+ delete [] vargs;
++ delete [] fmt_args;
+ return NULL;
+ }
+ }
+@@ -1446,6 +1474,7 @@ String *Item_func_sformat::val_str(String *res)
+ null_value= true;
+ }
+ delete [] vargs;
++ delete [] fmt_args;
+ return null_value ? NULL : res;
+ }
+
databases/mariadb: use bundled fmt