]> granicus.if.org Git - php/commitdiff
fix precision when fetching float through mysqlnd
authorAnatol Belski <ab@php.net>
Wed, 10 Sep 2014 17:29:11 +0000 (19:29 +0200)
committerAnatol Belski <ab@php.net>
Wed, 10 Sep 2014 17:29:11 +0000 (19:29 +0200)
fixes failing ext/mysqli/tests/010.phpt

ext/mysqlnd/mysqlnd_ps_codec.c

index fa4ed9da6f30e22e408c2b521bdd5145c38f20aa..d96091210b3a5802c4873e229f8da6e72dec82de 100644 (file)
@@ -200,17 +200,27 @@ ps_fetch_float(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_l
                /* The following cast is guaranteed to do the right thing */
                dval = (double) d32val;
        }
+#elif defined(PHP_WIN32)
+       {
+               /* float datatype on Winows is already 4 byte but has a precision of 7 digits */
+               char num_buf[2048];
+               (void)_gcvt_s(num_buf, 2048, fval, field->decimals >= 31 ? 7 : field->decimals);
+               dval = zend_strtod(num_buf, NULL);
+       }
 #else
        {
                char num_buf[2048]; /* Over allocated */
                char *s;
 
+#ifndef FLT_DIG
+# define FLT_DIG 6
+#endif
                /* Convert to string. Ignoring localization, etc.
                 * Following MySQL's rules. If precision is undefined (NOT_FIXED_DEC i.e. 31)
                 * or larger than 31, the value is limited to 6 (FLT_DIG).
                 */
                s = php_gcvt(fval,
-                            field->decimals >= 31 ? 6 : field->decimals,
+                            field->decimals >= 31 ? FLT_DIG : field->decimals,
                             '.',
                             'e',
                             num_buf);