From f485db429a26666a8468c1ec1227d6bd64a45682 Mon Sep 17 00:00:00 2001
From: unknown <konstantin@mysql.com>
Date: Thu, 31 Mar 2005 03:44:51 +0400
Subject: [PATCH] A fix for Bug#9443 "mysql_client_test fails on linux and some
 solaris platforms": yet another issue with floating pointer comparisons. The
 fix uses the workaround with volatiles.

sql/item_cmpfunc.cc:
  A fix for the failing mysql_client_test on some Intel platforms
  when compiled with optimization.
  We don't use -ffloat-store compileation as it may slow all
  floating point operations.
---
 sql/item_cmpfunc.cc | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 690da1be18..8498ab4800 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -393,10 +393,16 @@ int Arg_comparator::compare_e_binary_string()
 
 int Arg_comparator::compare_real()
 {
-  double val1= (*a)->val();
+  /*
+    Fix yet another manifestation of Bug#2338. 'Volatile' will instruct
+    gcc to flush double values out of 80-bit Intel FPU registers before
+    performing the comparison.
+  */
+  volatile double val1, val2;
+  val1= (*a)->val();
   if (!(*a)->null_value)
   {
-    double val2= (*b)->val();
+    val2= (*b)->val();
     if (!(*b)->null_value)
     {
       owner->null_value= 0;
-- 
2.30.9