--- php-5.3.1/ext/mysqli/mysqli_api.c	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqli/mysqli_api.c	2009-12-02 18:53:05.000000000 +0100
@@ -55,6 +55,27 @@
 }
 /* }}} */
 
+/* {{{ proto mixed mysqli_matched_rows(object link)
+   Get number of matched rows in previous MySQL operation */
+PHP_FUNCTION(mysqli_matched_rows)
+{
+	MY_MYSQL                *mysql;
+	zval                    *mysql_link;
+	my_ulonglong    rc;
+
+	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+		return;
+	}
+
+	MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
+
+	rc = mysql_matched_rows(mysql->mysql);
+	if (rc == (my_ulonglong) -1) {
+		RETURN_LONG(-1);
+	}
+	MYSQLI_RETURN_LONG_LONG(rc);
+}
+/* }}} */
 
 /* {{{ proto bool mysqli_autocommit(object link, bool mode)
    Turn auto commit on or of */
--- php-5.3.1/ext/mysqli/mysqli_fe.c	2009-01-22 22:01:58.000000000 +0100
+++ active-3.1/ext/mysqli/mysqli_fe.c	2009-12-02 18:55:49.000000000 +0100
@@ -56,6 +56,7 @@
  */
 const zend_function_entry mysqli_functions[] = {
 	PHP_FE(mysqli_affected_rows,						NULL)
+	PHP_FE(mysqli_matched_rows,							NULL)
 	PHP_FE(mysqli_autocommit,							NULL)
 	PHP_FE(mysqli_change_user,							NULL)
 	PHP_FE(mysqli_character_set_name,					NULL)
@@ -86,6 +87,7 @@
 	PHP_FE(mysqli_fetch_assoc,							NULL) 
 	PHP_FE(mysqli_fetch_object,							NULL)
 	PHP_FE(mysqli_fetch_row,							NULL)
+	PHP_FE(mysqli_return,								NULL)
 	PHP_FE(mysqli_field_count,							NULL)
 	PHP_FE(mysqli_field_seek,							NULL)
 	PHP_FE(mysqli_field_tell,							NULL)
@@ -275,7 +277,8 @@
 	PHP_FALIAS(fetch_all,mysqli_fetch_all,NULL)
 #endif
 	PHP_FALIAS(fetch_array,mysqli_fetch_array,NULL)
-	PHP_FALIAS(fetch_assoc,mysqli_fetch_assoc,NULL) 
+	PHP_FALIAS(fetch_assoc,mysqli_fetch_assoc,NULL)
+	PHP_FALIAS(return,mysqli_return,NULL)
 	PHP_FALIAS(fetch_object,mysqli_fetch_object,NULL) 
 	PHP_FALIAS(fetch_row,mysqli_fetch_row,NULL)
 	PHP_FALIAS(field_seek,mysqli_field_seek,NULL)
--- php-5.3.1/ext/mysqli/mysqli_nonapi.c	2009-11-12 18:48:36.000000000 +0100
+++ active-3.1/ext/mysqli/mysqli_nonapi.c	2009-12-02 18:59:30.000000000 +0100
@@ -395,6 +395,36 @@
 }
 /* }}} */
 
+/* {{{ proto mixed mysqli_return(object result) */
+PHP_FUNCTION(mysqli_return)
+{
+#if !defined(MYSQLI_USE_MYSQLND)
+	return;
+#else
+	MYSQL_RES               *result;
+	zval                    *mysql_result;
+
+	long offset = 0;
+	zend_bool clean = 1;
+
+	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|lb", &mysql_result, mysqli_result_class_entry, &offset, &clean) == FAILURE) {
+		return;
+	}
+	MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
+
+	if (!result->m.fetch_field_data) {
+		RETVAL_NULL();
+	}
+
+	result->m.fetch_field_data(result, offset, return_value);
+
+	if (clean) {
+		mysql_free_result(result);
+		MYSQLI_CLEAR_RESOURCE(&mysql_result);
+	}
+#endif
+}
+/* }}} */
 
 /* {{{ proto mixed mysqli_fetch_all (object result [,int resulttype]) 
    Fetches all result rows as an associative array, a numeric array, or both */
