andrey Wed Nov 30 11:20:25 2005 EDT Added files: (Branch: PHP_5_1) /php-src/ext/mysqli/tests bug35103.phpt
Modified files: /php-src/ext/mysqli mysqli_api.c Log: add a test case fix incorrect handling of unsigned bigint. optimize handling of unsigned int http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_api.c?r1=1.118.2.8&r2=1.118.2.9&ty=u Index: php-src/ext/mysqli/mysqli_api.c diff -u php-src/ext/mysqli/mysqli_api.c:1.118.2.8 php-src/ext/mysqli/mysqli_api.c:1.118.2.9 --- php-src/ext/mysqli/mysqli_api.c:1.118.2.8 Wed Nov 30 10:26:39 2005 +++ php-src/ext/mysqli/mysqli_api.c Wed Nov 30 11:20:22 2005 @@ -15,7 +15,7 @@ | Author: Georg Richter <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: mysqli_api.c,v 1.118.2.8 2005/11/30 15:26:39 andrey Exp $ + $Id: mysqli_api.c,v 1.118.2.9 2005/11/30 16:20:22 andrey Exp $ */ #ifdef HAVE_CONFIG_H @@ -617,8 +617,7 @@ zval *mysql_stmt; unsigned int i; ulong ret; - int lval; - unsigned int ulval; + unsigned int uval; double dval; my_ulonglong llval; @@ -653,19 +652,24 @@ && (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)) { /* unsigned int (11) */ - char tmp[12]; - memcpy (&ulval, stmt->result.buf[i].val, sizeof(lval)); - if (ulval > INT_MAX) { - sprintf((char *)&tmp, "%u", ulval); - ZVAL_STRING(stmt->result.vars[i], tmp, 1); - } else { - memcpy(&lval, stmt->result.buf[i].val, sizeof(lval)); - ZVAL_LONG(stmt->result.vars[i], lval); + uval= *(unsigned int *) stmt->result.buf[i].val; + + if (uval > INT_MAX) { + char *tmp, *p; + int j=10; + tmp= emalloc(11); + p= &tmp[9]; + do { + *p-- = (uval % 10) + 48; + uval = uval / 10; + } while (--j > 0); + tmp[10]= '\0'; + /* unsigned int > INT_MAX is 10 digis - ALWAYS */ + ZVAL_STRINGL(stmt->result.vars[i], tmp, 10, 0); + break; } - } else { - memcpy(&lval, stmt->result.buf[i].val, sizeof(lval)); - ZVAL_LONG(stmt->result.vars[i], lval); } + ZVAL_LONG(stmt->result.vars[i], *(int *)stmt->result.buf[i].val); break; case IS_DOUBLE: memcpy(&dval, stmt->result.buf[i].val, sizeof(dval)); @@ -673,14 +677,21 @@ break; case IS_STRING: if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG) { - char tmp[50]; - memcpy (&llval, stmt->result.buf[i].val, sizeof(my_ulonglong)); - if (llval != (long)llval) { + my_bool uns= (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? 1:0; + llval= *(my_ulonglong *) stmt->result.buf[i].val; +#if SIZEOF_LONG==8 + if (uns && llval > 9223372036854775807L) { +#elif SIZEOF_LONG==4 + if ((uns && llval > 2147483647LL) || + (!uns && (( 2147483647LL < (long long) llval) || (-2147483648LL > (long long) llval)))) + { +#endif + char tmp[22]; /* even though lval is declared as unsigned, the value * may be negative. Therefor we cannot use %llu and must * use %lld. */ - sprintf((char *)&tmp, "%lld", llval); + sprintf((char *)&tmp, (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? "%llu":"%lld", llval); ZVAL_STRING(stmt->result.vars[i], tmp, 1); } else { ZVAL_LONG(stmt->result.vars[i], llval); http://cvs.php.net/co.php/php-src/ext/mysqli/tests/bug35103.phpt?r=1.1&p=1 Index: php-src/ext/mysqli/tests/bug35103.phpt +++ php-src/ext/mysqli/tests/bug35103.phpt -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php