Bug #28184 min() and max() macro defines in my_global.h conflict with c++ headers
Submitted: 1 May 2007 18:26 Modified: 27 Nov 2007 19:11
Reporter: Arkadiusz Miskiewicz (Basic Quality Contributor) Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Compiling Severity:S3 (Non-critical)
Version:5.1.17, 5.0.37,6.0 OS:Any
Assigned to: CPU Architecture:Any
Tags: Contribution, qc

[1 May 2007 18:26] Arkadiusz Miskiewicz
Description:
my_global.h contains:
#if !defined(max)
#define max(a, b)       ((a) > (b) ? (a) : (b))
#define min(a, b)       ((a) < (b) ? (a) : (b))
#endif

which are highly problematic when building with upcoming gcc 4.2.0 because:

x86_64-pld-linux-g++ -DUNDEF_THREADS_HACK -DDEFAULT_MYSQL_HOME="\"/usr\"" -DDATADIR="\"/var/lib/mysql\"" -I. -I.. -I../include -I../include -I../regex     -O2 -fno-strict-aliasing -fwrapv -march=x86-64 -gdwarf-2 -g2  -felide-constructors -fno-rtti -fno-exceptions -fomit-frame-pointer   -fno-implicit-templates -fno-exceptions -fno-rtti  -MT mysqladmin.o -MD -MP -MF .deps/mysqladmin.Tpo -c -o mysqladmin.o mysqladmin.cc
sql_string.cc: In member function 'int String::reserve(uint32, uint32)':
sql_string.cc:665: error: 'max' was not declared in this scope
sql_string.cc: In function 'int stringcmp(const String*, const String*)':
sql_string.cc:751: error: 'min' was not declared in this scope
sql_string.cc: In function 'String* copy_if_not_alloced(String*, String*, uint32)':
sql_string.cc:768: error: 'min' was not declared in this scope

and that's because /usr/include/c++/4.2.0/limits contains:
  template<typename _Tp>
    struct numeric_limits : public __numeric_limits_base
    {
      /** The minimum finite value, or for floating types with
          denormalization, the minimum positive normalized value.  */
      static _Tp min() throw() { return static_cast<_Tp>(0); }
      /** The maximum finite value.  */
      static _Tp max() throw() { return static_cast<_Tp>(0); }

How to repeat:
build mysql 5.1.17 with gcc 4.2.0rc1

Suggested fix:
Change names of macros from min to mysql_min and max to mysql_max.

Workaround patch:
http://cvs.pld-linux.org/cgi-bin/cvsweb/SOURCES/mysql-min_max.patch?rev=1.2
but clean solution is to rename these everywhere in source code.
[1 May 2007 19:00] Valeriy Kravchuk
Thank you for a problem report. Verified just as described with code review.
[10 Jul 2007 7:32] Arkadiusz Miskiewicz
Replaces min() max() with mysql_min() and mysql_max()

Attachment: mysql-min_max.patch (application/octet-stream, text), 142.99 KiB.

[10 Jul 2007 7:33] Arkadiusz Miskiewicz
Compile tested. Replaces all (hope that I didn't miss anything in code that's not compiled in by default) occurences of min() and max() with non-conflicting mysql_min() and mysql_max().

Please review and merge since the bug is annoying for anyone using recent compiler (note, gcc 4.2.0 was already released some time ago).
[10 Jul 2007 21:42] Sergei Golubchik
see also http://lists.mysql.com/internals/34680 and references therein
[11 Jul 2007 13:09] Arkadiusz Miskiewicz
Uppercasing to indicate that these are macros is a good idea. So after applying my patch:

find . -type f -exec sed -i -e 's|mysql_min|MYSQL_MIN|g' -e 's|mysql_max|MYSQL_MAX|g' '{}' ';'
[23 Jul 2007 13:04] Paul DuBois
This occurs now on Gentoo Linux, for which a 4.2.0 ebuild has been released recently.

% gcc --version
gcc (GCC) 4.2.0 (Gentoo 4.2.0 p1.4)

Affects the 5.1, 5.1-falcon, and 5.2 bk trees.
[12 Nov 2007 17:28] Hartmut Holzgraefe
Also affects Debian "testing" and "unstable" as both have gcc 4.2.x as default compiler now (probably also some Ubuntu versions?)
[12 Nov 2007 17:44] Arkadiusz Miskiewicz
We use smaller version mentioned earlier in commeents:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/~checkout~/SOURCES/mysql-min_max.patch?rev=1.6...
Works.
[23 Nov 2007 13:30] Hartmut Holzgraefe
Fixed by

http://mysql.bkbits.net:8080/mysql-5.1/?PAGE=cset&REV=46dbec1c1lAGFuqFZQy58XVe4KSijg
[26 Nov 2007 18:28] Paul DuBois
Noted in 5.1.23, 6.0.4 changelogs.

MySQL now can be compiled with gcc 4.2.x. There was a problem 
involving a conflict with the min() and max() macros in my_global.h,
which now have been renamed to mysql_min() and mysql_max().
[26 Nov 2007 19:21] Sergei Golubchik
No, they weren't renamed, see the patch at the link
[27 Nov 2007 19:11] Paul DuBois
Removed the "which have been renamed" part from the changelog entry.
[1 May 2013 17:06] Jon Baker
Is this still fixed?  I'm running into this issue using mysql-devel-5.5-1.3