@@ -403,7 +433,7 @@
 {
 	MYSQL_RES		*result;
 	zval			*mysql_result;
-	long			mode = MYSQLND_FETCH_NUM;
+	long			mode = MYSQLND_FETCH_ASSOC;
 
 	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
 		return;
--- php-5.3.1/ext/mysqli/mysqli_prop.c	2009-05-27 17:05:28.000000000 +0200
+++ active-3.1/ext/mysqli/mysqli_prop.c	2009-12-02 19:05:07.000000000 +0100
@@ -188,6 +188,42 @@
 }
 /* }}} */
 
+/* {{{ property link_matched_rows_read */
+static int link_matched_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
+{
+	MY_MYSQL *mysql;
+	my_ulonglong rc;
+
+	MAKE_STD_ZVAL(*retval);
+
+	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
+
+	mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
+
+	if (!mysql) {
+		ZVAL_NULL(*retval);
+	} else {
+		CHECK_STATUS(MYSQLI_STATUS_VALID);
+
+		rc = mysql_matched_rows(mysql->mysql);
+
+		if (rc == (my_ulonglong) -1) {
+			ZVAL_LONG(*retval, -1);
+			return SUCCESS;
+		}
+
+		if (rc < LONG_MAX) {
+			ZVAL_LONG(*retval, rc);
+		} else {
+			char *ret;
+			int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
+			ZVAL_STRINGL(*retval, ret, l, 0);
+		}
+	}
+	return SUCCESS;
+}
+/* }}} */
+
 /* link properties */
 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
