Re: Broken tests

From: 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]$ >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >

« previous php.cvs (#83893) next »