From: Johannes Schlüter Date: Wed, 14 Oct 2009 13:51:25 +0000 (+0000) Subject: svn merge mysql-related fixes X-Git-Tag: php-5.3.1RC2~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0f74febfadc03b851b8bb3eeb792580b1f9ac4ab;p=php svn merge mysql-related fixes # I hope svn adds some more info in the history/commit mail --- diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 53c6edd637..694640f59c 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -971,6 +971,7 @@ PHP_FUNCTION(mysql_pconnect) Close a MySQL connection */ PHP_FUNCTION(mysql_close) { + int resource_id; zval *mysql_link=NULL; php_mysql_conn *mysql; @@ -984,24 +985,25 @@ PHP_FUNCTION(mysql_close) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, NULL, MySG(default_link), "MySQL-Link", le_link, le_plink); } + resource_id = mysql_link ? Z_RESVAL_P(mysql_link) : MySG(default_link); + PHPMY_UNBUFFERED_QUERY_CHECK(); #ifdef MYSQL_USE_MYSQLND { int tmp; - if ((mysql = zend_list_find(Z_RESVAL_P(mysql_link), &tmp)) && tmp == le_plink) { + if ((mysql = zend_list_find(resource_id, &tmp)) && tmp == le_plink) { mysqlnd_end_psession(mysql->conn); } } #endif - if (mysql_link) { /* explicit resource number */ - PHPMY_UNBUFFERED_QUERY_CHECK(); - zend_list_delete(Z_RESVAL_P(mysql_link)); - } + zend_list_delete(resource_id); if (!mysql_link || (mysql_link && Z_RESVAL_P(mysql_link)==MySG(default_link))) { - PHPMY_UNBUFFERED_QUERY_CHECK(); - zend_list_delete(MySG(default_link)); MySG(default_link) = -1; + if (mysql_link) { + /* on an explicit close of the default connection it had a refcount of 2 so we need one more call */ + zend_list_delete(resource_id); + } } RETURN_TRUE; @@ -1970,7 +1972,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type, } } - if ((result_type & MYSQL_BOTH) == 0) { + if (result_type & ~MYSQL_BOTH) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH"); result_type = MYSQL_BOTH; } @@ -2147,6 +2149,11 @@ PHP_FUNCTION(mysql_fetch_array) } ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result); + if (mode & ~MYSQL_BOTH) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH"); + mode = MYSQL_BOTH; + } + mysqlnd_fetch_into(result, mode, return_value, MYSQLND_MYSQL); #endif } diff --git a/ext/mysql/tests/bug48754.phpt b/ext/mysql/tests/bug48754.phpt new file mode 100644 index 0000000000..fb322f4615 --- /dev/null +++ b/ext/mysql/tests/bug48754.phpt @@ -0,0 +1,92 @@ +--TEST-- +Bug #48754 (mysql_close() crash php when no handle specified) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Explicit connection on close +Expect same thread id for $link and default conn: bool(true) +resource(%d) of type (mysql link) +resource(%d) of type (Unknown) + +Warning: mysql_close(): no MySQL-Link resource supplied in %s on line %d + +Closing default link +Expect same thread id for $link and default conn but not the previous: bool(true) +resource(%d) of type (mysql link) +resource(%d) of type (mysql link) +resource(%d) of type (Unknown) + +Explicit resource and pconnect +resource(%d) of type (mysql link persistent) +resource(%d) of type (Unknown) + +Warning: mysql_close(): no MySQL-Link resource supplied in %s on line %d + +Default link and pconnect +resource(%d) of type (mysql link persistent) +resource(%d) of type (mysql link persistent) +resource(%d) of type (Unknown) diff --git a/ext/mysql/tests/connect.inc b/ext/mysql/tests/connect.inc index 70017b9e26..86c0ee6748 100755 --- a/ext/mysql/tests/connect.inc +++ b/ext/mysql/tests/connect.inc @@ -20,14 +20,17 @@ if (!function_exists('sys_get_temp_dir')) { } /* wrapper to simplify test porting */ -function my_mysql_connect($host, $user, $passwd, $db, $port, $socket) { +function my_mysql_connect($host, $user, $passwd, $db, $port, $socket, $flags = NULL) { + global $connect_flags; + + $flags = ($flags === NULL) ? $connect_flags : $flags; if ($socket) $host = sprintf("%s:%s", $host, $socket); else if ($port) $host = sprintf("%s:%s", $host, $port); - if (!$link = mysql_connect($host, $user, $passwd, true)) { + if (!$link = mysql_connect($host, $user, $passwd, true, $flags)) { printf("[000-a] Cannot connect using host '%s', user '%s', password '****', [%d] %s\n", $host, $user, $passwd, mysql_errno(), mysql_error()); @@ -55,6 +58,7 @@ $db = getenv("MYSQL_TEST_DB") ? getenv("MYSQL_TEST_DB") : "test"; $engine = getenv("MYSQL_TEST_ENGINE") ? getenv("MYSQL_TEST_ENGINE") : "MyISAM"; $socket = getenv("MYSQL_TEST_SOCKET") ? getenv("MYSQL_TEST_SOCKET") : null; $skip_on_connect_failure = getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") ? getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") : true; +$connect_flags = getenv("MYSQL_TEST_CONNECT_FLAGS") ? (int)getenv("MYSQL_TEST_CONNECT_FLAGS") : 0; /* Development setting: test experimal features and/or feature requests that never worked before? */ $TEST_EXPERIMENTAL = (in_array(getenv("MYSQL_TEST_EXPERIMENTAL"), array(0, 1))) ? diff --git a/ext/mysql/tests/mysql_connect.phpt b/ext/mysql/tests/mysql_connect.phpt index acb632e009..be094cce20 100644 --- a/ext/mysql/tests/mysql_connect.phpt +++ b/ext/mysql/tests/mysql_connect.phpt @@ -20,17 +20,23 @@ if (!$link = mysql_connect($myhost, $user, $passwd, true)) mysql_close($link); +if (!$link = mysql_connect($myhost, $user, $passwd, true)) + printf("[003] Cannot connect to the server using host=%s/%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $myhost, $user, $db, $port, $socket); + +mysql_close(); + if ($link = mysql_connect($myhost, $user . 'unknown_really', $passwd . 'non_empty', true)) - printf("[003] Can connect to the server using host=%s/%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", + printf("[004] Can connect to the server using host=%s/%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $myhost, $user . 'unknown_really', $db, $port, $socket); if (false !== $link) -printf("[004] Expecting boolean/false, got %s/%s\n", gettype($link), $link); +printf("[005] Expecting boolean/false, got %s/%s\n", gettype($link), $link); // Run the following tests without an anoynmous MySQL user and use a password for the test user! ini_set('mysql.default_socket', $socket); if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { - printf("[005] Usage of mysql.default_socket failed\n"); + printf("[006] Usage of mysql.default_socket failed\n"); } else { mysql_close($link); } @@ -39,42 +45,49 @@ if (!ini_get('sql.safe_mode')) { ini_set('mysql.default_port', $port); if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { - printf("[006] Usage of mysql.default_port failed\n"); + printf("[007] Usage of mysql.default_port failed\n"); } else { mysql_close($link); } ini_set('mysql.default_password', $passwd); if (!is_resource($link = mysql_connect($myhost, $user))) { - printf("[007] Usage of mysql.default_password failed\n"); + printf("[008] Usage of mysql.default_password failed\n"); } else { mysql_close($link); } ini_set('mysql.default_user', $user); if (!is_resource($link = mysql_connect($myhost))) { - printf("[008] Usage of mysql.default_user failed\n"); + printf("[009] Usage of mysql.default_user failed\n"); } else { mysql_close($link); } ini_set('mysql.default_host', $myhost); if (!is_resource($link = mysql_connect())) { - printf("[009] Usage of mysql.default_host failed\n") ; + printf("[010] Usage of mysql.default_host failed\n") ; } else { mysql_close($link); } + if (!is_resource($link = mysql_connect()) || !is_resource($link2 = mysql_connect())) { + printf("[011] Usage of mysql.default_host failed\n") ; + } else { + mysql_close(); + mysql_close($link2); + } + if (!stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'netware')) { ini_set('mysql.default_port', -1); if (putenv(sprintf('MYSQL_TCP_PORT=%d', $port))) { if (!is_resource($link = mysql_connect())) { - printf("[010] Usage of env MYSQL_TCP_PORT failed\n") ; + printf("[012] Usage of env MYSQL_TCP_PORT failed\n") ; } else { mysql_close($link); } } else if (putenv(sprintf('MYSQL_TCP_PORT=%d', $port + 1))) { if (!is_resource($link = mysql_connect())) { - printf("[011] Usage of env MYSQL_TCP_PORT=%d should have failed\n", $port + 1) ; + printf("[013] Usage of env MYSQL_TCP_PORT=%d should have failed\n", $port + 1) ; mysql_close($link); } } diff --git a/ext/mysql/tests/mysql_fetch_array.phpt b/ext/mysql/tests/mysql_fetch_array.phpt index 924c717501..635e6d1097 100644 --- a/ext/mysql/tests/mysql_fetch_array.phpt +++ b/ext/mysql/tests/mysql_fetch_array.phpt @@ -56,7 +56,7 @@ exit(1); do { $illegal_mode = mt_rand(0, 10000); } while (in_array($illegal_mode, array(MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH))); -$tmp = @mysql_fetch_array($res, $illegal_mode); +$tmp = mysql_fetch_array($res, $illegal_mode); if (!is_array($tmp)) printf("[013] Expecting array, got %s/%s. [%d] %s\n", gettype($tmp), $tmp, mysql_errno($link), mysql_error($link)); @@ -355,5 +355,7 @@ array(11) { %unicode|string%(1) "1" } +Warning: mysql_fetch_array(): The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH in %s on line %d + Warning: mysql_fetch_array(): %d is not a valid MySQL result resource in %s on line %d done! diff --git a/ext/mysql/tests/mysql_fetch_field.phpt b/ext/mysql/tests/mysql_fetch_field.phpt index f9767c82b7..65c44edc5e 100644 --- a/ext/mysql/tests/mysql_fetch_field.phpt +++ b/ext/mysql/tests/mysql_fetch_field.phpt @@ -124,9 +124,16 @@ require_once('skipifconnectfailure.inc'); printf("[017] [%d] %s\n", mysql_errno($link), mysql_error($link)); } $res = mysql_list_fields($db, 'test'); - while ($tmp = mysql_fetch_field($res)) - if ($tmp->name == 'id') + $found = false; + while ($tmp = mysql_fetch_field($res)) { + if ($tmp->name == 'id') { + printf("Fetch field from mysql_list_fields result set.\n"); + $found = true; var_dump($tmp); + } + } + if (!$found) + printf("[018] mysqli_list_fields result set processing has failed.\n"); mysql_free_result($res); @@ -227,6 +234,7 @@ object(stdClass)#%d (13) { [%u|b%"zerofill"]=> int(0) } +Fetch field from mysql_list_fields result set. object(stdClass)#%d (13) { [%u|b%"name"]=> %unicode|string%(2) "id" diff --git a/ext/mysql/tests/mysql_list_fields.phpt b/ext/mysql/tests/mysql_list_fields.phpt index 7d1d4f2dde..e0b3fd5e39 100644 --- a/ext/mysql/tests/mysql_list_fields.phpt +++ b/ext/mysql/tests/mysql_list_fields.phpt @@ -12,29 +12,36 @@ require_once 'connect.inc'; $tmp = NULL; $link = NULL; -// This will implicitly try to connect, and we don't want it -//if (false !== ($tmp = mysql_list_fields($link, $link))) -// printf("[002] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp); - require 'table.inc'; if (!$res = mysql_list_fields($db, 'test', $link)) printf("[003] [%d] %s\n", mysql_errno($link), mysql_error($link)); if (2 !== ($num = mysql_num_fields($res))) - printf("[004] Expecting two fields, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link)); + printf("[004] Expecting two fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link)); mysql_free_result($res); -if (!mysql_query("DROP TABLE IF EXISTS test2", $link) || - !mysql_query("CREATE TABLE test2(id INT)", $link)) +if (!mysql_query("DROP TABLE IF EXISTS test2", $link)) printf("[005] [%d] %s\n", mysql_errno($link), mysql_error($link)); -if (!$res = mysql_list_fields($db, 'test', $link)) +if (!$res = @mysql_list_fields($db, 'test2', $link)) printf("[006] [%d] %s\n", mysql_errno($link), mysql_error($link)); +if (!$res = mysql_list_fields($db, 'test', $link)) + printf("[007] [%d] %s\n", mysql_errno($link), mysql_error($link)); + if (2 !== ($num = mysql_num_fields($res))) - printf("[007] Expecting 3 fields from test and test2, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link)); + printf("[008] Expecting 2 fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link)); + +var_dump(mysql_fetch_assoc($res)); +for ($field_offset = 0; $field_offset < mysql_num_fields($res); $field_offset++) { + printf("Field Offset %d\n", $field_offset); + printf("mysql_field_flags(): %s\n", mysql_field_flags($res, $field_offset)); + printf("mysql_field_len(): %s\n", mysql_field_len($res, $field_offset)); + printf("mysql_field_name(): %s\n", mysql_field_name($res, $field_offset)); + printf("mysql_field_type(): %s\n", mysql_field_type($res, $field_offset)); +} mysql_free_result($res); mysql_close($link); @@ -57,4 +64,16 @@ if (!mysql_query("DROP TABLE IF EXISTS test2", $link)) mysql_close($link); ?> --EXPECTF-- +[006] [%d] %s +bool(false) +Field Offset 0 +mysql_field_flags()%s +mysql_field_len(): 11 +mysql_field_name(): id +mysql_field_type(): int +Field Offset 1 +mysql_field_flags()%s +mysql_field_len(): 1 +mysql_field_name(): label +mysql_field_type(): string done! diff --git a/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt b/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt new file mode 100644 index 0000000000..d54cb50708 --- /dev/null +++ b/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt @@ -0,0 +1,37 @@ +--TEST-- +mysqlnd.net_read_timeout > default_socket_timeout +--SKIPIF-- + +--INI-- +default_socket_timeout=1 +mysqlnd.net_read_timeout=12 +max_execution_time=12 +--FILE-- + +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(6)"]=> + %unicode|string%(1) "0" +} +done! \ No newline at end of file diff --git a/ext/mysql/tests/mysql_pconn_max_links.phpt b/ext/mysql/tests/mysql_pconn_max_links.phpt index f9776d5797..1d39e98b42 100644 --- a/ext/mysql/tests/mysql_pconn_max_links.phpt +++ b/ext/mysql/tests/mysql_pconn_max_links.phpt @@ -18,26 +18,35 @@ Persistent connections and mysql.max_persistent if (!mysql_select_db($db, $link)) die(sprintf("skip [%d] %s", mysql_errno($link), mysql_error($link))); + if (!$res = mysql_query("SELECT CURRENT_USER() AS _user", $link)) + die(sprintf("skip [%d] %s", mysql_errno($link), mysql_error($link))); + + $row = mysql_fetch_assoc($res); + mysql_free_result($res); + $host = substr($row['_user'], strrpos($row['_user'], "@") + 1, strlen($row['_user'])); + mysql_query('DROP USER pcontest', $link); - if (!mysql_query('CREATE USER pcontest IDENTIFIED BY "pcontest"', $link)) { + mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); + if (!mysql_query(sprintf('CREATE USER pcontest@"%s" IDENTIFIED BY "pcontest"', mysql_real_escape_string($host, $link)), $link)) { printf("skip Cannot create second DB user [%d] %s", mysql_errno($link), mysql_error($link)); mysql_close($link); die(); } // we might be able to specify the host using CURRENT_USER(), but... - if (!mysql_query(sprintf("GRANT SELECT ON TABLE %s.test TO pcontest@'%%'", $db), $link)) { + if (!mysql_query(sprintf('GRANT SELECT ON TABLE %s.test TO pcontest@"%s"', $db, mysql_real_escape_string($host, $link)), $link)) { printf("skip Cannot GRANT SELECT to second DB user [%d] %s", mysql_errno($link), mysql_error($link)); - mysql_query('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest', $link); - mysql_query('DROP USER pcontest', $link); + mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); + mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); mysql_close($link); die(); } + mysql_close($link); ?> --INI-- -mysql.max_links=2 -mysql.max_persistent=1 +mysql.max_links=3 +mysql.max_persistent=2 mysql.allow_persistent=1 --FILE-- enabled'), 500); if (!preg_match('@Active Persistent Links\s+=>\s+(\d+)@ismU', $phpinfo, $matches)) - printf("[011] Cannot get # active persistent links from phpinfo()"); + printf("[012] Cannot get # active persistent links from phpinfo()\n"); $num_plinks_kill = $matches[1]; - if ($num_plinks_kill >= $num_plinks) - printf("[012] Statistics seems to be wrong, got %d active persistent links, expecting < %d links", + if ($num_plinks_kill > $num_plinks) + printf("[013] Statistics seems to be wrong, got %d active persistent links, expecting < %d links\n", $num_plinks_kill, $num_plinks); // The first connection has been closed, the last pconnect() was unable to connect -> no connection open // We must be able to connect because max_persistent limit has not been reached if (!$plink = mysql_pconnect($host, 'pcontest', 'newpass')) - printf("[013] Cannot connect using the second DB, [%d] %s\n", - mysql_errno(), mysql_error()); + die(sprintf("[014] Cannot connect using the second DB, [%d] %s\n", + mysql_errno(), mysql_error())); if (!mysql_select_db($db, $plink)) - printf("[014] [%d] %s\n", mysql_errno($plink), mysql_error($plink)); + printf("[015] [%d] %s\n", mysql_errno($plink), mysql_error($plink)); if (!$res = mysql_query('SELECT id, label FROM test WHERE id = 1', $plink)) - printf("[015] Cannot run query on persistent connection of second DB user, [%d] %s\n", + printf("[016] Cannot run query on persistent connection of second DB user, [%d] %s\n", mysql_errno($plink), mysql_error($plink)); if (!$row = mysql_fetch_assoc($res)) - printf("[016] Cannot run fetch result, [%d] %s\n", + printf("[017] Cannot run fetch result, [%d] %s\n", mysql_errno($plink), mysql_error($plink)); mysql_free_result($res); var_dump($row); - mysql_query('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest', $link); - mysql_query('DROP USER pcontest', $link); + mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); + mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); mysql_close($link); print "done!"; ?> @@ -148,8 +165,15 @@ if (!$link = my_mysql_connect($host, $user, $passwd, $db, $port, $socket)) { $host, $myhost, $user, $db, $port, $socket); } -@mysql_query('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest', $link); -@mysql_query('DROP USER pcontest', $link); +if (!$res = mysql_query("SELECT CURRENT_USER() AS _user", $link)) + printf("[c002] [%d] %s", mysql_errno($link), mysql_error($link)); + +$row = mysql_fetch_assoc($res); +mysql_free_result($res); +$host = substr($row['_user'], strrpos($row['_user'], "@") + 1, strlen($row['_user'])); + +@mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); +@mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); mysql_close($link); ?> diff --git a/ext/mysql/tests/skipifconnectfailure.inc b/ext/mysql/tests/skipifconnectfailure.inc index e586a33f3b..a57c7dbd58 100755 --- a/ext/mysql/tests/skipifconnectfailure.inc +++ b/ext/mysql/tests/skipifconnectfailure.inc @@ -6,7 +6,7 @@ if ($skip_on_connect_failure) { else if ($port) $myhost = sprintf("%s:%s", $host, $port); - if (!$link = @mysql_connect($myhost, $user, $passwd, true)) + if (!$link = @mysql_connect($myhost, $user, $passwd, true, $connect_flags)) die(sprintf("skip Can't connect to MySQL Server - [%d] %s", mysql_errno(), mysql_error())); if (!@mysql_select_db($db, $link)) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 3a13583b65..b5867a0efb 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -32,6 +32,7 @@ #include "ext/standard/php_string.h" #include "php_mysqli_structs.h" #include "zend_exceptions.h" +#include "ext/mysqlnd/mysqlnd_portability.h" ZEND_DECLARE_MODULE_GLOBALS(mysqli) static PHP_GINIT_FUNCTION(mysqli); @@ -379,7 +380,6 @@ void mysqli_write_property(zval *object, zval *member, zval *value TSRMLS_DC) zval tmp_member; mysqli_object *obj; mysqli_prop_handler *hnd; - zend_object_handlers *std_hnd; int ret; if (member->type != IS_STRING) { @@ -1201,12 +1201,37 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags MAKE_STD_ZVAL(res); - /* check if we need magic quotes */ - if (PG(magic_quotes_runtime)) { - Z_TYPE_P(res) = IS_STRING; - Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC); - } else { - ZVAL_STRINGL(res, row[i], field_len[i], 1); +#if MYSQL_VERSION_ID > 50002 + if (mysql_fetch_field_direct(result, i)->type == MYSQL_TYPE_BIT) { + my_ulonglong llval; + char tmp[22]; + switch (field_len[i]) { + case 8:llval = (my_ulonglong) bit_uint8korr(row[i]);break; + case 7:llval = (my_ulonglong) bit_uint7korr(row[i]);break; + case 6:llval = (my_ulonglong) bit_uint6korr(row[i]);break; + case 5:llval = (my_ulonglong) bit_uint5korr(row[i]);break; + case 4:llval = (my_ulonglong) bit_uint4korr(row[i]);break; + case 3:llval = (my_ulonglong) bit_uint3korr(row[i]);break; + case 2:llval = (my_ulonglong) bit_uint2korr(row[i]);break; + case 1:llval = (my_ulonglong) uint1korr(row[i]);break; + } + /* even though lval is declared as unsigned, the value + * may be negative. Therefor we cannot use MYSQLI_LLU_SPEC and must + * use MYSQLI_LL_SPEC. + */ + snprintf(tmp, sizeof(tmp), (mysql_fetch_field_direct(result, i)->flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval); + ZVAL_STRING(res, tmp, 1); + } else +#endif + { + + /* check if we need magic quotes */ + if (PG(magic_quotes_runtime)) { + Z_TYPE_P(res) = IS_STRING; + Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC); + } else { + ZVAL_STRINGL(res, row[i], field_len[i], 1); + } } if (fetchtype & MYSQLI_NUM) { diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 38bf9ae946..07bc303d72 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -31,6 +31,7 @@ #include "php_globals.h" #include "ext/standard/info.h" #include "php_mysqli_structs.h" +#include "ext/mysqlnd/mysqlnd_portability.h" /* {{{ proto mixed mysqli_affected_rows(object link) Get number of affected rows in previous MySQL operation */ @@ -356,6 +357,7 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, bind[ofs].is_null = &stmt->result.is_null[ofs]; bind[ofs].buffer_length = stmt->result.buf[ofs].buflen; bind[ofs].is_unsigned = (stmt->stmt->fields[ofs].flags & UNSIGNED_FLAG) ? 1 : 0; + bind[ofs].length = &stmt->result.buf[ofs].output_len; break; case MYSQL_TYPE_DATE: @@ -370,6 +372,7 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_DECIMAL: + case MYSQL_TYPE_GEOMETRY: #ifdef FIELD_TYPE_NEWDECIMAL case MYSQL_TYPE_NEWDECIMAL: #endif @@ -395,7 +398,9 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, different lengths and you will see that we get different lengths in stmt->stmt->fields[ofs].length The just take 256 and saves us from realloc-ing. */ - stmt->result.buf[ofs].buflen = 256; + stmt->result.buf[ofs].buflen = + (stmt->stmt->fields) ? (stmt->stmt->fields[ofs].length) ? stmt->stmt->fields[ofs].length + 1: 256: 256; + } else { /* the user has called store_result(). if he does not there is no way to determine the @@ -409,7 +414,7 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, bind[ofs].buffer = stmt->result.buf[ofs].val; bind[ofs].is_null = &stmt->result.is_null[ofs]; bind[ofs].buffer_length = stmt->result.buf[ofs].buflen; - bind[ofs].length = &stmt->result.buf[ofs].buflen; + bind[ofs].length = &stmt->result.buf[ofs].output_len; break; } default: @@ -732,7 +737,7 @@ PHP_FUNCTION(mysqli_stmt_execute) for (i = 0; i < stmt->param.var_cnt; i++) { for (j = i + 1; j < stmt->param.var_cnt; j++) { /* Oops, someone binding the same variable - clone */ - if (stmt->param.vars[j] == stmt->param.vars[i]) { + if (stmt->param.vars[j] == stmt->param.vars[i] && stmt->param.vars[i]) { php_mysqli_stmt_copy_it(&copies, stmt->param.vars[i], stmt->param.var_cnt, i); break; } @@ -877,9 +882,29 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) ZVAL_DOUBLE(stmt->result.vars[i], *(double *)stmt->result.buf[i].val); break; case IS_STRING: - if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG) { + if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG +#if MYSQL_VERSION_ID > 50002 + || stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_BIT +#endif + ) { my_bool uns= (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? 1:0; - llval= *(my_ulonglong *) stmt->result.buf[i].val; +#if MYSQL_VERSION_ID > 50002 + if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_BIT) { + switch (stmt->result.buf[i].output_len) { + case 8:llval = (my_ulonglong) bit_uint8korr(stmt->result.buf[i].val);break; + case 7:llval = (my_ulonglong) bit_uint7korr(stmt->result.buf[i].val);break; + case 6:llval = (my_ulonglong) bit_uint6korr(stmt->result.buf[i].val);break; + case 5:llval = (my_ulonglong) bit_uint5korr(stmt->result.buf[i].val);break; + case 4:llval = (my_ulonglong) bit_uint4korr(stmt->result.buf[i].val);break; + case 3:llval = (my_ulonglong) bit_uint3korr(stmt->result.buf[i].val);break; + case 2:llval = (my_ulonglong) bit_uint2korr(stmt->result.buf[i].val);break; + case 1:llval = (my_ulonglong) uint1korr(stmt->result.buf[i].val);break; + } + } else +#endif + { + llval= *(my_ulonglong *) stmt->result.buf[i].val; + } #if SIZEOF_LONG==8 if (uns && llval > 9223372036854775807L) { #elif SIZEOF_LONG==4 @@ -898,14 +923,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) } else { ZVAL_LONG(stmt->result.vars[i], llval); } - } -#if MYSQL_VERSION_ID > 50002 - else if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_BIT) { - llval = *(my_ulonglong *)stmt->result.buf[i].val; - ZVAL_LONG(stmt->result.vars[i], llval); - } -#endif - else { + } else { #if defined(MYSQL_DATA_TRUNCATED) && MYSQL_VERSION_ID > 50002 if (ret == MYSQL_DATA_TRUNCATED && *(stmt->stmt->bind[i].error) != 0) { /* result was truncated */ @@ -916,7 +934,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) { #endif ZVAL_STRINGL(stmt->result.vars[i], stmt->result.buf[i].val, - stmt->result.buf[i].buflen, 1); + stmt->result.buf[i].output_len, 1); } } break; @@ -2097,7 +2115,6 @@ PHP_FUNCTION(mysqli_stmt_attr_set) long mode_in; ulong mode; ulong attr; - int rc; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &mysql_stmt, mysqli_stmt_class_entry, &attr, &mode_in) == FAILURE) { return; @@ -2110,7 +2127,11 @@ PHP_FUNCTION(mysqli_stmt_attr_set) } mode = mode_in; - if ((rc = mysql_stmt_attr_set(stmt->stmt, attr, (void *)&mode))) { +#if !defined(MYSQLI_USE_MYSQLND) + if (FALSE == mysql_stmt_attr_set(stmt->stmt, attr, (void *)&mode)) { +#else + if (FAIL == mysql_stmt_attr_set(stmt->stmt, attr, (void *)&mode)) { +#endif RETURN_FALSE; } RETURN_TRUE; @@ -2281,7 +2302,8 @@ PHP_FUNCTION(mysqli_stmt_store_result) for (i = mysql_stmt_field_count(stmt->stmt) - 1; i >=0; --i) { if (stmt->stmt->fields && (stmt->stmt->fields[i].type == MYSQL_TYPE_BLOB || stmt->stmt->fields[i].type == MYSQL_TYPE_MEDIUM_BLOB || - stmt->stmt->fields[i].type == MYSQL_TYPE_LONG_BLOB)) + stmt->stmt->fields[i].type == MYSQL_TYPE_LONG_BLOB || + stmt->stmt->fields[i].type == MYSQL_TYPE_GEOMETRY)) { my_bool tmp=1; mysql_stmt_attr_set(stmt->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &tmp); diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 95ddb9e6df..187b9bec30 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -217,7 +217,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne MyG(num_active_persistent) + MyG(num_inactive_persistent)); goto err; } - if (!is_real_connect && !mysql->mysql) { + if (!mysql->mysql) { #if !defined(MYSQLI_USE_MYSQLND) if (!(mysql->mysql = mysql_init(NULL))) { #else diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index ce02059488..81d1044ce1 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -73,8 +73,9 @@ enum mysqli_status { }; typedef struct { - ulong buflen; char *val; + ulong buflen; + ulong output_len; ulong type; } VAR_BUFFER; diff --git a/ext/mysqli/tests/001.phpt b/ext/mysqli/tests/001.phpt index 77f3dcbd18..4e19d81090 100644 --- a/ext/mysqli/tests/001.phpt +++ b/ext/mysqli/tests/001.phpt @@ -1,8 +1,8 @@ --TEST-- mysqli connect --SKIPIF-- - @@ -13,25 +13,25 @@ require_once('skipifconnectfailure.inc'); $test = ""; /*** test mysqli_connect localhost:port ***/ - $link = mysqli_connect($host, $user, $passwd, "", $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, "", $port, $socket); $test .= ($link) ? "1" : "0"; mysqli_close($link); /*** test mysqli_real_connect ***/ $link = mysqli_init(); - $test.= (mysqli_real_connect($link, $host, $user, $passwd, "", $port, $socket) ) + $test.= (my_mysqli_real_connect($link, $host, $user, $passwd, "", $port, $socket) ) ? "1" : "0"; mysqli_close($link); /*** test mysqli_real_connect with db ***/ $link = mysqli_init(); - $test .= (mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) + $test .= (my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) ? "1" : "0"; mysqli_close($link); /*** test mysqli_real_connect with port ***/ $link = mysqli_init(); - $test .= (mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) + $test .= (my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) ? "1":"0"; mysqli_close($link); @@ -40,7 +40,7 @@ require_once('skipifconnectfailure.inc'); if (!$link = mysqli_init()) printf("[001 + %d] mysqli_init() failed, [%d] %s\n", $i, mysqli_connect_errno(), mysqli_connect_error()); - if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) printf("[002 + %d] mysqli_real_connect() failed, [%d] %s\n", $i, mysqli_connect_errno(), mysqli_connect_error()); mysqli_close($link); @@ -49,7 +49,7 @@ require_once('skipifconnectfailure.inc'); /*** test mysqli_real_connect compressed ***/ /* $link = mysqli_init(); - $test .= (mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, MYSQLI_CLIENT_COMPRESS)) + $test .= (my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, MYSQLI_CLIENT_COMPRESS)) ? "1" : "0"; mysqli_close($link); */ diff --git a/ext/mysqli/tests/002.phpt b/ext/mysqli/tests/002.phpt index 680f0f4fc3..6bbdecfdcc 100644 --- a/ext/mysqli/tests/002.phpt +++ b/ext/mysqli/tests/002.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); if (!mysqli_query($link, "DROP TABLE IF EXISTS test_fetch_null")) @@ -49,7 +49,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- --FILE-- @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); if (!mysqli_query($link, "SET AUTOCOMMIT=0")) printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); diff --git a/ext/mysqli/tests/019.phpt b/ext/mysqli/tests/019.phpt index d603320099..f3741a5d32 100644 --- a/ext/mysqli/tests/019.phpt +++ b/ext/mysqli/tests/019.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); if (!mysqli_query($link, "DROP TABLE IF EXISTS insert_read")) printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); @@ -58,7 +58,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- --FILE-- @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $status = mysqli_stat($link); diff --git a/ext/mysqli/tests/028.phpt b/ext/mysqli/tests/028.phpt index a518b7dad7..6c4425e2b4 100644 --- a/ext/mysqli/tests/028.phpt +++ b/ext/mysqli/tests/028.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $cset = substr(mysqli_character_set_name($link),0,6); diff --git a/ext/mysqli/tests/029.phpt b/ext/mysqli/tests/029.phpt index 9ec3bae362..bfc54bcc61 100644 --- a/ext/mysqli/tests/029.phpt +++ b/ext/mysqli/tests/029.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_select_db($link, $db); @@ -29,7 +29,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- @@ -11,7 +11,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $pinfo = mysqli_get_proto_info($link); diff --git a/ext/mysqli/tests/035.phpt b/ext/mysqli/tests/035.phpt index 58f0246dfb..7b621aa222 100644 --- a/ext/mysqli/tests/035.phpt +++ b/ext/mysqli/tests/035.phpt @@ -1,8 +1,8 @@ --TEST-- function test: mysqli_get_server_info --SKIPIF-- - --FILE-- @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $sinfo = substr(mysqli_get_server_info($link),0,1); diff --git a/ext/mysqli/tests/036.phpt b/ext/mysqli/tests/036.phpt index a118cdf463..4e68b6c2a1 100644 --- a/ext/mysqli/tests/036.phpt +++ b/ext/mysqli/tests/036.phpt @@ -14,7 +14,7 @@ function test: mysqli_insert_id() include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_select_db($link, $db); @@ -45,7 +45,7 @@ function test: mysqli_insert_id() --CLEAN-- --FILE-- @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $i = mysqli_get_server_version($link); diff --git a/ext/mysqli/tests/045.phpt b/ext/mysqli/tests/045.phpt index bae2ce8e2c..d5ee5ad2bc 100644 --- a/ext/mysqli/tests/045.phpt +++ b/ext/mysqli/tests/045.phpt @@ -7,7 +7,7 @@ mysqli_bind_result (SHOW) require_once('skipifconnectfailure.inc'); include "connect.inc"; - $link = mysqli_connect($host, $user, $passwd); + $link = my_mysqli_connect($host, $user, $passwd); $stmt = mysqli_prepare($link, "SHOW VARIABLES LIKE 'port'"); mysqli_execute($stmt); @@ -23,7 +23,7 @@ mysqli_bind_result (SHOW) include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $stmt = mysqli_prepare($link, "SHOW VARIABLES LIKE 'port'"); mysqli_execute($stmt); diff --git a/ext/mysqli/tests/046.phpt b/ext/mysqli/tests/046.phpt index 8e8991a40d..cf77392101 100644 --- a/ext/mysqli/tests/046.phpt +++ b/ext/mysqli/tests/046.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_select_db($link, $db); @@ -37,7 +37,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- select_db($db); $mysql->query("DROP TABLE IF EXISTS test_fetch_null"); @@ -43,7 +43,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- select_db($db); $result = $mysql->query("SELECT DATABASE()"); @@ -19,6 +19,8 @@ require_once('skipifconnectfailure.inc'); $result->close(); var_dump($row); + if ($row[0] != $db) + printf("[001] Expecting '%s' got '%s'\n", $db, $row[0]); $mysql->close(); print "done!"; diff --git a/ext/mysqli/tests/050.phpt b/ext/mysqli/tests/050.phpt index ee1c20322e..ba668f0a84 100644 --- a/ext/mysqli/tests/050.phpt +++ b/ext/mysqli/tests/050.phpt @@ -1,8 +1,8 @@ --TEST-- non freed statement test --SKIPIF-- - --FILE-- @@ -12,7 +12,7 @@ require_once('skipifconnectfailure.inc'); /************************ * non freed stamement ************************/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $stmt = mysqli_prepare($link, "SELECT CURRENT_USER()"); mysqli_execute($stmt); diff --git a/ext/mysqli/tests/051.phpt b/ext/mysqli/tests/051.phpt index 8ff75d59bf..82665156db 100644 --- a/ext/mysqli/tests/051.phpt +++ b/ext/mysqli/tests/051.phpt @@ -1,8 +1,8 @@ --TEST-- free statement after close --SKIPIF-- - --FILE-- @@ -12,7 +12,7 @@ require_once('skipifconnectfailure.inc'); /************************ * free statement after close ************************/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $stmt1 = mysqli_prepare($link, "SELECT CURRENT_USER()"); mysqli_execute($stmt1); diff --git a/ext/mysqli/tests/052.phpt b/ext/mysqli/tests/052.phpt index 95fdc2f27c..f280d84061 100644 --- a/ext/mysqli/tests/052.phpt +++ b/ext/mysqli/tests/052.phpt @@ -1,18 +1,18 @@ --TEST-- call statement after close --SKIPIF-- - --FILE-- --FILE-- --FILE-- --FILE-- real_query("SELECT 'foo' FROM DUAL"); diff --git a/ext/mysqli/tests/063.phpt b/ext/mysqli/tests/063.phpt index fbbdacd598..9b42ab7fbf 100644 --- a/ext/mysqli/tests/063.phpt +++ b/ext/mysqli/tests/063.phpt @@ -9,7 +9,7 @@ require_once('skipifconnectfailure.inc'); execute(); diff --git a/ext/mysqli/tests/064.phpt b/ext/mysqli/tests/064.phpt index 729fb6b45f..a308e4ab29 100644 --- a/ext/mysqli/tests/064.phpt +++ b/ext/mysqli/tests/064.phpt @@ -1,15 +1,15 @@ --TEST-- -NULL binding +NULL binding --SKIPIF-- - --FILE-- execute(); diff --git a/ext/mysqli/tests/065.phpt b/ext/mysqli/tests/065.phpt index 9819f26132..d0f1d16291 100644 --- a/ext/mysqli/tests/065.phpt +++ b/ext/mysqli/tests/065.phpt @@ -16,7 +16,7 @@ if (version_compare(PHP_VERSION, '5.9.9', '>') == 1) { query("DROP TABLE IF EXISTS test_warnings"); @@ -31,7 +31,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- multi_query('SELECT 1;SELECT 2'); do { $res = $mysql->store_result(); diff --git a/ext/mysqli/tests/070.phpt b/ext/mysqli/tests/070.phpt index 3064ac11e7..eee5125133 100644 --- a/ext/mysqli/tests/070.phpt +++ b/ext/mysqli/tests/070.phpt @@ -1,15 +1,15 @@ --TEST-- mysqli ping --SKIPIF-- - --FILE-- ping()); $mysql->close(); print "done!"; diff --git a/ext/mysqli/tests/071.phpt b/ext/mysqli/tests/071.phpt index e2fcaf18ae..8888fb1706 100644 --- a/ext/mysqli/tests/071.phpt +++ b/ext/mysqli/tests/071.phpt @@ -1,8 +1,8 @@ --TEST-- mysqli thread_id & kill --SKIPIF-- - @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); ping()); @@ -20,7 +20,7 @@ require_once('skipifconnectfailure.inc'); $mysql->close(); - $mysql = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket); var_dump(mysqli_ping($mysql)); diff --git a/ext/mysqli/tests/072.phpt b/ext/mysqli/tests/072.phpt index db05d5d227..637014b29c 100644 --- a/ext/mysqli/tests/072.phpt +++ b/ext/mysqli/tests/072.phpt @@ -9,7 +9,7 @@ require_once('skipifconnectfailure.inc'); query("DROP TABLE IF EXISTS not_exists"); diff --git a/ext/mysqli/tests/074.phpt b/ext/mysqli/tests/074.phpt index 0d935d35d1..883655bc5e 100644 --- a/ext/mysqli/tests/074.phpt +++ b/ext/mysqli/tests/074.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include "connect.inc"; - $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); var_dump($mysqli->autocommit(false)); $result = $mysqli->query("SELECT @@autocommit"); diff --git a/ext/mysqli/tests/bug31668.phpt b/ext/mysqli/tests/bug31668.phpt index b9a9589558..cdca551f21 100644 --- a/ext/mysqli/tests/bug31668.phpt +++ b/ext/mysqli/tests/bug31668.phpt @@ -11,7 +11,7 @@ error_reporting = E_ALL & ~E_STRICT multi_query('SELECT 1;SELECT 2'); do { $res = $mysql->store_result(); @@ -25,7 +25,7 @@ error_reporting = E_ALL & ~E_STRICT var_dump($mysql->error, __LINE__); $mysql->close(); - $mysql = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysql->multi_query('SELECT 1;SELECT 2'); do { $res = $mysql->store_result(); diff --git a/ext/mysqli/tests/bug32405.phpt b/ext/mysqli/tests/bug32405.phpt index a6e4d19a8d..24bcdb4d0f 100644 --- a/ext/mysqli/tests/bug32405.phpt +++ b/ext/mysqli/tests/bug32405.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include ("connect.inc"); /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_select_db($link, "test"); mysqli_query($link, "SET sql_mode=''"); @@ -34,7 +34,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- --FILE-- @@ -10,13 +10,13 @@ require_once('skipifconnectfailure.inc'); include ("connect.inc"); /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, null, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, null, $port, $socket); mysqli_select_db($link, $db); if (!($link->prepare("this makes no sense"))) { printf("%d\n", $link->errno); printf("%s\n", $link->sqlstate); - } + } $link->close(); ?> --EXPECT-- diff --git a/ext/mysqli/tests/bug34785.phpt b/ext/mysqli/tests/bug34785.phpt index 2130ccaf3a..18dd4c3566 100644 --- a/ext/mysqli/tests/bug34785.phpt +++ b/ext/mysqli/tests/bug34785.phpt @@ -1,8 +1,8 @@ --TEST-- Bug #34785 (Can not properly subclass mysqli_stmt) --SKIPIF-- - --FILE-- @@ -24,7 +24,7 @@ require_once('skipifconnectfailure.inc'); } /*** test mysqli_connect 127.0.0.1 ***/ - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); mysqli_query($link, "SET sql_mode=''"); $stmt = new my_stmt($link, "SELECT 'foo' FROM DUAL"); diff --git a/ext/mysqli/tests/bug34810.phpt b/ext/mysqli/tests/bug34810.phpt index e1a6ca30c9..fac805312a 100644 --- a/ext/mysqli/tests/bug34810.phpt +++ b/ext/mysqli/tests/bug34810.phpt @@ -12,14 +12,14 @@ class DbConnection { public function connect() { include "connect.inc"; - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); var_dump($link); $link = mysqli_init(); /* @ is to supress 'Property access is not allowed yet' */ @var_dump($link); - $mysql = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysql->query("DROP TABLE IF EXISTS test_warnings"); $mysql->query("CREATE TABLE test_warnings (a int not null)"); $mysql->query("SET sql_mode=''"); @@ -36,7 +36,7 @@ echo "Done\n"; --CLEAN-- query("DROP TABLE IF EXISTS test_bint"); $mysql->query("CREATE TABLE test_bint (a bigint(20) default NULL) ENGINE=MYISAM"); $mysql->query("INSERT INTO test_bint VALUES (9223372036854775807),(-9223372036854775808),(-2147483648),(-2147483649),(-2147483647),(2147483647),(2147483648),(2147483649)"); @@ -54,7 +54,7 @@ EOSQL; --CLEAN-- query("CREATE TABLE temp (id INT UNSIGNED NOT NULL)"); $mysql->query("INSERT INTO temp (id) VALUES (3000000897),(3800001532),(3900002281),(3100059612)"); @@ -40,7 +40,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- num_rows after calling result->close()) --SKIPIF-- - --FILE-- query('select 1'); @@ -21,7 +21,7 @@ echo $result->num_rows; echo "Done\n"; ?> ---EXPECTF-- +--EXPECTF-- Warning: main(): Couldn't fetch mysqli_result in %s on line %d Warning: main(): Couldn't fetch mysqli_result in %s on line %d diff --git a/ext/mysqli/tests/bug36745.phpt b/ext/mysqli/tests/bug36745.phpt index c1f2a11ab5..511eaf38fd 100644 --- a/ext/mysqli/tests/bug36745.phpt +++ b/ext/mysqli/tests/bug36745.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); include ("connect.inc"); /*** test mysqli_connect 127.0.0.1 ***/ - $mysql = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $mysql = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $mysql->query("DROP TABLE IF EXISTS litest"); $mysql->query("CREATE TABLE litest (a VARCHAR(20))"); @@ -24,7 +24,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- --FILE-- query("SELECT 'foo' FROM DUAL"); - /* following operations should work */ + /* following operations should work */ $x[2] = ($mysql->client_version > 0); $x[3] = $mysql->errno; $mysql->close(); - - var_dump($x); ?> diff --git a/ext/mysqli/tests/bug36949.phpt b/ext/mysqli/tests/bug36949.phpt index 10aaad5ccd..39909f9efd 100644 --- a/ext/mysqli/tests/bug36949.phpt +++ b/ext/mysqli/tests/bug36949.phpt @@ -50,7 +50,7 @@ $B = new B(); --CLEAN-- ') == 1)) { set_charset("latin1"); diff --git a/ext/mysqli/tests/bug38710.phpt b/ext/mysqli/tests/bug38710.phpt index 490810cbc7..280a51a6fc 100755 --- a/ext/mysqli/tests/bug38710.phpt +++ b/ext/mysqli/tests/bug38710.phpt @@ -1,15 +1,15 @@ --TEST-- Bug #38710 (data leakage because of nonexisting boundary checking in statements) --SKIPIF-- - --FILE-- stmt_init(); $qry->prepare("SELECT REPEAT('a',100000)"); $qry->execute(); @@ -20,5 +20,5 @@ if ($text !== str_repeat('a', ($IS_MYSQLND || mysqli_get_server_version($db) > 5 } echo "Done"; ?> ---EXPECTF-- +--EXPECTF-- Done \ No newline at end of file diff --git a/ext/mysqli/tests/bug42378.phpt b/ext/mysqli/tests/bug42378.phpt index 1667eb47d0..b3fd7ca524 100644 --- a/ext/mysqli/tests/bug42378.phpt +++ b/ext/mysqli/tests/bug42378.phpt @@ -152,7 +152,7 @@ memory_limit=83886080 return true; } - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect - [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/bug42548.phpt b/ext/mysqli/tests/bug42548.phpt index 418de89d9a..c9950be3a1 100644 --- a/ext/mysqli/tests/bug42548.phpt +++ b/ext/mysqli/tests/bug42548.phpt @@ -5,7 +5,7 @@ Bug #42548 PROCEDURE xxx can't return a result set in the given context (works i require_once('skipif.inc'); require_once('skipifconnectfailure.inc'); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { +if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { die(sprintf('skip Cannot connect to MySQL, [%d] %s.', mysqli_connect_errno(), mysqli_connect_error())); } if (mysqli_get_server_version($link) <= 50000) { @@ -53,7 +53,7 @@ print "done!"; --CLEAN-- fetch()) { + /* NOTE: libmysql - http://bugs.mysql.com/bug.php?id=47483 */ if ($data[$index] != $column1) { - printf("[004] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + if ($IS_MYSQLND || $index != 1) { + printf("[004] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } else { + if ($column1 != "thre") + printf("[005] Got '%s'. Please check if http://bugs.mysql.com/bug.php?id=47483 has been fixed and adapt tests bug45019.phpt/mysqli_ps_select_union.phpt", $column1); + } } $index++; } $stmt->close(); - // Regular (non-prepared) queries - print "Mixing CAST('somestring'AS CHAR), integer and CAST(integer AS CHAR)...\n"; - if (!($res = $link->query("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) - printf("[005] [%d] %s\n", $link->errno, $link->error); - - $data = array(); - while ($row = $res->fetch_assoc()) { - $data[] = $row['column1']; - } - $res->free(); - - // Prepared Statements - if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) - printf("[006] [%d] %s\n", $link->errno, $link->error); - - $column1 = null; - if (!$stmt->execute() || !$stmt->bind_result($column1)) - printf("[007] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[008] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - var_dump($column1); - $index++; - } - $stmt->close(); - - print "Using integer only...\n"; - if (!($res = $link->query("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) - printf("[009] [%d] %s\n", $link->errno, $link->error); - - $data = array(); - while ($row = $res->fetch_assoc()) { - $data[] = $row['column1']; - } - $res->free(); - - // Prepared Statements - if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) - printf("[010] [%d] %s\n", $link->errno, $link->error); - - $column1 = null; - if (!$stmt->bind_result($column1) || !$stmt->execute()) - printf("[011] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[012] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - var_dump($column1); - $index++; - } - $stmt->close(); - - print "Testing bind_param(), strings only...\n"; - $two = 'two'; - $three = 'three'; - if (!($stmt = $link->prepare("SELECT 'one' AS column1 UNION SELECT ? UNION SELECT ?"))) - printf("[013] [%d] %s\n", $stmt->errno, $stmt->error); - - $column1 = null; - if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) - printf("[014] [%d] %s\n", $stmt->errno, $stmt->error); - - while ($stmt->fetch()) { - var_dump($column1); - } - $stmt->close(); - - print "Testing bind_param(), strings only, with CAST AS CHAR...\n"; - $two = 'two'; - $three = 'three beers are more than enough'; - if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST(? AS CHAR) UNION SELECT CAST(? AS CHAR)"))) - printf("[013] [%d] %s\n", $stmt->errno, $stmt->error); - - $column1 = null; - if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) - printf("[014] [%d] %s\n", $stmt->errno, $stmt->error); - - while ($stmt->fetch()) { - var_dump($column1); - } - $stmt->close(); - $link->close(); print "done!"; @@ -139,20 +56,4 @@ Using CAST('somestring' AS CHAR)... %unicode|string%(3) "one" %unicode|string%(5) "three" %unicode|string%(3) "two" -Mixing CAST('somestring'AS CHAR), integer and CAST(integer AS CHAR)... -%unicode|string%(1) "1" -%unicode|string%(5) "three" -%unicode|string%(1) "2" -Using integer only... -int(1) -int(303) -int(2) -Testing bind_param(), strings only... -%unicode|string%(3) "one" -%unicode|string%(5) "three" -%unicode|string%(3) "two" -Testing bind_param(), strings only, with CAST AS CHAR... -%unicode|string%(3) "one" -%unicode|string%(32) "three beers are more than enough" -%unicode|string%(3) "two" done! diff --git a/ext/mysqli/tests/bug45289.phpt b/ext/mysqli/tests/bug45289.phpt index 17d1a3b446..50775b55cc 100644 --- a/ext/mysqli/tests/bug45289.phpt +++ b/ext/mysqli/tests/bug45289.phpt @@ -7,29 +7,34 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- close(); + + $link = mysqli_init(); + if (!($link->real_connect($host, $user, $passwd, $db, $port, $socket))) + printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $user, $db, $port, $socket); + $id = 1; if (!($stmt = $link->prepare('SELECT id, label FROM test WHERE id=? LIMIT 1'))) - printf("[001] [%d] %s\n", $link->errno, $link->error); + printf("[002] [%d] %s\n", $link->errno, $link->error); if (!$stmt->bind_param('i', $id) || !$stmt->execute()) - printf("[002] [%d] %s\n", $stmt->errno, $stmt->error); + printf("[003] [%d] %s\n", $stmt->errno, $stmt->error); if ($res = $link->store_result()) { - printf("[003] Can store result!\n"); + if ($IS_MYSQLND) + printf("[004] Can store result!\n"); + else + printf("[004] [007] http://bugs.mysql.com/bug.php?id=47485\n"); } else { - printf("[003] [%d] %s\n", $link->errno, $link->error); + printf("[004] [%d] %s\n", $link->errno, $link->error); } - - var_dump($res->fetch_assoc()); ?> --CLEAN-- --EXPECTF-- -[003] [0%s - -Fatal error: Call to a member function fetch_assoc() on a non-object in %s on line %d +[004] [0%s diff --git a/ext/mysqli/tests/bug46614.phpt b/ext/mysqli/tests/bug46614.phpt index 84248b1fbb..9e78222713 100644 --- a/ext/mysqli/tests/bug46614.phpt +++ b/ext/mysqli/tests/bug46614.phpt @@ -12,7 +12,7 @@ if (!defined("MYSQLI_ASYNC")) { extData[] = 'Bar'; @@ -20,13 +20,11 @@ class MySQL_Ext extends mysqli{ } } +include ("connect.inc"); +$MySQL_Ext = new MySQL_Ext($host, $user, $passwd, $db, $port, $socket); - - include ("connect.inc"); - $MySQL_Ext = new MySQL_Ext($host, $user, $passwd, $db); - - $isEmpty = $MySQL_Ext->isEmpty(); - var_dump($isEmpty); +$isEmpty = $MySQL_Ext->isEmpty(); +var_dump($isEmpty); ?> --EXPECT-- bool(false) diff --git a/ext/mysqli/tests/bug47050.phpt b/ext/mysqli/tests/bug47050.phpt index 65b677aed9..0358802bac 100644 --- a/ext/mysqli/tests/bug47050.phpt +++ b/ext/mysqli/tests/bug47050.phpt @@ -12,7 +12,7 @@ if (!defined("MYSQLI_ASYNC")) { query("SELECT 'test'", MYSQLI_ASYNC); diff --git a/ext/mysqli/tests/bug48909.phpt b/ext/mysqli/tests/bug48909.phpt new file mode 100644 index 0000000000..55c85a6860 --- /dev/null +++ b/ext/mysqli/tests/bug48909.phpt @@ -0,0 +1,39 @@ +--TEST-- +Bug #48909 (Segmentation fault in mysqli_stmt_execute) +--SKIPIF-- + +--FILE-- +query("DROP TABLE IF EXISTS test") || + !$link->query(sprintf("CREATE TABLE test(id INT, label varchar(255)) ENGINE = %s", $engine))) + printf("[002] [%d] %s\n", $link->errno, $link->error); + + if (!$stmt = $link->prepare("INSERT INTO test(id, label) VALUES (?, ?)")) + printf("[003] [%d] %s\n", $link->errno, $link->error); + + if (!$stmt->bind_param("bb",$bvar, $bvar)) + printf("[004] [%d] %s\n", $stmt->errno, $stmt->error); + + if (!$stmt->execute()) + printf("[005] [%d] %s\n", $stmt->errno, $stmt->error); + + $stmt->close(); + $link->close(); + + echo "done"; +?> +--CLEAN-- + +--EXPECTF-- +done \ No newline at end of file diff --git a/ext/mysqli/tests/bug49027.phpt b/ext/mysqli/tests/bug49027.phpt index 9e5a7554cb..35434bdd2d 100644 --- a/ext/mysqli/tests/bug49027.phpt +++ b/ext/mysqli/tests/bug49027.phpt @@ -9,20 +9,54 @@ require_once('skipifconnectfailure.inc'); query("SELECT 42")->fetch_row()); + + if (!mysqli_query($link, "DROP TABLE IF EXISTS test") || + !mysqli_query($link, sprintf("CREATE TABLE test(id INT) ENGINE=%s", $engine))) { + printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + } + + mysqli_close($link); + + $link = mysqli_init(); + if (!mysqli_options($link, MYSQLI_INIT_COMMAND, "INSERT INTO test(id) VALUES(1)")) { + printf("[004] Cannot set INIT_COMMAND\n"); + } + + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) { + printf("[005] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + if (!$res = mysqli_query($link, "SELECT id FROM test")) + printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump(mysqli_fetch_assoc($res)); + + mysqli_free_result($res); + mysqli_close($link); + + print "done!"; +?> +--CLEAN-- + --EXPECTF-- array(1) { [0]=> %unicode|string%(2) "42" } +array(1) { + [%u|b%"id"]=> + %unicode|string%(1) "1" +} +done! diff --git a/ext/mysqli/tests/bug49442.phpt b/ext/mysqli/tests/bug49442.phpt new file mode 100644 index 0000000000..5323a28ed2 --- /dev/null +++ b/ext/mysqli/tests/bug49442.phpt @@ -0,0 +1,119 @@ +--TEST-- +Bug #49422 (mysqlnd: mysqli_real_connect() and LOAD DATA INFILE crash) +--SKIPIF-- + +--INI-- +mysqli.allow_local_infile=1 +mysqli.allow_persistent=1 +mysqli.max_persistent=1 +--FILE-- + +--CLEAN-- + +--EXPECTF-- +array(2) { + [%u|b%"id"]=> + %unicode|string%(2) "97" + [%u|b%"label"]=> + %unicode|string%(1) "x" +} +array(2) { + [%u|b%"id"]=> + %unicode|string%(2) "98" + [%u|b%"label"]=> + %unicode|string%(1) "y" +} +array(2) { + [%u|b%"id"]=> + %unicode|string%(2) "99" + [%u|b%"label"]=> + %unicode|string%(1) "z" +} +done! \ No newline at end of file diff --git a/ext/mysqli/tests/clean_table.inc b/ext/mysqli/tests/clean_table.inc index 8ea74aecdf..716cc84416 100644 --- a/ext/mysqli/tests/clean_table.inc +++ b/ext/mysqli/tests/clean_table.inc @@ -1,7 +1,7 @@ real_connect($host, $user, $passwd, $db, $port, $socket, $flags); + } else { + parent::__construct($host, $user, $passwd, $db, $port, $socket); + } + } + } ?> \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_affected_rows.phpt b/ext/mysqli/tests/mysqli_affected_rows.phpt index a09ed22742..6cb5451c0b 100644 --- a/ext/mysqli/tests/mysqli_affected_rows.phpt +++ b/ext/mysqli/tests/mysqli_affected_rows.phpt @@ -22,7 +22,7 @@ mysqli_affected_rows() if (!is_null($tmp = @mysqli_affected_rows($link, $link))) printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[004] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_affected_rows_oo.phpt b/ext/mysqli/tests/mysqli_affected_rows_oo.phpt index 9fbce3eb01..07b7bcb486 100644 --- a/ext/mysqli/tests/mysqli_affected_rows_oo.phpt +++ b/ext/mysqli/tests/mysqli_affected_rows_oo.phpt @@ -14,7 +14,7 @@ mysqli->affected_rows if (NULL !== ($tmp = @$mysqli->affected_rows)) printf("[000a] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) { + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) { printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } diff --git a/ext/mysqli/tests/mysqli_autocommit.phpt b/ext/mysqli/tests/mysqli_autocommit.phpt index d94e0dbbe3..cdd5559767 100644 --- a/ext/mysqli/tests/mysqli_autocommit.phpt +++ b/ext/mysqli/tests/mysqli_autocommit.phpt @@ -7,7 +7,7 @@ mysqli_autocommit() require_once('connect.inc'); require_once('skipifconnectfailure.inc'); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { die(sprintf("skip Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket)); } @@ -40,7 +40,7 @@ mysqli_autocommit() if (!is_null($tmp = @mysqli_autocommit($link, $link, $link))) printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[004] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } diff --git a/ext/mysqli/tests/mysqli_autocommit_oo.phpt b/ext/mysqli/tests/mysqli_autocommit_oo.phpt index a0c5f1f8d4..8f2c4b472f 100644 --- a/ext/mysqli/tests/mysqli_autocommit_oo.phpt +++ b/ext/mysqli/tests/mysqli_autocommit_oo.phpt @@ -7,7 +7,7 @@ mysqli->autocommit() require_once('skipifconnectfailure.inc'); require_once('connect.inc'); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) { + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) { printf("skip Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); exit(1); @@ -31,7 +31,7 @@ mysqli->autocommit() @@ -28,7 +28,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_change_user($link, $link, $link, $link, $link))) printf("[005] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[006] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_change_user_get_lock.phpt b/ext/mysqli/tests/mysqli_change_user_get_lock.phpt index 8ca387ab39..4cc071d7ab 100644 --- a/ext/mysqli/tests/mysqli_change_user_get_lock.phpt +++ b/ext/mysqli/tests/mysqli_change_user_get_lock.phpt @@ -70,7 +70,7 @@ sleep(5); /* Ok, let's try a NEW connection and a NEW lock! */ mysqli_close($link); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[010] Cannot open new connection, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/mysqli_change_user_insert_id.phpt b/ext/mysqli/tests/mysqli_change_user_insert_id.phpt index b3235092a0..83efb51492 100644 --- a/ext/mysqli/tests/mysqli_change_user_insert_id.phpt +++ b/ext/mysqli/tests/mysqli_change_user_insert_id.phpt @@ -7,7 +7,7 @@ require_once('skipifemb.inc'); require_once('skipifconnectfailure.inc'); require_once('connect.inc'); if (!$IS_MYSQLND) { - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die("skip Can't test server version, might hit known bugs http://bugs.mysql.com/bug.php?id=30472, http://bugs.mysql.com/bug.php?id=45184"); if (mysqli_get_client_version($link) <= 50135) /* TODO - check wich version got the patch */ @@ -20,7 +20,7 @@ if (!$IS_MYSQLND) { ') == 1) { $tmp = NULL; $link = NULL; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_character_set_name.phpt b/ext/mysqli/tests/mysqli_character_set_name.phpt index 03bc31159e..9a40099fe1 100644 --- a/ext/mysqli/tests/mysqli_character_set_name.phpt +++ b/ext/mysqli/tests/mysqli_character_set_name.phpt @@ -1,8 +1,8 @@ --TEST-- mysqli_chararcter_set_name(), mysql_client_encoding() [alias] --SKIPIF-- - @@ -23,7 +23,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_character_set_name($link, $link, $link))) printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[005] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_character_set_name_oo.phpt b/ext/mysqli/tests/mysqli_character_set_name_oo.phpt index 018a90ad8c..a56cf6ae8d 100644 --- a/ext/mysqli/tests/mysqli_character_set_name_oo.phpt +++ b/ext/mysqli/tests/mysqli_character_set_name_oo.phpt @@ -1,7 +1,7 @@ --TEST-- mysqli_chararcter_set_name(), mysql_client_encoding() [alias] --SKIPIF-- - --FILE-- unknown = $unknown; printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown); - $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); assert(mysqli_connect_error() === $mysqli->connect_error); printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", diff --git a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt index de4fb87ca4..b327fe656c 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt @@ -11,11 +11,11 @@ require_once('skipifconnectfailure.inc'); require('connect.inc'); require('table.inc'); - $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysqli_result = $mysqli->query('SELECT * FROM test'); $row = $mysqli_result->fetch_row(); - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $res = mysqli_query($link, 'SELECT * FROM test'); assert(mysqli_fetch_row($res) === $row); diff --git a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt index 45cc38a704..9ddb26e89e 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt @@ -11,7 +11,7 @@ Interface of the class mysqli_stmt require('connect.inc'); require('table.inc'); - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); $stmt = new mysqli_stmt($link); printf("Parent class:\n"); diff --git a/ext/mysqli/tests/mysqli_class_mysqli_warning.phpt b/ext/mysqli/tests/mysqli_class_mysqli_warning.phpt index c1d6687181..62f01cac6a 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_warning.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_warning.phpt @@ -21,7 +21,7 @@ if (!$TEST_EXPERIMENTAL) $mysqli = new mysqli(); $warning = new mysqli_warning($mysqli); - $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $stmt = new mysqli_stmt($mysqli); $warning = new mysqli_warning($stmt); @@ -32,7 +32,7 @@ if (!$TEST_EXPERIMENTAL) $warning = new mysqli_warning($obj); include("table.inc"); - $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); + $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $res = $mysqli->query('INSERT INTO test(id, label) VALUES (1, "zz")'); $warning = mysqli_get_warnings($mysqli); diff --git a/ext/mysqli/tests/mysqli_close.phpt b/ext/mysqli/tests/mysqli_close.phpt index 24e4a35c98..713c6e157e 100644 --- a/ext/mysqli/tests/mysqli_close.phpt +++ b/ext/mysqli/tests/mysqli_close.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_close() --SKIPIF-- - --FILE-- @@ -19,7 +19,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_close($link, $link))) printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_close_oo.phpt b/ext/mysqli/tests/mysqli_close_oo.phpt index 706767458a..c3d6a93974 100644 --- a/ext/mysqli/tests/mysqli_close_oo.phpt +++ b/ext/mysqli/tests/mysqli_close_oo.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_close() --SKIPIF-- - --FILE-- @@ -13,7 +13,7 @@ require_once('skipifconnectfailure.inc'); $tmp = NULL; $link = NULL; - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_commit.phpt b/ext/mysqli/tests/mysqli_commit.phpt index 1aecd16e48..6a3c1e86c9 100644 --- a/ext/mysqli/tests/mysqli_commit.phpt +++ b/ext/mysqli/tests/mysqli_commit.phpt @@ -6,7 +6,7 @@ require_once('skipif.inc'); require_once('skipifemb.inc'); require_once('skipifconnectfailure.inc'); -if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { +if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { die(sprintf("skip Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket)); } @@ -39,7 +39,7 @@ if ($row[1] == "DISABLED" || $row[1] == "NO") { if (!is_null($tmp = @mysqli_commit($link, $link))) printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[004] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_commit_oo.phpt b/ext/mysqli/tests/mysqli_commit_oo.phpt index d302e38cee..8d072999cb 100644 --- a/ext/mysqli/tests/mysqli_commit_oo.phpt +++ b/ext/mysqli/tests/mysqli_commit_oo.phpt @@ -5,7 +5,7 @@ mysqli_commit() require_once('skipif.inc'); require_once('skipifemb.inc'); require_once('skipifconnectfailure.inc'); -if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) { +if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) { die(sprintf("skip Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket)); } @@ -33,7 +33,7 @@ if ($row[1] == "DISABLED" || $row[1] == "NO") { if (!is_null($tmp = @$mysqli->commit())) printf("[013] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_connect_errno.phpt b/ext/mysqli/tests/mysqli_connect_errno.phpt index f1b1d7b01a..b48a75ef8c 100644 --- a/ext/mysqli/tests/mysqli_connect_errno.phpt +++ b/ext/mysqli/tests/mysqli_connect_errno.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_connect_errno() --SKIPIF-- - --FILE-- @@ -17,7 +17,7 @@ require_once('skipifconnectfailure.inc'); if (0 !== ($tmp = @mysqli_connect_errno($link))) printf("[001] Expecting integer/0, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); @@ -26,10 +26,10 @@ require_once('skipifconnectfailure.inc'); mysqli_close($link); - $link = @mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket); + $link = @my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket); if (false !== $link) printf("[004] Connect to the server should fail using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s, expecting boolean/false, got %s/%s\n", - $host, $user . 'unknown_really', $db, $port, $socket, gettype($link), $link); + $host, $user . 'unknown_really', $db, $port, $socket, gettype($link), var_export($link, true)); if (0 === ($tmp = mysqli_connect_errno())) printf("[005] Expecting integer/any non-zero, got %s/%s\n", gettype($tmp), $tmp); diff --git a/ext/mysqli/tests/mysqli_connect_error.phpt b/ext/mysqli/tests/mysqli_connect_error.phpt index 5016acf247..e65dc0eb07 100644 --- a/ext/mysqli/tests/mysqli_connect_error.phpt +++ b/ext/mysqli/tests/mysqli_connect_error.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_connect_error() --SKIPIF-- - --FILE-- @@ -17,7 +17,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_connect_error($link))) printf("[001] Expecting NULL/NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); @@ -26,7 +26,7 @@ require_once('skipifconnectfailure.inc'); mysqli_close($link); - if ($link = @mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) + if ($link = @my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) printf("[003] Connect to the server should fail using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $user . 'unknown_really', $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_connect_twice.phpt b/ext/mysqli/tests/mysqli_connect_twice.phpt index debc435b0e..7c6a726b29 100644 --- a/ext/mysqli/tests/mysqli_connect_twice.phpt +++ b/ext/mysqli/tests/mysqli_connect_twice.phpt @@ -10,14 +10,14 @@ require_once('skipifconnectfailure.inc'); report_mode = MYSQLI_REPORT_OFF; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[016] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); mysqli_query($link, "NO_SQL"); mysqli_close($link); $driver->report_mode = MYSQLI_REPORT_ERROR; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[017] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); mysqli_query($link, "NO_SQL"); mysqli_close($link); diff --git a/ext/mysqli/tests/mysqli_dump_debug_info.phpt b/ext/mysqli/tests/mysqli_dump_debug_info.phpt index d93738edc8..fe253e1cf7 100644 --- a/ext/mysqli/tests/mysqli_dump_debug_info.phpt +++ b/ext/mysqli/tests/mysqli_dump_debug_info.phpt @@ -19,7 +19,7 @@ require_once('skipifconnectfailure.inc'); if (NULL !== ($tmp = @mysqli_dump_debug_info($link))) printf("[002] Expecting NULL/NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); exit(1); diff --git a/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt b/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt index 2228f3d6c5..171ed56505 100644 --- a/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt +++ b/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt @@ -1,8 +1,8 @@ --TEST-- mysqli_enable_reads_from_master() --SKIPIF-- - @@ -19,7 +19,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_error($link))) printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } diff --git a/ext/mysqli/tests/mysqli_fetch_all_oo.phpt b/ext/mysqli/tests/mysqli_fetch_all_oo.phpt index 9d3032cbb9..297d92ac7d 100644 --- a/ext/mysqli/tests/mysqli_fetch_all_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_all_oo.phpt @@ -18,7 +18,7 @@ if (!function_exists('mysqli_fetch_all')) $mysqli = new mysqli(); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_fetch_array_large.phpt b/ext/mysqli/tests/mysqli_fetch_array_large.phpt new file mode 100644 index 0000000000..aa8c768715 --- /dev/null +++ b/ext/mysqli/tests/mysqli_fetch_array_large.phpt @@ -0,0 +1,150 @@ +--TEST-- +mysqli_fetch_array() - large packages (to test compression) +--SKIPIF-- + +--FILE-- + 0) ? parse_memory_limit(ini_get('memory_limit')) : pow(2, 32); + + /* try to respect php.ini but make run time a soft limit */ + $max_runtime = (ini_get('max_execution_time') > 0) ? ini_get('max_execution_time') : 30; + set_time_limit(0); + + do { + if ($package_size > $limit) { + printf("stop: memory limit - %s vs. %s\n", $package_size, $limit); + break; + } + + $start = microtime(true); + if (!mysqli_fetch_array_large($offset++, $link, $package_size)) { + printf("stop: packet size - %d\n", $package_size); + break; + } + + $duration = microtime(true) - $start; + $max_runtime -= $duration; + if ($max_runtime < ($duration * 3)) { + /* likely the next iteration will not be within max_execution_time */ + printf("stop: time limit - %2.2fs\n", $max_runtime); + break; + } + + $package_size += $package_size; + + } while (true); + + + mysqli_close($link); + print "done!"; +?> +--CLEAN-- + +--EXPECTF-- +stop: %s +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_fetch_array_oo.phpt b/ext/mysqli/tests/mysqli_fetch_array_oo.phpt index e8b2618f70..fcabb59030 100644 --- a/ext/mysqli/tests/mysqli_fetch_array_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_array_oo.phpt @@ -14,7 +14,7 @@ require_once('skipifconnectfailure.inc'); $link = NULL; require('table.inc'); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt b/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt index 9bbc802c23..d9bdcfad37 100644 --- a/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt +++ b/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt @@ -34,7 +34,7 @@ mysqli_fetch_assoc() - BIT return $bin; } - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_fetch_assoc_oo.phpt b/ext/mysqli/tests/mysqli_fetch_assoc_oo.phpt index 5106bb7e84..e9a746ec01 100644 --- a/ext/mysqli/tests/mysqli_fetch_assoc_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_assoc_oo.phpt @@ -20,7 +20,7 @@ require_once('skipifconnectfailure.inc'); printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); require('table.inc'); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_fetch_field_direct_oo.phpt b/ext/mysqli/tests/mysqli_fetch_field_direct_oo.phpt index 81328e621b..f1075139e3 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_direct_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_direct_oo.phpt @@ -20,7 +20,7 @@ require_once('skipifconnectfailure.inc'); require('table.inc'); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_fetch_field_flags.phpt b/ext/mysqli/tests/mysqli_fetch_field_flags.phpt index 6c0a9a51e0..6f1cea20c4 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_flags.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_flags.phpt @@ -7,7 +7,7 @@ require_once('skipifemb.inc'); require_once('skipifconnectfailure.inc'); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die(printf("skip: [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error())); if (mysqli_get_server_version($link) < 50041) @@ -101,7 +101,7 @@ mysqli_close($link); return array($expected_flags, $unexpected_flags, $found_flags); } - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); foreach ($columns as $column_def => $expected_flags) { diff --git a/ext/mysqli/tests/mysqli_fetch_lengths_oo.phpt b/ext/mysqli/tests/mysqli_fetch_lengths_oo.phpt index d5422dccac..ef7d7622fd 100644 --- a/ext/mysqli/tests/mysqli_fetch_lengths_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_lengths_oo.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); true); + foreach ($before as $k => $v) { + if (isset($ignore[$k])) + continue; + + if ($before[$k] != $after[$k]) + printf("[004] Statistics have changed - %s: %s => %s\n", $ + $k, $before[$k], $after[$k]); } $ignore = array("size" => true, "free_items" => true, "references" => true); diff --git a/ext/mysqli/tests/mysqli_get_client_stats.phpt b/ext/mysqli/tests/mysqli_get_client_stats.phpt index 9c1a0c6714..ed75f7bc54 100644 --- a/ext/mysqli/tests/mysqli_get_client_stats.phpt +++ b/ext/mysqli/tests/mysqli_get_client_stats.phpt @@ -91,7 +91,7 @@ mysqlnd.collect_memory_statistics=1 var_dump($info); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); exit(1); @@ -840,6 +840,8 @@ mysqlnd.collect_memory_statistics=1 mysqli_get_client_stats_assert_eq('buffered_sets', $new_info, (string)($info['buffered_sets'] + 1), $test_counter, 'mysqli_use_result()'); $info = $new_info; + mysqli_close($link); + /* no_index_used @@ -861,7 +863,7 @@ mysqlnd.collect_memory_statistics=1 --CLEAN-- --EXPECTF-- -array(119) { +array(121) { [%u|b%"bytes_sent"]=> %unicode|string%(1) "0" [%u|b%"bytes_received"]=> @@ -1031,9 +1033,9 @@ array(119) { [%u|b%"mem_malloc_ammount"]=> %unicode|string%(1) "0" [%u|b%"mem_calloc_count"]=> - %unicode|string%(1) "0" + %unicode|string%(%d) "%d" [%u|b%"mem_calloc_ammount"]=> - %unicode|string%(1) "0" + %unicode|string%(%d) "%d" [%u|b%"mem_realloc_count"]=> %unicode|string%(1) "0" [%u|b%"mem_realloc_ammount"]=> @@ -1124,6 +1126,10 @@ array(119) { %unicode|string%(1) "0" [%u|b%"proto_binary_fetched_other"]=> %unicode|string%(1) "0" + [%u|b%"init_command_executed_count"]=> + %unicode|string%(1) "0" + [%u|b%"init_command_failed_count"]=> + %unicode|string%(1) "0" } Testing buffered normal... Testing buffered normal... - SELECT id, label FROM test diff --git a/ext/mysqli/tests/mysqli_get_connection_stats.phpt b/ext/mysqli/tests/mysqli_get_connection_stats.phpt index 8c2926a0b8..698a4684ff 100644 --- a/ext/mysqli/tests/mysqli_get_connection_stats.phpt +++ b/ext/mysqli/tests/mysqli_get_connection_stats.phpt @@ -47,18 +47,33 @@ if (!function_exists('mysqli_get_connection_stats')) { var_dump($info2); } + if (!is_array($info = $link->get_connection_stats()) || empty($info)) + printf("[006] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info); + + foreach ($info as $k => &$v) { + if (strpos($k, "mem_") === 0) { + $v = 0; + } + } + + if ($info !== $info2) { + printf("[007] The hashes should be identical except of the memory related fields\n"); + var_dump($info); + var_dump($info2); + } + mysqli_close($link); include "table.inc"; if (!is_array($info = mysqli_get_connection_stats($link)) || empty($info)) - printf("[006] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info); + printf("[008] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info); if (!is_array($info2 = mysqli_get_client_stats()) || empty($info2)) - printf("[007] Expecting array/any_non_empty, got %s/%s\n", gettype($info2), $info2); + printf("[009] Expecting array/any_non_empty, got %s/%s\n", gettype($info2), $info2); // assuming the test is run in a plain-vanilla CLI environment if ($info === $info2) { - printf("[008] The hashes should not be identical\n"); + printf("[010] The hashes should not be identical\n"); var_dump($info); var_dump($info2); } diff --git a/ext/mysqli/tests/mysqli_get_connection_stats_off.phpt b/ext/mysqli/tests/mysqli_get_connection_stats_off.phpt index 4c5a7b71d6..4897063c12 100644 --- a/ext/mysqli/tests/mysqli_get_connection_stats_off.phpt +++ b/ext/mysqli/tests/mysqli_get_connection_stats_off.phpt @@ -17,7 +17,7 @@ if (!function_exists('mysqli_get_connection_stats')) { // connect and table inc connect to mysql and create tables require_once('connect.inc'); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } @@ -28,7 +28,7 @@ if (!function_exists('mysqli_get_connection_stats')) { } mysqli_close($link); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } diff --git a/ext/mysqli/tests/mysqli_get_warnings.phpt b/ext/mysqli/tests/mysqli_get_warnings.phpt index a8b632c67a..1472f297f3 100644 --- a/ext/mysqli/tests/mysqli_get_warnings.phpt +++ b/ext/mysqli/tests/mysqli_get_warnings.phpt @@ -25,7 +25,7 @@ if (!$TEST_EXPERIMENTAL) if (!is_null($tmp = @mysqli_get_warnings(''))) printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); } @@ -84,7 +84,7 @@ if (!$TEST_EXPERIMENTAL) mysqli_close($link); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[021] Cannot create mysqli object: [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); if (!$mysqli->query("DROP TABLE IF EXISTS t1")) @@ -103,7 +103,7 @@ if (!$TEST_EXPERIMENTAL) printf("[026] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); /* Yes, I really want to check if the object property is empty */ - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[027] Cannot create mysqli object: [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); $warning = new mysqli_warning($mysqli); @@ -113,7 +113,7 @@ if (!$TEST_EXPERIMENTAL) if ('' != ($tmp = $warning->message)) printf("[029] Expecting string/empty, got %s/%s\n", gettype($tmp), $tmp); - if (!$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket)) + if (!$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) printf("[030] Cannot create mysqli object: [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); if (!$mysqli->query("DROP TABLE IF EXISTS t1")) @@ -145,7 +145,7 @@ if (!$TEST_EXPERIMENTAL) ?> +--INI-- +default_socket_timeout=60 +max_execution_time=60 +mysqlnd.net_read_timeout=1 +--FILE-- + +--EXPECTF-- +Warning: mysqli_query(): MySQL server has gone away in %s on line %d + +Warning: mysqli_query(): Error reading result set's header in %s on line %d +[002] [%d] %s +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt new file mode 100644 index 0000000000..637fd1629e --- /dev/null +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt @@ -0,0 +1,37 @@ +--TEST-- +mysqlnd.net_read_timeout > default_socket_timeout +--SKIPIF-- + +--INI-- +default_socket_timeout=1 +mysqlnd.net_read_timeout=12 +max_execution_time=12 +--FILE-- +fetch_assoc()); + + mysqli_free_result($res); + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(6)"]=> + %unicode|string%(1) "0" +} +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt new file mode 100644 index 0000000000..f5a13c5f63 --- /dev/null +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt @@ -0,0 +1,36 @@ +--TEST-- +mysqlnd.net_read_timeout = 0 +--SKIPIF-- + +--INI-- +default_socket_timeout=10 +max_execution_time=10 +mysqlnd.net_read_timeout=0 +--FILE-- +fetch_assoc()); + + mysqli_free_result($res); + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(2)"]=> + %unicode|string%(1) "0" +} +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_no_reconnect.phpt b/ext/mysqli/tests/mysqli_no_reconnect.phpt index d392b5a1cf..aa7b1c3b51 100644 --- a/ext/mysqli/tests/mysqli_no_reconnect.phpt +++ b/ext/mysqli/tests/mysqli_no_reconnect.phpt @@ -13,7 +13,7 @@ mysqli.reconnect=0 require_once("connect.inc"); require_once("table.inc"); - if (!$link2 = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot create second database connection, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); @@ -73,7 +73,7 @@ mysqli.reconnect=0 printf("[011] Executing a query should not be possible, connection should be closed, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - if (!$link = @mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[012] Cannot create database connection, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 2a1e25c290..670f9aca75 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -43,7 +43,7 @@ already through other measures. $valid_options[] = constant('MYSQLI_OPT_INT_AND_FLOAT_NATIVE'); if (defined('MYSQLI_OPT_NUMERIC_AND_DATETIME_AS_UNICODE')) $valid_options[] = constant('MYSQLI_OPT_NUMERIC_AND_DATETIME_AS_UNICODE'); - + $tmp = NULL; $link = NULL; @@ -85,11 +85,14 @@ already through other measures. !($tmp = mysqli_options($link, constant('MYSQLI_OPT_NUMERIC_AND_DATETIME_AS_UNICODE'), true))) printf("[006] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); - for ($flag = -10000; $flag < 10000; $flag++) { - if (in_array($flag, $valid_options)) - continue; - if (FALSE !== ($tmp = mysqli_options($link, $flag, 'definetely not an mysqli_option'))) { - var_dump("SOME_FLAG", $flag, $tmp); + if ($IS_MYSQLND) { + /* Don't do this with libmysql. You may hit options not exported to PHP and cause false positives */ + for ($flag = -10000; $flag < 10000; $flag++) { + if (in_array($flag, $valid_options)) + continue; + if (FALSE !== ($tmp = mysqli_options($link, $flag, 'definetely not an mysqli_option'))) { + var_dump(array("SOME_FLAG" => $flag, "ret" => $tmp)); + } } } @@ -97,7 +100,6 @@ already through other measures. echo "Link closed"; var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=1')); - var_dump("SOME_RANDOM_FLAG", mysqli_options($link, $flag, 'definetly not an mysqli_option')); print "done!"; ?> --EXPECTF-- @@ -127,8 +129,4 @@ Link closed Warning: mysqli_options(): Couldn't fetch mysqli in %s line %d %s(19) "MYSQLI_INIT_COMMAND" NULL - -Warning: mysqli_options(): Couldn't fetch mysqli in %s line %d -%s(16) "SOME_RANDOM_FLAG" -NULL done! diff --git a/ext/mysqli/tests/mysqli_options_init_command.phpt b/ext/mysqli/tests/mysqli_options_init_command.phpt index 667b581753..2ba2ce4616 100644 --- a/ext/mysqli/tests/mysqli_options_init_command.phpt +++ b/ext/mysqli/tests/mysqli_options_init_command.phpt @@ -1,19 +1,78 @@ --TEST-- mysqli_options() --SKIPIF-- - --FILE-- +--CLEAN-- + --EXPECTF-- -done! +Warning: mysqli_real_connect(): (%s/%d): %s in %s on line %d +[010] Cannot connect to the server using %s +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_options_openbasedir.phpt b/ext/mysqli/tests/mysqli_options_openbasedir.phpt index d5a5bf45ca..81d8ffef64 100644 --- a/ext/mysqli/tests/mysqli_options_openbasedir.phpt +++ b/ext/mysqli/tests/mysqli_options_openbasedir.phpt @@ -11,7 +11,7 @@ open_basedir="." --FILE-- --EXPECTF-- -Warning: mysqli_connect(): Persistent connections are disabled. Downgrading to normal in %s on line %d +Warning: my_mysqli_connect(): Persistent connections are disabled. Downgrading to normal in %s on line %d -Warning: mysqli_connect(): Persistent connections are disabled. Downgrading to normal in %s on line %d +Warning: my_mysqli_connect(): Persistent connections are disabled. Downgrading to normal in %s on line %d Connecction 1 - SELECT @pcondisabled -> 'Connection 1' Connecction 2 - SELECT @pcondisabled -> '' done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_pconn_kill.phpt b/ext/mysqli/tests/mysqli_pconn_kill.phpt index 01c37e309a..297dd4cb63 100755 --- a/ext/mysqli/tests/mysqli_pconn_kill.phpt +++ b/ext/mysqli/tests/mysqli_pconn_kill.phpt @@ -18,7 +18,7 @@ mysqli.max_persistent=2 require_once("table.inc"); $host = 'p:' . $host; - if (!$plink = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$plink = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); @@ -66,7 +66,7 @@ mysqli.max_persistent=2 // On PHP side this should do nothing. PHP should not try to close the connection or something. @mysqli_close($plink); - if (!$plink = @mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$plink = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[011] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); if (!$res3 = @mysqli_query($plink, 'SELECT id FROM test ORDER BY id LIMIT 1')) { @@ -79,7 +79,7 @@ mysqli.max_persistent=2 // remove the "p:" from the host variable $host = substr($host, 2); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[013] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); if (!$res4 = mysqli_query($link, 'SELECT id FROM test ORDER BY id LIMIT 1')) diff --git a/ext/mysqli/tests/mysqli_pconn_limits.phpt b/ext/mysqli/tests/mysqli_pconn_limits.phpt index 13beb69fbf..84cd11e599 100644 --- a/ext/mysqli/tests/mysqli_pconn_limits.phpt +++ b/ext/mysqli/tests/mysqli_pconn_limits.phpt @@ -28,7 +28,7 @@ mysqli.max_links=-1 mysqli_free_result($res); printf("Regular connection 1 - '%s'\n", $row['_desc']); - if (!$link2 = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot open second regular connection, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); @@ -41,7 +41,7 @@ mysqli.max_links=-1 printf("Regular connection 2 - '%s'\n", $row['_desc']); $host = 'p:' . $host; - if (!$plink = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$plink = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[004] Cannot create persistent connection using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s, [%d] %s\n", $host, $user, $db, $port, $socket, mysqli_connect_errno(), mysqli_connect_error()); @@ -54,7 +54,7 @@ mysqli.max_links=-1 mysqli_free_result($res); printf("Persistent connection 1 - '%s'\n", $row['_desc']); - if (!$plink2 = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$plink2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[006] Cannot create persistent connection using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s, [%d] %s\n", $host, $user, $db, $port, $socket, mysqli_connect_errno(), mysqli_connect_error()); @@ -68,7 +68,7 @@ mysqli.max_links=-1 printf("Persistent connection 2 - '%s'\n", $row['_desc']); $plink3 = mysqli_init(); - if (!mysqli_real_connect($plink3, $host, $user, $passwd, $db, $port, $socket)) + if (!my_mysqli_real_connect($plink3, $host, $user, $passwd, $db, $port, $socket)) printf("[008] Cannot create persistent connection using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s, [%d] %s\n", $host, $user, $db, $port, $socket, mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/mysqli_pconn_max_links.phpt b/ext/mysqli/tests/mysqli_pconn_max_links.phpt index a6cb0ed8d5..3ccb761360 100644 --- a/ext/mysqli/tests/mysqli_pconn_max_links.phpt +++ b/ext/mysqli/tests/mysqli_pconn_max_links.phpt @@ -11,7 +11,7 @@ Persistent connections and mysqli.max_links die("skip mysqlnd only test"); // we need a second DB user to test for a possible flaw in the ext/mysql[i] code - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die(sprintf("skip Cannot connect [%d] %s", mysqli_connect_errno(), mysqli_connect_error())); mysqli_query($link, 'DROP USER pcontest'); @@ -36,7 +36,7 @@ Persistent connections and mysqli.max_links die("skip GRANT failed"); } - if (!($link_pcontest = @mysqli_connect($host, 'pcontest', 'pcontest', $db, $port, $socket))) { + if (!($link_pcontest = @my_mysqli_connect($host, 'pcontest', 'pcontest', $db, $port, $socket))) { mysqli_query($link, 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest'); mysqli_query($link, 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@localhost'); mysqli_query($link, 'DROP USER pcontest@localhost'); @@ -54,7 +54,7 @@ mysqli.max_persistent=2 require_once("connect.inc"); require_once('table.inc'); - if (!$plink = mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) + if (!$plink = my_mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) printf("[001] Cannot connect using the second DB user created during SKIPIF, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); @@ -107,7 +107,7 @@ mysqli.max_persistent=2 printf("[009] Persistent connection has not been killed\n"); // this fails and we have 0 (<= $num_plinks) connections - if ($plink = @mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) + if ($plink = @my_mysqli_connect('p:' . $host, 'pcontest', 'pcontest', $db, $port, $socket)) printf("[010] Can connect using the old password, [%d] %s\n", mysqli_connect_errno($link), mysqli_connect_error($link)); @@ -123,7 +123,7 @@ mysqli.max_persistent=2 if ($num_plinks_kill > $num_plinks) printf("[011] Expecting Active Persistent Links < %d, got %d\n", $num_plinks, $num_plinks_kill); - if (!$plink = mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) + if (!$plink = my_mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) printf("[012] Cannot connect using the new password, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); @@ -137,7 +137,7 @@ mysqli.max_persistent=2 mysqli_free_result($res); var_dump($row); - if ($plink2 = mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) + if ($plink2 = my_mysqli_connect('p:' . $host, 'pcontest', 'newpass', $db, $port, $socket)) printf("[015] Can open more persistent connections than allowed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); @@ -161,7 +161,7 @@ mysqli.max_persistent=2 --CLEAN-- --FILE-- diff --git a/ext/mysqli/tests/mysqli_poll.phpt b/ext/mysqli/tests/mysqli_poll.phpt index 1bfae4bdbe..c691835f32 100644 --- a/ext/mysqli/tests/mysqli_poll.phpt +++ b/ext/mysqli/tests/mysqli_poll.phpt @@ -17,7 +17,7 @@ if (!$IS_MYSQLND) function get_connection() { global $host, $user, $passwd, $db, $port, $socket; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); return $link; } @@ -53,14 +53,25 @@ if (!$IS_MYSQLND) printf("[009] Expecting int/0 got %s/%s\n", gettype($tmp), var_export($tmp, true)); - function poll_async($offset, $links, $errors, $reject, $exp_ready) { + function poll_async($offset, $link, $links, $errors, $reject, $exp_ready, $use_oo_syntax) { - if ($exp_ready !== ($tmp = mysqli_poll($links, $errors, $reject, 0, 1000))) - printf("[%03d + 1] There should be %d links ready to read from, %d ready\n", - $exp_ready, $tmp); + if ($use_oo_syntax) { + if ($exp_ready !== ($tmp = $link->poll($links, $errors, $reject, 0, 1000))) + printf("[%03d + 1] There should be %d links ready to read from, %d ready\n", + $exp_ready, $tmp); + } else { + if ($exp_ready !== ($tmp = mysqli_poll($links, $errors, $reject, 0, 1000))) + printf("[%03d + 1] There should be %d links ready to read from, %d ready\n", + $exp_ready, $tmp); + } foreach ($links as $mysqli) { - if (is_object($res = mysqli_reap_async_query($mysqli))) { + if ($use_oo_syntax) { + $res = $mysqli->reap_async_query(); + } else { + $res = mysqli_reap_async_query($mysqli); + } + if (is_object($res)) { printf("[%03d + 2] Can fetch resultset although no query has been run!\n", $offset); } else if (mysqli_errno($mysqli) > 0) { printf("[%03d + 3] Error indicated through links array: %d/%s", @@ -85,7 +96,14 @@ if (!$IS_MYSQLND) $links = array($link); $errors = array($link); $reject = array($link); - poll_async(10, $links, $errors, $reject, 0); + poll_async(10, $link, $links, $errors, $reject, 0, false); + mysqli_close($link); + + $link = get_connection(); + $links = array($link); + $errors = array($link); + $reject = array($link); + poll_async(11, $link, $links, $errors, $reject, 0, true); mysqli_close($link); // Connections on which no query has been send - 2 @@ -94,7 +112,7 @@ if (!$IS_MYSQLND) $links = array($link, $link); $errors = array($link, $link); $reject = array(); - poll_async(11, $links, $errors, $reject, 0); + poll_async(12, $link, $links, $errors, $reject, 0, false); // Connections on which no query has been send - 3 // Difference: pass two connections @@ -102,7 +120,7 @@ if (!$IS_MYSQLND) $links = array($link, get_connection()); $errors = array($link, $link); $reject = array(); - poll_async(12, $links, $errors, $reject, 0); + poll_async(13, $link, $links, $errors, $reject, 0, false); // Reference mess... $link = get_connection(); @@ -110,15 +128,16 @@ if (!$IS_MYSQLND) $errors = array($link); $ref_errors =& $errors; $reject = array(); - poll_async(13, $links, $ref_errors, $reject, 0); + poll_async(14, $link, $links, $ref_errors, $reject, 0, false); print "done!"; ?> --EXPECTF-- [010 + 6] Rejecting thread %d: 0/ [011 + 6] Rejecting thread %d: 0/ -[011 + 6] Rejecting thread %d: 0/ [012 + 6] Rejecting thread %d: 0/ [012 + 6] Rejecting thread %d: 0/ [013 + 6] Rejecting thread %d: 0/ +[013 + 6] Rejecting thread %d: 0/ +[014 + 6] Rejecting thread %d: 0/ done! diff --git a/ext/mysqli/tests/mysqli_poll_kill.phpt b/ext/mysqli/tests/mysqli_poll_kill.phpt index 2b31ef7b99..73382b7301 100644 --- a/ext/mysqli/tests/mysqli_poll_kill.phpt +++ b/ext/mysqli/tests/mysqli_poll_kill.phpt @@ -17,7 +17,7 @@ if (!$IS_MYSQLND) function get_connection() { global $host, $user, $passwd, $db, $port, $socket; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); return $link; } diff --git a/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt b/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt index d95a7b41ba..56f9182f48 100644 --- a/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt +++ b/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt @@ -17,7 +17,7 @@ if (!$IS_MYSQLND) function get_connection() { global $host, $user, $passwd, $db, $port, $socket; - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); return $link; } @@ -156,7 +156,7 @@ if (!$IS_MYSQLND) --CLEAN-- --FILE-- +--FILE-- +query("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"))) + printf("[001] [%d] %s\n", $link->errno, $link->error); + + $data = array(); + while ($row = $res->fetch_assoc()) { + $data[] = $row['column1']; + var_dump($row['column1']); + } + $res->free(); + + // Prepared Statements + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"))) + printf("[002] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->execute() || !$stmt->bind_result($column1)) + printf("[003] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[004] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + + if ($IS_MYSQLND) { + /* + Advantage mysqlnd - + The metadata mysqlnd has availabe after prepare is better than + the one made availabe by the MySQL Client Library (libmysql). + "libmysql" will give wrong results and that is OK - + http://bugs.mysql.com/bug.php?id=47483 + */ + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"))) + printf("[005] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + /* Note: bind_result before execute */ + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[006] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[007] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + } + + // Regular (non-prepared) queries + print "Mixing CAST('somestring'AS CHAR), integer and CAST(integer AS CHAR)...\n"; + if (!($res = $link->query("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) + printf("[008] [%d] %s\n", $link->errno, $link->error); + + $data = array(); + while ($row = $res->fetch_assoc()) { + $data[] = $row['column1']; + } + $res->free(); + + // Prepared Statements + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) + printf("[009] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->execute() || !$stmt->bind_result($column1)) + printf("[010] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[011] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + var_dump($column1); + $index++; + } + $stmt->close(); + + if ($IS_MYSQLND) { + /* Advantage mysqlnd - see above... */ + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) + printf("[012] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[013] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[014] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + } + + print "Using integer only...\n"; + if (!($res = $link->query("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) + printf("[015] [%d] %s\n", $link->errno, $link->error); + + $data = array(); + while ($row = $res->fetch_assoc()) { + $data[] = $row['column1']; + } + $res->free(); + + // Prepared Statements + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) + printf("[016] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->execute() || !$stmt->bind_result($column1)) + printf("[017] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[018] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + var_dump($column1); + $index++; + } + $stmt->close(); + + if ($IS_MYSQLND) { + /* Advantage mysqlnd - see above */ + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) + printf("[019] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[020] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[021] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + } + + print "Testing bind_param(), strings only...\n"; + $two = 'two'; + $three = 'three'; + if (!($stmt = $link->prepare("SELECT 'one' AS column1 UNION SELECT ? UNION SELECT ?"))) + printf("[022] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->execute() || !$stmt->bind_result($column1)) + printf("[023] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + $data = array(); + while ($stmt->fetch()) { + $data[$index++] = $column1; + var_dump($column1); + } + $stmt->close(); + + if ($IS_MYSQLND) { + /* Advantage mysqlnd - see above */ + $two = 'two'; + $three = 'three'; + if (!($stmt = $link->prepare("SELECT 'one' AS column1 UNION SELECT ? UNION SELECT ?"))) + printf("[024] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) + printf("[025] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[26] Row %d, expecting %s/%s, got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + } + + print "Testing bind_param(), strings only, with CAST AS CHAR...\n"; + $two = 'two'; + $three = 'three beers are more than enough'; + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST(? AS CHAR) UNION SELECT CAST(? AS CHAR)"))) + printf("[027] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->execute() || !$stmt->bind_result($column1)) + printf("[028] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + $data = array(); + while ($stmt->fetch()) { + $data[$index++] = $column1; + var_dump($column1); + } + $stmt->close(); + + if ($IS_MYSQLND) { + /* Advantage mysqlnd - see above */ + $two = 'two'; + $three = 'three beers are more than enough'; + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST(? AS CHAR) UNION SELECT CAST(? AS CHAR)"))) + printf("[029] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) + printf("[030] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[31] Row %d, expecting %s/%s, got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); + } + $index++; + } + $stmt->close(); + } + + $link->close(); + + print "done!"; +?> +--EXPECTF-- +Using CAST('somestring' AS CHAR)... +%unicode|string%(3) "one" +%unicode|string%(5) "three" +%unicode|string%(3) "two" +Mixing CAST('somestring'AS CHAR), integer and CAST(integer AS CHAR)... +%unicode|string%(1) "1" +%unicode|string%(5) "three" +%unicode|string%(1) "2" +Using integer only... +int(1) +int(303) +int(2) +Testing bind_param(), strings only... +%unicode|string%(3) "one" +%unicode|string%(5) "three" +%unicode|string%(3) "two" +Testing bind_param(), strings only, with CAST AS CHAR... +%unicode|string%(3) "one" +%unicode|string%(32) "three beers are more than enough" +%unicode|string%(3) "two" +done! diff --git a/ext/mysqli/tests/mysqli_query.phpt b/ext/mysqli/tests/mysqli_query.phpt index 973a447e13..0e45f03882 100644 --- a/ext/mysqli/tests/mysqli_query.phpt +++ b/ext/mysqli/tests/mysqli_query.phpt @@ -115,7 +115,7 @@ require_once('skipifconnectfailure.inc'); --CLEAN-- +--INI-- +mysqli.allow_local_infile=1 --FILE-- @@ -180,17 +181,17 @@ object(mysqli)#%d (%d) { [%u|b%"affected_rows"]=> NULL [%u|b%"client_info"]=> - %unicode|string%(%d) "%s" + %s [%u|b%"client_version"]=> int(%d) [%u|b%"connect_errno"]=> int(%d) [%u|b%"connect_error"]=> - %unicode|string%(%d) "%s" + %unicode|string%(%d) "%s [%u|b%"errno"]=> - int(%d) + %s [%u|b%"error"]=> - %unicode|string%(%d) "%s" + %s [%u|b%"field_count"]=> NULL [%u|b%"host_info"]=> @@ -212,4 +213,6 @@ object(mysqli)#%d (%d) { [%u|b%"warning_count"]=> NULL } -done! + +Warning: mysqli_real_connect(): Couldn't fetch mysqli in %s on line %d +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_reconnect.phpt b/ext/mysqli/tests/mysqli_reconnect.phpt index 68cffc3b2b..7f05a20d2f 100644 --- a/ext/mysqli/tests/mysqli_reconnect.phpt +++ b/ext/mysqli/tests/mysqli_reconnect.phpt @@ -15,7 +15,7 @@ mysqli.reconnect=1 require_once("connect.inc"); require_once("table.inc"); - if (!$link2 = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot create second database connection, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/mysqli_report.phpt b/ext/mysqli/tests/mysqli_report.phpt index 525921f4c3..dc927997f3 100644 --- a/ext/mysqli/tests/mysqli_report.phpt +++ b/ext/mysqli/tests/mysqli_report.phpt @@ -85,7 +85,7 @@ require_once('skipifconnectfailure.inc'); mysqli_close($link); /* mysqli_stmt_execute() = mysql_stmt_execute cannot be tested from PHP */ - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[008] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); $stmt = mysqli_stmt_init($link); mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?"); @@ -105,7 +105,7 @@ require_once('skipifconnectfailure.inc'); // Check mysqli_report(MYSQLI_REPORT_OFF); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[010] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); $stmt = mysqli_stmt_init($link); mysqli_stmt_prepare($stmt, "FOO"); @@ -118,7 +118,7 @@ require_once('skipifconnectfailure.inc'); mysqli_stmt_close($stmt); mysqli_close($link); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[011] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); $stmt = mysqli_stmt_init($link); mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?"); @@ -139,8 +139,8 @@ require_once('skipifconnectfailure.inc'); already tested php_mysqli_throw_sql_exception() -> - mysqli_real_connect() - mysqli_connect() + my_mysqli_real_connect() + my_mysqli_connect() can't be tested: mysqli_query() via mysql_use_result()/mysql_store_result() */ @@ -149,7 +149,7 @@ require_once('skipifconnectfailure.inc'); try { - if ($link = mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) + if ($link = my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) printf("[012] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $user . 'unknown_really', $db, $port, $socket); mysqli_close($link); @@ -162,7 +162,7 @@ require_once('skipifconnectfailure.inc'); if (!$link = mysqli_init()) printf("[014] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); - if ($link = mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) + if ($link = my_mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) printf("[015] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $user . 'unknown_really', $db, $port, $socket); mysqli_close($link); @@ -191,7 +191,7 @@ require_once('skipifconnectfailure.inc'); mysqli_report(MYSQLI_REPORT_OFF); mysqli_report(MYSQLI_REPORT_INDEX); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[017] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); // this might cause a warning - no index used @@ -235,7 +235,7 @@ require_once('skipifconnectfailure.inc'); // mysqli_use_result(), mysqli_thread_safe(), mysqli_thread_id() mysqli_report(MYSQLI_REPORT_OFF); mysqli_close($link); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[024] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); if (!$stmt = mysqli_stmt_init($link)) diff --git a/ext/mysqli/tests/mysqli_report_wo_ps.phpt b/ext/mysqli/tests/mysqli_report_wo_ps.phpt index f4b8fd9c17..08909264a7 100644 --- a/ext/mysqli/tests/mysqli_report_wo_ps.phpt +++ b/ext/mysqli/tests/mysqli_report_wo_ps.phpt @@ -69,7 +69,7 @@ require_once('skipifconnectfailure.inc'); try { - if ($link = mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) + if ($link = my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) printf("[010] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $user . 'unknown_really', $db, $port, $socket); mysqli_close($link); @@ -82,7 +82,7 @@ require_once('skipifconnectfailure.inc'); if (!$link = mysqli_init()) printf("[012] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); - if ($link = mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) + if ($link = my_mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) printf("[013] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n", $host, $user . 'unknown_really', $db, $port, $socket); mysqli_close($link); diff --git a/ext/mysqli/tests/mysqli_result_references.phpt b/ext/mysqli/tests/mysqli_result_references.phpt index ea1f276b1a..b6bce0d981 100644 --- a/ext/mysqli/tests/mysqli_result_references.phpt +++ b/ext/mysqli/tests/mysqli_result_references.phpt @@ -39,7 +39,7 @@ require_once('skipifconnectfailure.inc'); mysqli_free_result($res); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt index 07dac9ba8c..384f85fbbd 100644 --- a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt +++ b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt @@ -9,6 +9,9 @@ require_once('skipifconnectfailure.inc'); require_once('connect.inc'); if (!$IS_MYSQLND) die("skip Test for mysqlnd only"); + +if ((version_compare(PHP_VERSION, '5.9.9', '>') == 1)) + die("skip (TODO) PHP 6.0 has a difference debug_zval_dump output format"); ?> --FILE-- @@ -30,6 +33,8 @@ if (!$IS_MYSQLND) $references[$idx]['id_ref'] = &$row['id']; $references[$idx++]['id_copy'] = $row['id']; } + + debug_zval_dump($references); mysqli_free_result($res); if (!(mysqli_real_query($link, "SELECT id, label FROM test ORDER BY id ASC LIMIT 2")) || @@ -52,7 +57,7 @@ if (!$IS_MYSQLND) print "done!"; ?> --EXPECTF-- -array(2) refcount(2){ +array(1) refcount(2){ [0]=> array(4) refcount(1){ [%u|b%"row_ref"]=> @@ -69,6 +74,24 @@ array(2) refcount(2){ [%u|b%"id_copy"]=> %unicode|string%(1) "1" refcount(1) } +} +array(2) refcount(2){ + [0]=> + array(4) refcount(1){ + [%u|b%"row_ref"]=> + &NULL refcount(2) + [%u|b%"row_copy"]=> + array(2) refcount(1){ + [%u|b%"id"]=> + %unicode|string%(1) "1" refcount(1) + [%u|b%"label"]=> + %unicode|string%(1) "a" refcount(1) + } + [%u|b%"id_ref"]=> + %unicode|string%(1) "1" refcount(1) + [%u|b%"id_copy"]=> + %unicode|string%(1) "1" refcount(1) + } [1]=> array(5) refcount(1){ [%u|b%"row_ref"]=> @@ -76,14 +99,14 @@ array(2) refcount(2){ [%u|b%"id"]=> &%unicode|string%(1) "2" refcount(2) [%u|b%"label"]=> - %unicode|string%(1) "b" refcount(3) + %unicode|string%(1) "b" refcount(2) } [%u|b%"row_copy"]=> array(2) refcount(1){ [%u|b%"id"]=> - %unicode|string%(1) "2" refcount(2) + %unicode|string%(1) "2" refcount(1) [%u|b%"label"]=> - %unicode|string%(1) "b" refcount(3) + %unicode|string%(1) "b" refcount(2) } [%u|b%"id_ref"]=> &%unicode|string%(1) "2" refcount(2) diff --git a/ext/mysqli/tests/mysqli_result_unclonable.phpt b/ext/mysqli/tests/mysqli_result_unclonable.phpt index 93cf663219..dfde9a78c5 100644 --- a/ext/mysqli/tests/mysqli_result_unclonable.phpt +++ b/ext/mysqli/tests/mysqli_result_unclonable.phpt @@ -1,16 +1,16 @@ --TEST-- Trying to clone mysqli_result object --SKIPIF-- - --FILE-- --FILE-- @@ -19,7 +19,7 @@ require_once('skipifconnectfailure.inc'); if (!is_null($tmp = @mysqli_select_db($link))) printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_send_query.phpt b/ext/mysqli/tests/mysqli_send_query.phpt index ccddfd2339..53cf25093e 100755 --- a/ext/mysqli/tests/mysqli_send_query.phpt +++ b/ext/mysqli/tests/mysqli_send_query.phpt @@ -26,7 +26,7 @@ if (!$TEST_EXPERIMENTAL) if (NULL !== ($tmp = @mysqli_send_query($link))) printf("[002] Expecting NULL/NULL, got %s/%s\n", gettype($tmp), $tmp); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { printf("[003] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); } diff --git a/ext/mysqli/tests/mysqli_set_charset.phpt b/ext/mysqli/tests/mysqli_set_charset.phpt index 27ec10f209..baf97bd3d3 100644 --- a/ext/mysqli/tests/mysqli_set_charset.phpt +++ b/ext/mysqli/tests/mysqli_set_charset.phpt @@ -14,7 +14,7 @@ if (!function_exists('mysqli_set_charset')) die("skip Function not available"); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die(sprintf("skip Cannot connect, [%d] %s", mysqli_connect_errno(), mysqli_connect_error())); if (!($res = mysqli_query($link, 'SELECT version() AS server_version')) || @@ -84,7 +84,7 @@ if ((($res = mysqli_query($link, 'SHOW CHARACTER SET LIKE "latin1"', MYSQLI_STOR printf("[011] Expecting boolean/false because of invalid character set, got %s/%s\n", gettype($ret), $ret); mysqli_close($link); - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[012] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt index 929587dafa..5cb1459d85 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt @@ -10,7 +10,7 @@ if (!function_exists('mysqli_set_local_infile_handler')) die("skip - function not available."); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt index ddcfdc8b87..ec097fe2b6 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt @@ -13,7 +13,7 @@ if (!function_exists('mysqli_set_local_infile_handler')) if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt index bcc60d7721..03f4288825 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt index 8f06630e5c..cb8162db70 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt index 71d768f290..7498e64f43 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt index 1732a1c9d1..7e24458890 100755 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt index 1aa2878dd3..3757b61d95 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt @@ -10,7 +10,7 @@ if (!function_exists('mysqli_set_local_infile_handler')) die("skip - function not available."); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt index eb39a91735..30a3bcc035 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt index d822e0a52b..465dcdb9d6 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt index 464519d0f8..5ea82e93f2 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt index 3912f52788..6354630c08 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt index 1d75d5ae82..c30f6ea916 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt @@ -10,7 +10,7 @@ if (!function_exists('mysqli_set_local_infile_handler')) die("skip - function not available."); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt index caee2be429..cde8f4b129 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt index 7d781d6c9e..a793ac6623 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt @@ -13,7 +13,7 @@ require_once('connect.inc'); if (!$TEST_EXPERIMENTAL) die("skip - experimental (= unsupported) feature"); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt index 38b3c00bef..c89fc2152c 100644 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt @@ -10,7 +10,7 @@ if (!function_exists('mysqli_set_local_infile_handler')) die("skip - function not available."); require_once('connect.inc'); -if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) +if (!$link = my_mysqli_connect($host, $user, $passwb, $db, $port, $socket)) die("skip Cannot connect to MySQL"); if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index d5c41827c3..21aacd25ff 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_set_opt() --SKIPIF-- - --FILE-- @@ -36,7 +36,7 @@ require_once('skipifconnectfailure.inc'); var_dump(mysqli_set_opt($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10)); var_dump(mysqli_set_opt($link, MYSQLI_OPT_LOCAL_INFILE, 1)); var_dump(mysqli_set_opt($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0')); - var_dump(mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)); + var_dump(my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)); var_dump(mysqli_set_opt($link, MYSQLI_READ_DEFAULT_GROUP, 'extra_my.cnf')); var_dump(mysqli_set_opt($link, MYSQLI_READ_DEFAULT_FILE, 'extra_my.cnf')); var_dump(mysqli_set_opt($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10)); diff --git a/ext/mysqli/tests/mysqli_ssl_set.phpt b/ext/mysqli/tests/mysqli_ssl_set.phpt index c53cdf1384..e868f34f19 100644 --- a/ext/mysqli/tests/mysqli_ssl_set.phpt +++ b/ext/mysqli/tests/mysqli_ssl_set.phpt @@ -1,9 +1,9 @@ --TEST-- mysqli_ssl_set() - test is a stub! --SKIPIF-- -close(); @@ -264,4 +267,4 @@ require_once('skipifconnectfailure.inc'); require_once("clean_table.inc"); ?> --EXPECTF-- -done! \ No newline at end of file +done! diff --git a/ext/mysqli/tests/mysqli_stmt_bind_param_references.phpt b/ext/mysqli/tests/mysqli_stmt_bind_param_references.phpt index 07a0ff34d6..24d4314f1f 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_param_references.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_param_references.phpt @@ -151,12 +151,13 @@ require_once('skipifconnectfailure.inc'); printf("[025] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); findRow(26, $link, $id_ref_ref, $label_ref_ref); + unset($id); + unset($label); $id = 102; $label = new stdClass(); $label->label = 'y'; $id_ref = &$GLOBALS['id']; $label_ref = &$label->label; - if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id_ref, $label_ref))) printf("[027] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp); if (true !== @mysqli_stmt_execute($stmt)) diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result.phpt index 00750ee7d4..f5756740e0 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_result.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_result.phpt @@ -282,8 +282,12 @@ require_once('skipifconnectfailure.inc'); func_mysqli_stmt_bind_result($link, $engine, "b", "MEDIUMTEXT", "", 1640, $hint_str_or_unicode); /* Is this one related? http://bugs.php.net/bug.php?id=35759 */ - func_mysqli_stmt_bind_result($link, $engine, "b", "LONGBLOB", "", 1660); - func_mysqli_stmt_bind_result($link, $engine, "b", "LONGTEXT", "", 1680, $hint_str_or_unicode); + if (($IS_MYSQLND) || (!$IS_MYSQLND && (ini_get('memory_limit') > 4294967296))) { + /* NOTE: the MySQL Client Library - not mysqlnd - will allocate + a hugge max_length(type) = 4GB bind buffer */ + func_mysqli_stmt_bind_result($link, $engine, "b", "LONGBLOB", "", 1660); + func_mysqli_stmt_bind_result($link, $engine, "b", "LONGTEXT", "", 1680, $hint_str_or_unicode); + } func_mysqli_stmt_bind_result($link, $engine, "s", "ENUM('a', 'b')", "a", 1700, $hint_str_or_unicode); func_mysqli_stmt_bind_result($link, $engine, "s", "ENUM('a', 'b')", NULL, 1720, $hint_str_or_unicode); diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt index bb8e87ffb5..1eef767478 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt @@ -25,11 +25,11 @@ require_once('skipifconnectfailure.inc'); return $bin; } - if (!$link_ins = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link_ins = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); - if (!$link_sel = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link_sel = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result_format.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result_format.phpt index 6fcbcd31b1..dee5a7e0f0 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_result_format.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_result_format.phpt @@ -138,7 +138,7 @@ memory_limit=83886080 return true; } - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect - [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); diff --git a/ext/mysqli/tests/mysqli_stmt_datatype_change.phpt b/ext/mysqli/tests/mysqli_stmt_datatype_change.phpt index 3418f68e03..25c183a2a1 100644 --- a/ext/mysqli/tests/mysqli_stmt_datatype_change.phpt +++ b/ext/mysqli/tests/mysqli_stmt_datatype_change.phpt @@ -9,12 +9,12 @@ require_once('skipifconnectfailure.inc'); --FILE-- +--FILE-- +type != MYSQLI_TYPE_GEOMETRY) { + printf("[%04d] [%d] %s wrong type %d\n", $offset + 10, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), $fields[1]->type); + } + + $num = 0; + $rows = array(); + while (true === @mysqli_stmt_fetch($stmt)) { + $rows[] = array('id' => $id, 'label' => $bind_res); + $num++; + } + + if ($num != 3) { + printf("[%04d] [%d] %s, expecting 3 results, got only %d results\n", + $offset + 17, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), $num); + return false; + } + mysqli_stmt_close($stmt); + + foreach ($rows as $row) { + if (!$stmt = mysqli_stmt_init($link)) { + printf("[%04d] [%d] %s\n", $offset + 10, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)")) { + printf("[%04d] [%d] %s\n", $offset + 11, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + return false; + } + + $new_id = $row['id'] + 10; + if (!mysqli_stmt_bind_param($stmt, "is", $new_id, $row['label'])) { + printf("[%04d] [%d] %s\n", $offset + 12, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + return false; + } + + if (!mysqli_stmt_execute($stmt)) { + printf("[%04d] [%d] %s\n", $offset + 13, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + return false; + } + mysqli_stmt_close($stmt); + + if (!$res_normal = mysqli_query($link, sprintf("SELECT id, label FROM test WHERE id = %d", + $new_id))) { + printf("[%04d] [%d] %s\n", $offset + 14, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if (!$row_normal = mysqli_fetch_assoc($res_normal)) { + printf("[%04d] [%d] %s\n", $offset + 15, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if ($row_normal['label'] != $row['label']) { + printf("[%04d] PS and non-PS return different data.\n", $offset + 16); + return false; + } + mysqli_free_result($res_normal); + } + + return true; + } + + func_mysqli_stmt_fetch_geom($link, $engine, "GEOMETRY", "GeomFromText('POINT(2 2)')", 20); + func_mysqli_stmt_fetch_geom($link, $engine, "POINT", "GeomFromText('POINT(1 1)')", 40); + func_mysqli_stmt_fetch_geom($link, $engine, "LINESTRING", "GeomFromText('LINESTRING(0 0,1 1,2 2)')", 60); + func_mysqli_stmt_fetch_geom($link, $engine, "POLYGON", "GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')", 80); + func_mysqli_stmt_fetch_geom($link, $engine, "MULTIPOINT", "GeomFromText('MULTIPOINT(1 1, 2 2)')", 100); + func_mysqli_stmt_fetch_geom($link, $engine, "MULTILINESTRING", "GeomFromText('MULTILINESTRING((0 0,1 1,2 2),(0 0,1 1,3 3))')", 120); + func_mysqli_stmt_fetch_geom($link, $engine, "MULTIPOLYGON", "GeomFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)),((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)))')", 140); + func_mysqli_stmt_fetch_geom($link, $engine, "GEOMETRYCOLLECTION", "GeomFromText('GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))')", 160); + + mysqli_close($link); + print "done!"; +?> +--CLEAN-- + +--EXPECTF-- +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt index b4bb34a675..6c476f7e9d 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt @@ -37,7 +37,7 @@ Fetching BIT column values using the PS API return $bin; } - if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", $host, $user, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_geom.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_geom.phpt new file mode 100644 index 0000000000..c86a385bee --- /dev/null +++ b/ext/mysqli/tests/mysqli_stmt_get_result_geom.phpt @@ -0,0 +1,143 @@ +--TEST-- +mysqli_stmt_get_result - geometry / spatial types +--SKIPIF-- + +--FILE-- +type != MYSQLI_TYPE_GEOMETRY) { + printf("[%04d] [%d] %s wrong type %d\n", $offset + 10, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), $fields[1]->type); + } + + $num = 0; + while ($row = mysqli_fetch_assoc($res)) { + $bind_res = &$row['label']; + + if (!$stmt2 = mysqli_stmt_init($link)) { + printf("[%04d] [%d] %s\n", $offset + 11, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if (!mysqli_stmt_prepare($stmt2, "INSERT INTO test(id, label) VALUES (?, ?)")) { + printf("[%04d] [%d] %s\n", $offset + 12, mysqli_stmt_errno($stmt2), mysqli_stmt_error($stmt2)); + return false; + } + + $id = $row['id'] + 10; + if (!mysqli_stmt_bind_param($stmt2, "is", $id, $bind_res)) { + printf("[%04d] [%d] %s\n", $offset + 13, mysqli_stmt_errno($stmt2), mysqli_stmt_error($stmt2)); + return false; + } + + if (!mysqli_stmt_execute($stmt2)) { + printf("[%04d] [%d] %s\n", $offset + 14, mysqli_stmt_errno($stmt2), mysqli_stmt_error($stmt2)); + return false; + } + mysqli_stmt_close($stmt2); + + if (!$res_normal = mysqli_query($link, sprintf("SELECT id, label FROM test WHERE id = %d", + $row['id'] + 10))) { + printf("[%04d] [%d] %s\n", $offset + 15, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if (!$row_normal = mysqli_fetch_assoc($res_normal)) { + printf("[%04d] [%d] %s\n", $offset + 16, mysqli_errno($link), mysqli_error($link)); + return false; + } + + if ($row_normal['label'] != $bind_res) { + printf("[%04d] PS and non-PS return different data.\n", $offset + 17); + return false; + } + mysqli_free_result($res_normal); + $num++; + } + + if ($num != 3) { + printf("[%04d] [%d] %s, expecting 3 results, got only %d results\n", + $offset + 18, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), $num); + mysqli_free_result($res); + mysqli_stmt_close($stmt); + return false; + } + mysqli_free_result($res); + mysqli_stmt_close($stmt); + + return true; + } + + func_mysqli_stmt_get_result_geom($link, $engine, "GEOMETRY", "GeomFromText('POINT(2 2)')", 20); + func_mysqli_stmt_get_result_geom($link, $engine, "POINT", "GeomFromText('POINT(1 1)')", 40); + func_mysqli_stmt_get_result_geom($link, $engine, "LINESTRING", "GeomFromText('LINESTRING(0 0,1 1,2 2)')", 60); + func_mysqli_stmt_get_result_geom($link, $engine, "POLYGON", "GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')", 80); + func_mysqli_stmt_get_result_geom($link, $engine, "MULTIPOINT", "GeomFromText('MULTIPOINT(1 1, 2 2)')", 100); + func_mysqli_stmt_get_result_geom($link, $engine, "MULTILINESTRING", "GeomFromText('MULTILINESTRING((0 0,1 1,2 2),(0 0,1 1,3 3))')", 120); + func_mysqli_stmt_get_result_geom($link, $engine, "MULTIPOLYGON", "GeomFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)),((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)))')", 140); + func_mysqli_stmt_get_result_geom($link, $engine, "GEOMETRYCOLLECTION", "GeomFromText('GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))')", 160); + + mysqli_close($link); + print "done!"; +?> +--CLEAN-- + +--EXPECTF-- +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt index 50bcf6503f..724a32a787 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt @@ -12,7 +12,7 @@ mysqli_stmt_get_result - data types --FILE-- ') == 1) ? 'unicode' : 'string'; diff --git a/ext/mysqli/tests/mysqli_stmt_store_result.phpt b/ext/mysqli/tests/mysqli_stmt_store_result.phpt index 4802a98ff6..ee0bf83a84 100644 --- a/ext/mysqli/tests/mysqli_stmt_store_result.phpt +++ b/ext/mysqli/tests/mysqli_stmt_store_result.phpt @@ -42,7 +42,7 @@ require_once('skipifconnectfailure.inc'); !mysqli_stmt_execute($stmt)) printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); - if (!$link_buf = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + if (!$link_buf = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) printf("[009] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); if (!$stmt_buf = mysqli_stmt_init($link_buf)) diff --git a/ext/mysqli/tests/mysqli_stmt_unclonable.phpt b/ext/mysqli/tests/mysqli_stmt_unclonable.phpt index 5aa93b146b..edddbea948 100644 --- a/ext/mysqli/tests/mysqli_stmt_unclonable.phpt +++ b/ext/mysqli/tests/mysqli_stmt_unclonable.phpt @@ -10,7 +10,7 @@ require_once('skipifconnectfailure.inc'); diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index b9d3ce0501..a3f0abbe22 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -96,7 +96,7 @@ MYSQLND_METHOD(mysqlnd_conn, free_options)(MYSQLND *conn TSRMLS_DC) unsigned int i; for (i = 0; i < conn->options.num_commands; i++) { /* allocated with pestrdup */ - pefree(conn->options.init_commands[i], pers); + mnd_pefree(conn->options.init_commands[i], pers); } mnd_pefree(conn->options.init_commands, pers); conn->options.init_commands = NULL; @@ -508,8 +508,8 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, host?host:"", user?user:"", db?db:"", port, mysql_flags, conn? conn->persistent:0, conn? CONN_GET_STATE(conn):-1); - DBG_INF_FMT("state=%d", CONN_GET_STATE(conn)); if (conn && CONN_GET_STATE(conn) > CONN_ALLOCED && CONN_GET_STATE(conn) ) { + DBG_INF_FMT("state=%d", CONN_GET_STATE(conn)); DBG_INF("Connecting on a connected handle."); if (CONN_GET_STATE(conn) < CONN_QUIT_SENT) { @@ -627,6 +627,10 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, mnd_efree(hashed_details); } + if (!conn->options.timeout_read) { + /* should always happen because read_timeout cannot be set via API */ + conn->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); + } if (conn->options.timeout_read) { tv.tv_sec = conn->options.timeout_read; @@ -665,7 +669,12 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no); /* we allow load data local infile by default */ - mysql_flags |= CLIENT_LOCAL_FILES; + mysql_flags |= CLIENT_LOCAL_FILES | CLIENT_PS_MULTI_RESULTS; +#ifndef MYSQLND_COMPRESSION_ENABLED + if (mysql_flags & CLIENT_COMPRESS) { + mysql_flags &= ~CLIENT_COMPRESS; + } +#endif auth_packet->user = user; auth_packet->password = passwd; @@ -748,8 +757,6 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, SET_EMPTY_ERROR(conn->error_info); conn->zval_cache = mysqlnd_palloc_get_thd_cache_reference(zval_cache); - conn->net.cmd_buffer.length = 128L*1024L; - conn->net.cmd_buffer.buffer = mnd_pemalloc(conn->net.cmd_buffer.length, conn->persistent); mysqlnd_local_infile_default(conn); { @@ -763,13 +770,12 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, (char *)&buf_size TSRMLS_CC); } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_SUCCESS); + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_CONNECT_SUCCESS, 1, STAT_OPENED_CONNECTIONS, 1); if (reconnect) { MYSQLND_INC_GLOBAL_STATISTIC(STAT_RECONNECT); } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_OPENED_CONNECTIONS); if (conn->persistent) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS); + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_PCONNECT_SUCCESS, 1, STAT_OPENED_PERSISTENT_CONNECTIONS, 1); } DBG_INF_FMT("connection_id=%llu", conn->thread_id); @@ -1939,6 +1945,9 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn, break; #endif case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { + DBG_RETURN(FAIL); + } conn->net.cmd_buffer.length = *(unsigned int*) value; if (!conn->net.cmd_buffer.buffer) { conn->net.cmd_buffer.buffer = mnd_pemalloc(conn->net.cmd_buffer.length, conn->persistent); diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 687b989303..5da8819837 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -26,7 +26,7 @@ #define MYSQLND_VERSION_ID 50005 /* This forces inlining of some accessor functions */ -#define MYSQLND_USE_OPTIMISATIONS 1 +#define MYSQLND_USE_OPTIMISATIONS 0 #define MYSQLND_STRING_TO_INT_CONVERSION /* @@ -228,8 +228,8 @@ PHPAPI unsigned int mysqlnd_get_client_version(); /*****************************************************************************************************/ -PHPAPI void mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind); -PHPAPI void mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind); +PHPAPI void mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind TSRMLS_DC); +PHPAPI void mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind TSRMLS_DC); PHPAPI const char * mysqlnd_field_type_name(enum mysqlnd_field_types field_type); @@ -250,7 +250,7 @@ PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * #define mysqlnd_select_db(conn, db, db_len) (conn)->m->select_db((conn), (db), (db_len) TSRMLS_CC) #define mysqlnd_ping(conn) (conn)->m->ping((conn) TSRMLS_CC) #define mysqlnd_kill(conn, pid) (conn)->m->kill_connection((conn), (pid) TSRMLS_CC) -#define mysqlnd_refresh(conn, options) (conn)->m->refresh_server((conn), (options) TSRMLS_CC) +#define mysqlnd_refresh(conn, options) (conn)->m->refresh_server((conn), (options) TSRMLS_CC) #define mysqlnd_shutdown(conn, level) (conn)->m->shutdown_server((conn), (level) TSRMLS_CC) #define mysqlnd_get_server_version(conn) (conn)->m->get_server_version((conn)) #define mysqlnd_set_character_set(conn, cs) (conn)->m->set_charset((conn), (cs) TSRMLS_CC) @@ -374,6 +374,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqlnd) #ifdef MYSQLND_THREADED THREAD_T thread_id; #endif + long net_read_timeout; ZEND_END_MODULE_GLOBALS(mysqlnd) ZEND_EXTERN_MODULE_GLOBALS(mysqlnd); diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index fec2261775..478088edae 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -28,6 +28,10 @@ #define MYSQLND_SQLSTATE_LENGTH 5 #define MYSQLND_SQLSTATE_NULL "00000" + +#define MYSQLND_NET_CMD_BUFFER_MIN_SIZE 4096 +#define MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR "4096" + #define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ #define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ #define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */ @@ -73,6 +77,7 @@ #define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */ #define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */ #define CLIENT_MULTI_RESULTS (1UL << 17) /* Enable/disable multi-results */ +#define CLIENT_PS_MULTI_RESULTS (1UL << 18) /* Multi-results in PS-protocol */ typedef enum mysqlnd_extension { diff --git a/ext/mysqlnd/mysqlnd_palloc.c b/ext/mysqlnd/mysqlnd_palloc.c index 1b035ed365..9d5104796c 100644 --- a/ext/mysqlnd/mysqlnd_palloc.c +++ b/ext/mysqlnd/mysqlnd_palloc.c @@ -42,7 +42,7 @@ char * mysqlnd_palloc_get_zval_name = "mysqlnd_palloc_get_zval"; /* {{{ _mysqlnd_palloc_init_cache */ PHPAPI MYSQLND_ZVAL_PCACHE* _mysqlnd_palloc_init_cache(unsigned int cache_size TSRMLS_DC) { - MYSQLND_ZVAL_PCACHE *ret = calloc(1, sizeof(MYSQLND_ZVAL_PCACHE)); + MYSQLND_ZVAL_PCACHE *ret = mnd_calloc(1, sizeof(MYSQLND_ZVAL_PCACHE)); unsigned int i; DBG_ENTER("_mysqlnd_palloc_init_cache"); @@ -58,13 +58,13 @@ PHPAPI MYSQLND_ZVAL_PCACHE* _mysqlnd_palloc_init_cache(unsigned int cache_size T /* 1. First initialize the free list part of the structure */ /* One more for empty position of last_added - always 0x0, bounds checking */ - ret->free_list.ptr_line = calloc(ret->max_items + 1, sizeof(mysqlnd_zval *)); + ret->free_list.ptr_line = mnd_calloc(ret->max_items + 1, sizeof(mysqlnd_zval *)); ret->free_list.last_added = ret->free_list.ptr_line + ret->max_items; ret->free_list.canary1 = (void*)0xBEEF; ret->free_list.canary2 = (void*)0xAFFE; /* 3. Allocate and initialize our zvals and initialize the free list */ - ret->block = calloc(ret->max_items, sizeof(mysqlnd_zval)); + ret->block = mnd_calloc(ret->max_items, sizeof(mysqlnd_zval)); ret->last_in_block = &(ret->block[ret->max_items]); for (i = 0; i < ret->max_items; i++) { /* 1. Initialize */ @@ -124,7 +124,7 @@ void _mysqlnd_palloc_free_cache(MYSQLND_ZVAL_PCACHE *cache TSRMLS_DC) /* {{{ _mysqlnd_palloc_init_thd_cache */ PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC) { - MYSQLND_THD_ZVAL_PCACHE *ret = calloc(1, sizeof(MYSQLND_THD_ZVAL_PCACHE)); + MYSQLND_THD_ZVAL_PCACHE *ret = mnd_calloc(1, sizeof(MYSQLND_THD_ZVAL_PCACHE)); DBG_ENTER("_mysqlnd_palloc_init_thd_cache"); DBG_INF_FMT("ret = %p", ret); @@ -146,7 +146,7 @@ PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCAC ret->references = 1; /* 1. Initialize the GC list */ - ret->gc_list.ptr_line = calloc(cache->max_items, sizeof(mysqlnd_zval *)); + ret->gc_list.ptr_line = mnd_calloc(cache->max_items, sizeof(mysqlnd_zval *)); /* Backward and forward looping is possible */ ret->gc_list.last_added = ret->gc_list.ptr_line; ret->gc_list.canary1 = (void*)0xCAFE; diff --git a/ext/mysqlnd/mysqlnd_portability.h b/ext/mysqlnd/mysqlnd_portability.h index ca6f5541c4..43cb505861 100644 --- a/ext/mysqlnd/mysqlnd_portability.h +++ b/ext/mysqlnd/mysqlnd_portability.h @@ -9,6 +9,9 @@ This file is public domain and comes with NO WARRANTY of any kind */ were added to improve the header file, to get it more consistent. */ +#ifndef MYSQLND_PORTABILITY_H +#define MYSQLND_PORTABILITY_H + /* Comes from global.h as OFFSET, renamed to STRUCT_OFFSET */ #define STRUCT_OFFSET(t, f) ((size_t)(char *)&((t *)0)->f) @@ -30,9 +33,9 @@ This file is public domain and comes with NO WARRANTY of any kind */ #endif /* __CYGWIN__ */ #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) -# include +# include "ext/mysqlnd/config-win.h" #else -# include "ext/mysqlnd/php_mysqlnd_config.h" +# include #endif /* _WIN32... */ #ifdef HAVE_SYS_TYPES_H @@ -497,6 +500,7 @@ typedef union { #endif /* WORDS_BIGENDIAN */ +#endif /* MYSQLND_PORTABILITY_H */ /* diff --git a/ext/mysqlnd/mysqlnd_priv.h b/ext/mysqlnd/mysqlnd_priv.h index ae3752e6d3..856b7076c6 100644 --- a/ext/mysqlnd/mysqlnd_priv.h +++ b/ext/mysqlnd/mysqlnd_priv.h @@ -104,10 +104,12 @@ if ((buf)) { \ pefree((buf), (persistent)); \ } \ - (buf) = (message); \ + if ((message)) { \ + (buf) = pestrndup((message), (len), (persistent)); \ + } else { \ + buf = NULL; \ + } \ (buf_len) = (len); \ - /* Transfer ownership*/ \ - (message) = NULL; \ } #define SET_EMPTY_MESSAGE(buf, buf_len, persistent) \ diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index ba4ea3120f..a980e960af 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -1329,7 +1329,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, SET_STMT_ERROR(stmt, CR_NO_PREPARE_STMT, UNKNOWN_SQLSTATE, mysqlnd_stmt_not_prepared); DBG_ERR("not prepared"); if (param_bind && stmt->param_bind_dtor) { - stmt->param_bind_dtor(param_bind); + stmt->param_bind_dtor(param_bind TSRMLS_CC); } DBG_RETURN(FAIL); } @@ -1362,7 +1362,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, } } if (stmt->param_bind != param_bind && stmt->param_bind_dtor) { - stmt->param_bind_dtor(stmt->param_bind); + stmt->param_bind_dtor(stmt->param_bind TSRMLS_CC); } } @@ -1411,7 +1411,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_parameter)(MYSQLND_STMT * const stmt, unsi if (stmt->param_count) { if (!stmt->param_bind) { - stmt->param_bind = ecalloc(stmt->param_count, sizeof(MYSQLND_PARAM_BIND)); + stmt->param_bind = mnd_ecalloc(stmt->param_count, sizeof(MYSQLND_PARAM_BIND)); } /* Prevent from freeing */ @@ -1465,7 +1465,7 @@ MYSQLND_METHOD(mysqlnd_stmt, refresh_bind_param)(MYSQLND_STMT * const stmt TSRML /* {{{ mysqlnd_stmt::set_bind_param_dtor */ static void MYSQLND_METHOD(mysqlnd_stmt, set_param_bind_dtor)(MYSQLND_STMT * const stmt, - void (*param_bind_dtor)(MYSQLND_PARAM_BIND *dtor) TSRMLS_DC) + void (*param_bind_dtor)(MYSQLND_PARAM_BIND * dtor TSRMLS_DC) TSRMLS_DC) { DBG_ENTER("mysqlnd_stmt::set_bind_param_dtor"); DBG_INF_FMT("stmt=%p", param_bind_dtor); @@ -1487,7 +1487,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const stmt, if (stmt->state < MYSQLND_STMT_PREPARED) { SET_STMT_ERROR(stmt, CR_NO_PREPARE_STMT, UNKNOWN_SQLSTATE, mysqlnd_stmt_not_prepared); if (result_bind && stmt->result_bind_dtor) { - stmt->result_bind_dtor(result_bind); + stmt->result_bind_dtor(result_bind TSRMLS_CC); } DBG_ERR("not prepared"); DBG_RETURN(FAIL); @@ -1519,7 +1519,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const stmt, stmt->result_bind[i].bound = TRUE; } } else if (result_bind && stmt->result_bind_dtor) { - stmt->result_bind_dtor(result_bind); + stmt->result_bind_dtor(result_bind TSRMLS_CC); } DBG_INF("PASS"); DBG_RETURN(PASS); @@ -1553,9 +1553,9 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_result)(MYSQLND_STMT * const stmt, unsigne mysqlnd_stmt_separate_one_result_bind(stmt, param_no TSRMLS_CC); /* Guaranteed is that stmt->result_bind is NULL */ if (!stmt->result_bind) { - stmt->result_bind = ecalloc(stmt->field_count, sizeof(MYSQLND_RESULT_BIND)); + stmt->result_bind = mnd_ecalloc(stmt->field_count, sizeof(MYSQLND_RESULT_BIND)); } else { - stmt->result_bind = erealloc(stmt->result_bind, stmt->field_count * sizeof(MYSQLND_RESULT_BIND)); + stmt->result_bind = mnd_erealloc(stmt->result_bind, stmt->field_count * sizeof(MYSQLND_RESULT_BIND)); } ALLOC_INIT_ZVAL(stmt->result_bind[param_no].zv); /* @@ -1574,7 +1574,7 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_result)(MYSQLND_STMT * const stmt, unsigne /* {{{ mysqlnd_stmt::set_bind_result_dtor */ static void MYSQLND_METHOD(mysqlnd_stmt, set_result_bind_dtor)(MYSQLND_STMT * const stmt, - void (*result_bind_dtor)(MYSQLND_RESULT_BIND *dtor) TSRMLS_DC) + void (*result_bind_dtor)(MYSQLND_RESULT_BIND * dtor TSRMLS_DC) TSRMLS_DC) { DBG_ENTER("mysqlnd_stmt::set_bind_param_dtor"); DBG_INF_FMT("stmt=%p", result_bind_dtor); @@ -1898,7 +1898,7 @@ void mysqlnd_stmt_separate_result_bind(MYSQLND_STMT * const stmt TSRMLS_DC) } } if (stmt->result_bind_dtor) { - stmt->result_bind_dtor(stmt->result_bind); + stmt->result_bind_dtor(stmt->result_bind TSRMLS_CC); } stmt->result_bind = NULL; @@ -1979,7 +1979,7 @@ void mysqlnd_internal_free_stmt_content(MYSQLND_STMT * const stmt TSRMLS_DC) } } if (stmt->param_bind_dtor) { - stmt->param_bind_dtor(stmt->param_bind); + stmt->param_bind_dtor(stmt->param_bind TSRMLS_CC); } stmt->param_bind = NULL; } @@ -2177,18 +2177,18 @@ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC) /* {{{ mysqlnd_efree_param_bind_dtor */ PHPAPI void -mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind) +mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind TSRMLS_DC) { - efree(param_bind); + mnd_efree(param_bind); } /* }}} */ /* {{{ mysqlnd_efree_result_bind_dtor */ PHPAPI void -mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind) +mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind TSRMLS_DC) { - efree(result_bind); + mnd_efree(result_bind); } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c index 6fd2e053b2..ec1e05e9a7 100644 --- a/ext/mysqlnd/mysqlnd_ps_codec.c +++ b/ext/mysqlnd/mysqlnd_ps_codec.c @@ -580,10 +580,10 @@ void _mysqlnd_init_ps_fetch_subsystem() /* {{{ mysqlnd_stmt_copy_it */ static void -mysqlnd_stmt_copy_it(zval *** copies, zval *original, unsigned int param_count, unsigned int current) +mysqlnd_stmt_copy_it(zval *** copies, zval *original, unsigned int param_count, unsigned int current TSRMLS_DC) { if (!*copies) { - *copies = ecalloc(param_count, sizeof(zval *)); + *copies = mnd_ecalloc(param_count, sizeof(zval *)); } MAKE_STD_ZVAL((*copies)[current]); *(*copies)[current] = *original; @@ -643,7 +643,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uch for (j = i + 1; j < stmt->param_count; j++) { if (stmt->param_bind[j].zv == the_var) { /* Double binding of the same zval, make a copy */ - mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i); + mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC); break; } } @@ -653,7 +653,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uch data_size += 8; if (Z_TYPE_P(the_var) != IS_DOUBLE) { if (!copies || !copies[i]) { - mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i); + mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC); } } break; @@ -668,7 +668,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uch #endif if (Z_TYPE_P(the_var) != IS_LONG) { if (!copies || !copies[i]) { - mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i); + mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC); } } break; @@ -691,7 +691,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uch #endif { if (!copies || !copies[i]) { - mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i); + mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC); } the_var = copies[i]; #if PHP_MAJOR_VERSION >= 6 @@ -777,7 +777,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uch zval_ptr_dtor(&copies[i]); } } - efree(copies); + mnd_efree(copies); } } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 56969944aa..c2798a0926 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -171,7 +171,7 @@ void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC) STAT_COPY_ON_WRITE_PERFORMED, 0); /* Free last row's zvals */ - efree(unbuf->last_row_data); + mnd_efree(unbuf->last_row_data); unbuf->last_row_data = NULL; } if (unbuf->last_row_buffer) { @@ -223,11 +223,11 @@ void mysqlnd_free_buffered_data(MYSQLND_RES *result TSRMLS_DC) } DBG_INF("Freeing data & row_buffer"); if (set->data) { - pefree(set->data, set->persistent); + mnd_pefree(set->data, set->persistent); set->data = NULL; } if (set->row_buffers) { - pefree(set->row_buffers, set->persistent); + mnd_pefree(set->row_buffers, set->persistent); set->row_buffers = NULL; } set->data_cursor = NULL; @@ -237,7 +237,7 @@ void mysqlnd_free_buffered_data(MYSQLND_RES *result TSRMLS_DC) } DBG_INF("Freeing set"); - pefree(set, set->persistent); + mnd_pefree(set, set->persistent); DBG_INF_FMT("after: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); DBG_VOID_RETURN; @@ -295,13 +295,13 @@ void mysqlnd_free_background_buffered_data(MYSQLND_RES *result TSRMLS_DC) #if MYSQLND_DEBUG_MEMORY DBG_INF("Freeing current_row & current_buffer"); #endif - pefree(current_row, set->persistent); + mnd_pefree(current_row, set->persistent); } current_buffer->free_chunk(current_buffer, TRUE TSRMLS_CC); } DBG_INF("Freeing data & row_buffer"); - pefree(set->data, set->persistent); - pefree(set->row_buffers, set->persistent); + mnd_pefree(set->data, set->persistent); + mnd_pefree(set->row_buffers, set->persistent); set->data = NULL; set->row_buffers = NULL; set->data_cursor = NULL; @@ -315,7 +315,7 @@ void mysqlnd_free_background_buffered_data(MYSQLND_RES *result TSRMLS_DC) } DBG_INF("Freeing set"); - pefree(set, set->persistent); + mnd_pefree(set, set->persistent); DBG_INF_FMT("after: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); DBG_VOID_RETURN; @@ -333,7 +333,7 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES *result TSRMLS_DC) if (result->unbuf) { mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); - efree(result->unbuf); + mnd_efree(result->unbuf); result->unbuf = NULL; } else if (result->stored_data) { mysqlnd_free_buffered_data(result TSRMLS_CC); @@ -347,7 +347,7 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES *result TSRMLS_DC) #endif if (result->lengths) { - efree(result->lengths); + mnd_efree(result->lengths); result->lengths = NULL; } @@ -398,7 +398,7 @@ void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC) result->conn = NULL; } - efree(result); + mnd_efree(result); DBG_VOID_RETURN; } @@ -575,7 +575,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC if (FAIL == (ret = result->m.read_result_metadata(result, conn TSRMLS_CC))) { /* For PS, we leave them in Prepared state */ if (!stmt) { - efree(conn->current_result); + mnd_efree(conn->current_result); conn->current_result = NULL; } DBG_ERR("Error ocurred while reading metadata"); @@ -587,7 +587,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC if (FAIL == (ret = PACKET_READ_ALLOCA(fields_eof, conn))) { DBG_ERR("Error ocurred while reading the EOF packet"); result->m.free_result_contents(result TSRMLS_CC); - efree(result); + mnd_efree(result); if (!stmt) { conn->current_result = NULL; } else { @@ -901,13 +901,8 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag lengths[i] = len; } - /* Forbid ZE to free it, we will clean it */ - Z_ADDREF_P(data); - - if ((flags & MYSQLND_FETCH_BOTH) == MYSQLND_FETCH_BOTH) { - Z_ADDREF_P(data); - } if (flags & MYSQLND_FETCH_NUM) { + Z_ADDREF_P(data); zend_hash_next_index_insert(row_ht, &data, sizeof(zval *), NULL); } if (flags & MYSQLND_FETCH_ASSOC) { @@ -918,6 +913,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag the index is a numeric and convert it to it. This however means constant hashing of the column name, which is not needed as it can be precomputed. */ + Z_ADDREF_P(data); if (zend_hash_key->is_numeric == FALSE) { #if PHP_MAJOR_VERSION >= 6 zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE, @@ -1128,16 +1124,8 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, for (i = 0; i < result->field_count; i++, field++, zend_hash_key++) { zval *data = current_row[i]; - /* - Let us later know what to do with this zval. If ref_count > 1, we will just - decrease it, otherwise free it. zval_ptr_dtor() make this very easy job. - */ - Z_ADDREF_P(data); - - if ((flags & MYSQLND_FETCH_BOTH) == MYSQLND_FETCH_BOTH) { - Z_ADDREF_P(data); - } if (flags & MYSQLND_FETCH_NUM) { + Z_ADDREF_P(data); zend_hash_next_index_insert(Z_ARRVAL_P(row), &data, sizeof(zval *), NULL); } if (flags & MYSQLND_FETCH_ASSOC) { @@ -1148,6 +1136,7 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, the index is a numeric and convert it to it. This however means constant hashing of the column name, which is not needed as it can be precomputed. */ + Z_ADDREF_P(data); if (zend_hash_key->is_numeric == FALSE) { #if PHP_MAJOR_VERSION >= 6 zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE, @@ -1893,9 +1882,9 @@ MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES *result TSRMLS_DC) if (result->m.fetch_row) { if (result->m.fetch_row == result->m.fetch_row_normal_buffered) { - return mysqlnd_fetch_row_buffered_c(result TSRMLS_CC); + DBG_RETURN(mysqlnd_fetch_row_buffered_c(result TSRMLS_CC)); } else if (result->m.fetch_row == result->m.fetch_row_normal_unbuffered) { - return mysqlnd_fetch_row_unbuffered_c(result TSRMLS_CC); + DBG_RETURN(mysqlnd_fetch_row_unbuffered_c(result TSRMLS_CC)); } else { *((int*)NULL) = 1; } diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index 7a75003927..95ef93a65b 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -165,8 +165,15 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met PACKET_FREE_ALLOCA(field_packet); DBG_RETURN(FAIL); } + if (field_packet.error_info.error_no) { + conn->error_info = field_packet.error_info; + /* Return back from CONN_QUERY_SENT */ + PACKET_FREE_ALLOCA(field_packet); + DBG_RETURN(FAIL); + } + if (field_packet.stupid_list_fields_eof == TRUE) { - meta->field_count = i + 1; + meta->field_count = i; break; } diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index ddb7b40da6..9612fa3fce 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -360,10 +360,10 @@ struct st_mysqlnd_stmt_methods enum_func_status (*bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC); enum_func_status (*bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar type TSRMLS_DC); enum_func_status (*refresh_bind_param)(MYSQLND_STMT * const stmt TSRMLS_DC); - void (*set_param_bind_dtor)(MYSQLND_STMT * const stmt, void (*param_bind_dtor)(MYSQLND_PARAM_BIND *) TSRMLS_DC); + void (*set_param_bind_dtor)(MYSQLND_STMT * const stmt, void (*param_bind_dtor)(MYSQLND_PARAM_BIND * TSRMLS_DC) TSRMLS_DC); enum_func_status (*bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC); enum_func_status (*bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC); - void (*set_result_bind_dtor)(MYSQLND_STMT * const stmt, void (*result_bind_dtor)(MYSQLND_RESULT_BIND *) TSRMLS_DC); + void (*set_result_bind_dtor)(MYSQLND_STMT * const stmt, void (*result_bind_dtor)(MYSQLND_RESULT_BIND * TSRMLS_DC) TSRMLS_DC); enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC); MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt); @@ -625,8 +625,8 @@ struct st_mysqlnd_stmt MYSQLND_CMD_BUFFER execute_cmd_buffer; unsigned int execute_count;/* count how many times the stmt was executed */ - void (*param_bind_dtor)(MYSQLND_PARAM_BIND *); - void (*result_bind_dtor)(MYSQLND_RESULT_BIND *); + void (*param_bind_dtor)(MYSQLND_PARAM_BIND * TSRMLS_DC); + void (*result_bind_dtor)(MYSQLND_RESULT_BIND * TSRMLS_DC); struct st_mysqlnd_stmt_methods *m; }; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 989cc87ed0..cc0697cd0b 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -813,7 +813,7 @@ php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC) /* There is a message */ if (packet->header.size > p - buf && (i = php_mysqlnd_net_field_length(&p))) { - packet->message = pestrndup((char *)p, MIN(i, sizeof(buf) - (p - buf)), conn->persistent); + packet->message = estrndup((char *)p, MIN(i, sizeof(buf) - (p - buf))); packet->message_len = i; } else { packet->message = NULL; @@ -1032,7 +1032,7 @@ php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC) Thus, the name is size - 1. And we add 1 for a trailing \0. */ len = packet->header.size - 1; - packet->info_or_local_file = mnd_pemalloc(len + 1, conn->persistent); + packet->info_or_local_file = mnd_emalloc(len + 1); memcpy(packet->info_or_local_file, p, len); packet->info_or_local_file[len] = '\0'; packet->info_or_local_file_len = len; @@ -1047,7 +1047,7 @@ php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC) p+=2; /* Check for additional textual data */ if (packet->header.size > (p - buf) && (len = php_mysqlnd_net_field_length(&p))) { - packet->info_or_local_file = mnd_pemalloc(len + 1, conn->persistent); + packet->info_or_local_file = mnd_emalloc(len + 1); memcpy(packet->info_or_local_file, p, len); packet->info_or_local_file[len] = '\0'; packet->info_or_local_file_len = len; @@ -1126,7 +1126,16 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) if (packet->skip_parsing) { DBG_RETURN(PASS); } - if (*p == 0xFE && packet->header.size < 8) { + if (*p == 0xFF) { + /* Error */ + p++; + php_mysqlnd_read_error_from_line(p, packet->header.size - 1, + packet->error_info.error, sizeof(packet->error_info.error), + &packet->error_info.error_no, packet->error_info.sqlstate + TSRMLS_CC); + DBG_ERR_FMT("Server error : (%d) %s", packet->error_info.error_no, packet->error_info.error); + DBG_RETURN(PASS); + } else if (*p == 0xFE && packet->header.size < 8) { /* Premature EOF. That should be COM_FIELD_LIST */ DBG_INF("Premature EOF. That should be COM_FIELD_LIST"); packet->stupid_list_fields_eof = TRUE; @@ -1364,8 +1373,10 @@ void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffe zend_uchar *null_ptr, bit; zval **current_field, **end_field, **start_field; zend_bool as_unicode = conn->options.numeric_and_datetime_as_unicode; +#ifdef USE_ZVAL_CACHE zend_bool allocated; void *obj; +#endif DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol"); @@ -1858,7 +1869,7 @@ php_mysqlnd_stats_read(void *_packet, MYSQLND *conn TSRMLS_DC) PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "statistics", PROT_STATS_PACKET); - packet->message = mnd_pemalloc(packet->header.size + 1, conn->persistent); + packet->message = mnd_emalloc(packet->header.size + 1); memcpy(packet->message, buf, packet->header.size); packet->message[packet->header.size] = '\0'; packet->message_len = packet->header.size; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h index cd9d1a465f..77ee795c35 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.h +++ b/ext/mysqlnd/mysqlnd_wireprotocol.h @@ -242,6 +242,8 @@ typedef struct st_php_mysql_packet_res_field { /* For table definitions, empty for result sets */ zend_bool skip_parsing; zend_bool stupid_list_fields_eof; + + mysqlnd_error_info error_info; } php_mysql_packet_res_field; diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index 7ebb748024..74b3e9beaf 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -26,7 +26,6 @@ #include "mysqlnd_debug.h" #include "ext/standard/info.h" - /* {{{ mysqlnd_functions[] * * Every user visible function must have an entry in mysqlnd_functions[]. @@ -107,6 +106,8 @@ PHP_MINFO_FUNCTION(mysqlnd) php_info_print_table_row(2, "Command buffer size", buf); snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size)); php_info_print_table_row(2, "Read buffer size", buf); + snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_timeout)); + php_info_print_table_row(2, "Read timeout", buf); php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No"); php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No"); php_info_print_table_end(); @@ -134,21 +135,34 @@ static PHP_GINIT_FUNCTION(mysqlnd) mysqlnd_globals->collect_memory_statistics = FALSE; mysqlnd_globals->debug = NULL; /* The actual string */ mysqlnd_globals->dbg = NULL; /* The DBG object*/ - mysqlnd_globals->net_cmd_buffer_size = 2048; + mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE; mysqlnd_globals->net_read_buffer_size = 32768; + mysqlnd_globals->net_read_timeout = 31536000; mysqlnd_globals->log_mask = 0; } /* }}} */ +static PHP_INI_MH(OnUpdateNetCmdBufferSize) +{ + long long_value = atol(new_value); + if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { + return FAILURE; + } + MYSQLND_G(net_cmd_buffer_size) = long_value; + + return SUCCESS; +} + /* {{{ PHP_INI_BEGIN */ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics", "1", PHP_INI_ALL, OnUpdateBool, collect_statistics, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics", "0", PHP_INI_SYSTEM, OnUpdateBool, collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals) - STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size", "2048", PHP_INI_ALL, OnUpdateLong, net_cmd_buffer_size, zend_mysqlnd_globals, mysqlnd_globals) + STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size", MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR, PHP_INI_ALL, OnUpdateNetCmdBufferSize, net_cmd_buffer_size, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals) + STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "31536000", PHP_INI_SYSTEM, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals) PHP_INI_END() /* }}} */ diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 2a64c0e475..d49b046acf 100755 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -620,8 +620,9 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ if (driver_options) { long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC); long local_infile = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0 TSRMLS_CC); + char *init_cmd = NULL; #ifndef PDO_USE_MYSQLND - char *init_cmd = NULL, *default_file = NULL, *default_group = NULL; + char *default_file = NULL, *default_group = NULL; long compress = 0; #endif H->buffered = pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1 TSRMLS_CC); @@ -670,7 +671,6 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ mysql_options(H->server, MYSQL_OPT_RECONNECT, (const char*)&reconnect); } #endif -#ifndef PDO_USE_MYSQLND init_cmd = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_INIT_COMMAND, NULL TSRMLS_CC); if (init_cmd) { if (mysql_options(H->server, MYSQL_INIT_COMMAND, (const char *)init_cmd)) { @@ -680,7 +680,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ } efree(init_cmd); } - +#ifndef PDO_USE_MYSQLND default_file = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_READ_DEFAULT_FILE, NULL TSRMLS_CC); if (default_file) { if (mysql_options(H->server, MYSQL_READ_DEFAULT_FILE, (const char *)default_file)) { diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c index 044102356b..7ab568f8ec 100755 --- a/ext/pdo_mysql/pdo_mysql.c +++ b/ext/pdo_mysql/pdo_mysql.c @@ -75,9 +75,9 @@ static PHP_MINIT_FUNCTION(pdo_mysql) REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (long)PDO_MYSQL_ATTR_INIT_COMMAND); #ifndef PDO_USE_MYSQLND REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (long)PDO_MYSQL_ATTR_INIT_COMMAND); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_FILE", (long)PDO_MYSQL_ATTR_READ_DEFAULT_FILE); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_GROUP", (long)PDO_MYSQL_ATTR_READ_DEFAULT_GROUP); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_COMPRESS", (long)PDO_MYSQL_ATTR_COMPRESS); diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index 16e44dc433..00a56ffe75 100755 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -153,8 +153,8 @@ extern struct pdo_stmt_methods mysql_stmt_methods; enum { PDO_MYSQL_ATTR_USE_BUFFERED_QUERY = PDO_ATTR_DRIVER_SPECIFIC, PDO_MYSQL_ATTR_LOCAL_INFILE, -#ifndef PDO_USE_MYSQLND PDO_MYSQL_ATTR_INIT_COMMAND, +#ifndef PDO_USE_MYSQLND PDO_MYSQL_ATTR_READ_DEFAULT_FILE, PDO_MYSQL_ATTR_READ_DEFAULT_GROUP, PDO_MYSQL_ATTR_MAX_BUFFER_SIZE, diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt index fb955ac2aa..8d086b7cc1 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt @@ -6,8 +6,6 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); MySQLPDOTest::skip(); $db = MySQLPDOTest::factory(); -if (MySQLPDOTest::isPDOMySQLnd()) - die("skip PDO::MYSQL_ATTR_MAX_INIT_COMMAND not supported with mysqlnd"); ?> --INI-- error_reporting=E_ALL @@ -27,7 +25,8 @@ error_reporting=E_ALL var_dump($create); $db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => $create)); - var_dump($db->errorInfo()); + $info = $db->errorInfo(); + var_dump($info[0]); $db->exec(sprintf('INSERT INTO %s(id) VALUES (1)', $table)); $stmt = $db->query(sprintf('SELECT id FROM %s', $table)); @@ -35,22 +34,14 @@ error_reporting=E_ALL $db->exec(sprintf('DROP TABLE IF EXISTS %s', $table)); print "done!\n"; -?> --EXPECTF-- -string(58) "CREATE TABLE test_%s(id INT)" -array(3) { - [0]=> - string(5) "00000" - [1]=> - NULL - [2]=> - NULL -} +%unicode|string%(58) "CREATE TABLE test_%s(id INT)" +%unicode|string%(5) "00000" array(1) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } } done!