@@ -316,6 +352,7 @@
 /* }}} */
 const mysqli_property_entry mysqli_link_property_entries[] = {
 	{"affected_rows", 	sizeof("affected_rows") - 1,	link_affected_rows_read, NULL},
+	{"matched_rows",    sizeof("matched_rows") - 1,     link_matched_rows_read, NULL},
 	{"client_info", 	sizeof("client_info") - 1,		link_client_info_read, NULL},
 	{"client_version",	sizeof("client_version") - 1,	link_client_version_read, NULL},
 	{"connect_errno",	sizeof("connect_errno") - 1,	link_connect_errno_read, NULL},
@@ -338,6 +375,7 @@
 /* should not be const, as it is patched during runtime */
 zend_property_info mysqli_link_property_info_entries[] = {
 	{ZEND_ACC_PUBLIC, "affected_rows",	sizeof("affected_rows") - 1,	0, NULL, 0, NULL},
+	{ZEND_ACC_PUBLIC, "matched_rows",   sizeof("matched_rows") - 1,     0, NULL, 0, NULL},
 	{ZEND_ACC_PUBLIC, "client_info",	sizeof("client_info") - 1,		0, NULL, 0, NULL},
 	{ZEND_ACC_PUBLIC, "client_version",	sizeof("client_version") - 1,	0, NULL, 0, NULL},
 	{ZEND_ACC_PUBLIC, "connect_errno",	sizeof("connect_errno") - 1,	0, NULL, 0, NULL},
--- php-5.3.1/ext/mysqli/php_mysqli_structs.h	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqli/php_mysqli_structs.h	2009-12-02 19:05:58.000000000 +0100
@@ -393,6 +393,7 @@
 
 PHP_FUNCTION(mysqli);
 PHP_FUNCTION(mysqli_affected_rows);
+PHP_FUNCTION(mysqli_matched_rows);
 PHP_FUNCTION(mysqli_autocommit);
 PHP_FUNCTION(mysqli_change_user);
 PHP_FUNCTION(mysqli_character_set_name);
@@ -407,6 +408,7 @@
 PHP_FUNCTION(mysqli_dump_debug_info);
 PHP_FUNCTION(mysqli_errno);
 PHP_FUNCTION(mysqli_error);
+PHP_FUNCTION(mysqli_return);
 PHP_FUNCTION(mysqli_fetch_all);
 PHP_FUNCTION(mysqli_fetch_array);
 PHP_FUNCTION(mysqli_fetch_assoc);
--- php-5.3.1/ext/mysqlnd/mysqlnd.c	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqlnd/mysqlnd.c	2009-12-02 19:13:05.000000000 +0100
@@ -576,6 +576,8 @@
 	CONN_SET_STATE(conn, CONN_ALLOCED);
 	conn->net.packet_no = 0;
 
+	conn->options.int_and_float_native = 1;
+
 	if (conn->options.timeout_connect) {
 		tv.tv_sec = conn->options.timeout_connect;
 		tv.tv_usec = 0;
@@ -1620,6 +1622,22 @@
 /* }}} */
 
 
+/* {{{ mysqlnd_conn::matched_rows */
+static uint64_t
+MYSQLND_METHOD(mysqlnd_conn, matched_rows)(const MYSQLND * const conn)
+{
+	char *p = conn->last_message;
+
+	if (p && strlen(p) >= 40) {
+		/* Read upsert result */
+		return (uint64_t) strtol(p + sizeof("Rows matched:"), NULL, 10);
+	}
+	/* fallback for selects */
+	return conn->upsert_status.affected_rows;
+}
+/* }}} */
+
+
 /* {{{ mysqlnd_conn::warning_count */
 static unsigned int
 MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn)
@@ -2195,6 +2213,7 @@
 
 	MYSQLND_METHOD(mysqlnd_conn, insert_id),
 	MYSQLND_METHOD(mysqlnd_conn, affected_rows),
+	MYSQLND_METHOD(mysqlnd_conn, matched_rows),
 	MYSQLND_METHOD(mysqlnd_conn, warning_count),
 	MYSQLND_METHOD(mysqlnd_conn, field_count),
 
--- php-5.3.1/ext/mysqlnd/mysqlnd.h	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqlnd/mysqlnd.h	2009-12-02 19:15:24.000000000 +0100
@@ -141,6 +141,7 @@
 #define mysqlnd_field_count(conn)		(conn)->field_count
 #define mysqlnd_insert_id(conn)			(conn)->upsert_status.last_insert_id
 #define mysqlnd_affected_rows(conn)		(conn)->upsert_status.affected_rows
+#define mysqlnd_matched_rows(conn)		(conn)->m->get_matched_rows((conn))
 #define mysqlnd_warning_count(conn)		(conn)->upsert_status.warning_count
 #define mysqlnd_info(conn)  			(conn)->last_message
 #define mysqlnd_get_server_info(conn)	(conn)->server_version
@@ -192,6 +193,7 @@
 #define mysqlnd_field_count(conn)		(conn)->m->get_field_count((conn))
 #define mysqlnd_insert_id(conn)			(conn)->m->get_last_insert_id((conn))
 #define mysqlnd_affected_rows(conn)		(conn)->m->get_affected_rows((conn))
+#define mysqlnd_matched_rows(conn)		(conn)->m->get_matched_rows((conn))
 #define mysqlnd_warning_count(conn)		(conn)->m->get_warning_count((conn))
 #define mysqlnd_info(conn)				(conn)->m->get_last_message((conn))
 #define mysqlnd_get_server_info(conn)	(conn)->m->get_server_information((conn))
--- php-5.3.1/ext/mysqlnd/mysqlnd_libmysql_compat.h	2009-05-29 15:09:47.000000000 +0200
+++ active-3.1/ext/mysqlnd/mysqlnd_libmysql_compat.h	2009-12-02 19:16:18.000000000 +0100
@@ -40,6 +40,7 @@
 
 /* functions */
 #define mysql_affected_rows(r)			mysqlnd_affected_rows((r))
+#define mysql_matched_rows(r)			mysqlnd_matched_rows((r))
 #define mysql_autocommit(r,m)			mysqlnd_autocommit((r),(m))
 #define mysql_change_user(r,a,b,c)		mysqlnd_change_user((r), (a), (b), (c))
 #define mysql_character_set_name(c)		mysqlnd_character_set_name((c))
--- php-5.3.1/ext/mysqlnd/mysqlnd_structs.h	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqlnd/mysqlnd_structs.h	2009-12-02 19:17:39.000000000 +0100
@@ -274,6 +274,7 @@
 
 	uint64_t			(*get_last_insert_id)(const MYSQLND * const conn);
 	uint64_t			(*get_affected_rows)(const MYSQLND * const conn);
+	uint64_t			(*get_matched_rows)(const MYSQLND * const conn);
 	unsigned int		(*get_warning_count)(const MYSQLND * const conn);
 
 	unsigned int		(*get_field_count)(const MYSQLND * const conn);
--- php-5.3.1/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-10-14 15:51:25.000000000 +0200
+++ active-3.1/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-12-02 19:21:31.000000000 +0100
@@ -1566,8 +1566,7 @@
 			}
 
 #ifdef MYSQLND_STRING_TO_INT_CONVERSION
-			if (as_int_or_float && perm_bind.php_type == IS_LONG &&
-				perm_bind.pack_len <= SIZEOF_LONG)
+			if (as_int_or_float && perm_bind.php_type == IS_LONG)
 			{
 				zend_uchar save = *(p + len);
 				/* We have to make it ASCIIZ temporarily */
