Re: Broken tests
| From: | Keyur Govande | Date: | Fri, 26 Dec 2014 21:55:42 +0000 |
| Subject: | Re: Broken tests | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-83893@lists.php.net to get a copy of this message | ||
On Fri, Dec 26, 2014 at 4:26 PM, Dmitry Stogov <dmitry@zend.com> wrote:
> I tested with ext/mysqli compiled with libmysql instead of mysqlnd.
>
> Thanks. Dmitry.
>
Ah I see the problem now. I opened https://bugs.php.net/bug.php?id=68657
and will use similar logic that I put into mysqlnd_ps_codec.c's
ps_fetch_float() to handle 4 byte floats into mysqli_stmt_fetch_libmysql().
> On Sat, Dec 27, 2014 at 12:12 AM, Keyur Govande <keyurgovande@gmail.com>
> wrote:
>
>> For test 010.phpt, the difference between mysqli and libmysqlclient when
>> the values from the table "test_bind_fetch" are sprint'd with %.8f as the
>> format:
>>
>> MYSQLI: .....................
>> 3.14159300
>> -0.00000100
>> 0.00000000
>> 1000000000000.00000000
>> 0.56464250
>> 1.00000000
>> 888888900000000.00000000
>>
>> PDO (libmysqlclient): .....................
>> 3.14159000
>> -0.00000100
>> 0.00000000
>> 1000000000000.00000000
>> 0.56464200
>> 1.00000000
>> 888889000000000.00000000
>>
>> Is this the difference you're referring to? This one is a bit tricky to
>> fix because PDO gets back data from libmysqlclient as a string (converted
>> using fcvt or gcvt) unlike mysqli which reads the 4 byte float off of the
>> wire and directly uses that and hence is more precise.
>>
>> The previous diff you'd sent I can no longer reproduce with the
>> "volatile" patch:
>> 003+ float(3.141593)
>> 003- float(3.14159274101)
>> 005+ float(-1.0E-6)
>> 005- float(-9.99999997475E-7)
>>
>>
>> On Fri, Dec 26, 2014 at 3:40 PM, Dmitry Stogov <dmitry@zend.com> wrote:
>>
>>> the problem that libmysql behavior is different (tested at least on two
>>> different boxes).
>>>
>>> Thanks. Dmitry.
>>>
>>> On Fri, Dec 26, 2014 at 11:21 PM, Keyur Govande <keyurgovande@gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Fri, Dec 26, 2014 at 1:13 PM, Dmitry Stogov <dmitry@zend.com> wrote:
>>>>
>>>>> $ gcc --version
>>>>> gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
>>>>>
>>>>> $ rpm -qa | grep -i mariadb
>>>>> mariadb-libs-5.5.39-1.fc19.x86_64
>>>>> mariadb-devel-5.5.39-1.fc19.x86_64
>>>>> mariadb-server-5.5.39-1.fc19.x86_64
>>>>> mariadb-libs-5.5.39-1.fc19.i686
>>>>> mariadb-5.5.39-1.fc19.x86_64
>>>>>
>>>>> Thanks. Dmitry.
>>>>>
>>>>>
>>>> Thanks Dmitry.
>>>>
>>>> I have a program to reproduce the issue and you're initial hunch about
>>>> volatile was totally correct.
>>>>
>>>> #include <stdio.h>
>>>> #include <string.h>
>>>>
>>>> double getValue(float f) {
>>>> typedef float dec32 __attribute__((mode(SD)));
>>>> dec32 d32 = f;
>>>> return (double)d32;
>>>> }
>>>>
>>>> int main(int argc, char **argv) {
>>>> float f = 3.14159274f;
>>>>
>>>> double good = getValue(f);
>>>> double bad = (double)f;
>>>>
>>>> printf("good double: %.15f, bad double: %.15f, (good == bad):
>>>> %d\n", good, bad, (good == bad));
>>>> return 0;
>>>> }
>>>>
>>>> I had developed the feature using gcc 4.4.7 and the feature works
>>>> flawlessly over there. The output with -O2 is:
>>>> good double: 3.141593000000000, bad double: 3.141592741012573, (good ==
>>>> bad): 0
>>>>
>>>> When the exact same code is compiled with gcc 4.8.3 and -O2 though the
>>>> compiler optimizes away the conversion and the output becomes:
>>>> good double: 3.141592741012573, bad double: 3.141592741012573, (good ==
>>>> bad): 1
>>>>
>>>> When I add a volatile to the assignment of variable "d32" though, the
>>>> optimization is removed and the output is again as expected. Note that with
>>>> gcc 4.8.3 and -O0 the compiler does not try to be clever and hence the
>>>> output is the same as with gcc 4.4.7 which is why the DEBUG build continues
>>>> to work.
>>>>
>>>> With the fix the tests pass again. I will commit a fix to the repo.
>>>>
>>>>
>>>>>
>>>>> On Fri, Dec 26, 2014 at 9:09 PM, Keyur Govande <keyurgovande@gmail.com
>>>>> > wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, Dec 26, 2014 at 1:07 PM, Dmitry Stogov <dmitry@zend.com>
>>>>>> wrote:
>>>>>>
>>>>>>> I'm not sure if these results reflect the latest committed
>>>>>>> tests...
>>>>>>> But we definitely have some problem.
>>>>>>>
>>>>>>> I also tried "9.99" as was mentioned in your comments and got
>>>>>>> "9.99"
>>>>>>> in DEBUG build but, "9.99899..." in RELEASE and build with
>>>>>>> libmysql.
>>>>>>>
>>>>>>
>>>>>> So to get my environment set up correctly, can you tell me the
>>>>>> versions of gcc/clang, libmysqlclient, the Mysql server and PHP you're
>>>>>> using?
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Thanks. Dmitry.
>>>>>>>
>>>>>>> > mysqli fetch float values [ext/mysqli/tests/010.phpt]
>>>>>>> > mysqli fetch mixed values [ext/mysqli/tests/011.phpt]
>>>>>>> > mysqli fetch mixed values 2 [ext/mysqli/tests/012.phpt]
>>>>>>>
>>>>>>> $ cat ../ext/mysqli/tests/010.diff
>>>>>>> 003+ float(3.141593)
>>>>>>> 003- float(3.14159274101)
>>>>>>> 005+ float(-1.0E-6)
>>>>>>> 005- float(-9.99999997475E-7)
>>>>>>> 009+ float(1.0E+12)
>>>>>>> 009- float(999999995904)
>>>>>>> 011+ float(0.5646425)
>>>>>>> 011- float(0.564642488956)
>>>>>>> 015+ float(8.888889E+14)
>>>>>>> 015- float(8.88888914608E+14)
>>>>>>>
>>>>>>> $ cat ../ext/mysqli/tests/011.diff
>>>>>>> 011+ float(2345.6)
>>>>>>> 011- float(2345.60009766)
>>>>>>>
>>>>>>> $ cat ../ext/mysqli/tests/012.diff
>>>>>>> 011+ float(2.6)
>>>>>>> 011- float(2.59999990463)
>>>>>>>
>>>>>>> On Fri, Dec 26, 2014 at 8:56 PM, Keyur Govande <
>>>>>>> keyurgovande@gmail.com> wrote:
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Dec 26, 2014 at 12:53 PM, Dmitry Stogov
>>>>>>>> <dmitry@zend.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Keyer,
>>>>>>>>>
>>>>>>>>> In my tests (Linux x86 and x86_64) the current behavior of
>>>>>>>>> mysqlnd
>>>>>>>>> differ form libmysql.
>>>>>>>>>
>>>>>>>>> Also your patch works differently in DEBUG and RELEASE mode.
>>>>>>>>> GCC just eliminates double conversion and makes your patch
>>>>>>>>> useless
>>>>>>>>> for RELEASE build (this may be fixed adding
>>>>>>>>> "volatile")
>>>>>>>>> I'm not completely sure what behavior is right.
>>>>>>>>> It would be great if you decide what should be done with Andrey
>>>>>>>>> and fix this.
>>>>>>>>>
>>>>>>>>> The fixes back and forth were done because of misunderstanding
>>>>>>>>> of
>>>>>>>>> real problem.
>>>>>>>>>
>>>>>>>>> Thanks. Dmitry.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Hi Dmitry,
>>>>>>>>
>>>>>>>> Can you provide a test script and outputs you're seeing so I
>>>>>>>> can
>>>>>>>> try to reproduce it?
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Fri, Dec 26, 2014 at 8:25 PM, Keyur Govande <
>>>>>>>>> keyurgovande@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, Dec 26, 2014 at 10:14 AM, Dmitry Stogov
>>>>>>>>>> <dmitry@zend.com>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> It seems like the source of the problem is commit
>>>>>>>>>>> c044164a
>>>>>>>>>>> authored by Keyur,
>>>>>>>>>>>
>>>>>>>>>>> I caught the problem because the behavior is different
>>>>>>>>>>> in DEBUG
>>>>>>>>>>> and RELEASE builds.
>>>>>>>>>>> However, I think the behavior introduced by that patch
>>>>>>>>>>> may be
>>>>>>>>>>> wrong.
>>>>>>>>>>> At least it produces different results in comparison to
>>>>>>>>>>> libmysql.
>>>>>>>>>>>
>>>>>>>>>>> Andrey, please made a decision.
>>>>>>>>>>>
>>>>>>>>>>> Thanks. Dmitry.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hello,
>>>>>>>>>>
>>>>>>>>>> I am a bit confused...I see that commit c2a047cf reverts my
>>>>>>>>>> commit to fix failing tests (4e2c016). But then c2a047cf
>>>>>>>>>> was also reverted
>>>>>>>>>> back by 4409b6db3 a few hours back.
>>>>>>>>>>
>>>>>>>>>> Is there something I can help with? The original patch
>>>>>>>>>> c044164a
>>>>>>>>>> was authored to fix bug #67839 and bring mysqli in parity
>>>>>>>>>> with libmysql's
>>>>>>>>>> behavior on floating point numbers.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Keyur.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> ---------- Forwarded message ----------
>>>>>>>>>>> From: Dmitry Stogov <dmitry@zend.com>
>>>>>>>>>>> Date: Fri, Dec 26, 2014 at 5:18 PM
>>>>>>>>>>> Subject: Broken tests
>>>>>>>>>>> To: Xinchen Hui <xinchen.h@zend.com>
>>>>>>>>>>> Cc: keyur_govande@yahoo.com,
>>>>>>>>>>> "php-cvs@lists.php.net" <
>>>>>>>>>>> php-cvs@lists.php.net>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi Xinchen,
>>>>>>>>>>>
>>>>>>>>>>> The commit c2a047cf99f3d020bab12701e8dafed7424673bf
>>>>>>>>>>> made few
>>>>>>>>>>> tests to start fail on 32-bit DEBUG build. The same
>>>>>>>>>>> tests seems to work in
>>>>>>>>>>> RELEASE build.
>>>>>>>>>>>
>>>>>>>>>>> Are you sure these the are changed in a proper way?
>>>>>>>>>>> For me it looks like something was broken in code, and
>>>>>>>>>>> then
>>>>>>>>>>> tests were adjusted for wrong new behaviour.
>>>>>>>>>>>
>>>>>>>>>>> Please, find the source of the problem.
>>>>>>>>>>>
>>>>>>>>>>> Thanks. Dmitry.
>>>>>>>>>>>
>>>>>>>>>>> > mysqli fetch float values
>>>>>>>>>>> > [ext/mysqli/tests/010.phpt]
>>>>>>>>>>> > mysqli fetch mixed values
>>>>>>>>>>> > [ext/mysqli/tests/011.phpt]
>>>>>>>>>>> > mysqli fetch mixed values 2
>>>>>>>>>>> > [ext/mysqli/tests/012.phpt]
>>>>>>>>>>>
>>>>>>>>>>> $ cat ../ext/mysqli/tests/010.diff
>>>>>>>>>>> 003+ float(3.141593)
>>>>>>>>>>> 003- float(3.14159274101)
>>>>>>>>>>> 005+ float(-1.0E-6)
>>>>>>>>>>> 005- float(-9.99999997475E-7)
>>>>>>>>>>> 009+ float(1.0E+12)
>>>>>>>>>>> 009- float(999999995904)
>>>>>>>>>>> 011+ float(0.5646425)
>>>>>>>>>>> 011- float(0.564642488956)
>>>>>>>>>>> 015+ float(8.888889E+14)
>>>>>>>>>>> 015- float(8.88888914608E+14)
>>>>>>>>>>>
>>>>>>>>>>> $ cat ../ext/mysqli/tests/011.diff
>>>>>>>>>>> 011+ float(2345.6)
>>>>>>>>>>> 011- float(2345.60009766)
>>>>>>>>>>>
>>>>>>>>>>> $ cat ../ext/mysqli/tests/012.diff
>>>>>>>>>>> 011+ float(2.6)
>>>>>>>>>>> 011- float(2.59999990463)[dmitry@tpl2 CGI-DEBUG]$
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>