summaryrefslogtreecommitdiff
path: root/ext/mysqlnd
diff options
context:
space:
mode:
authorUlf Wendel <uw@php.net>2009-09-09 17:03:03 +0000
committerUlf Wendel <uw@php.net>2009-09-09 17:03:03 +0000
commit5f260e14b2b809ab2969db7ee1affff7ae7d5405 (patch)
tree55880da37f0cd8056a399d976f838685df54d608 /ext/mysqlnd
parent95b386357961d42892d9a41d51803bcdac13629f (diff)
downloadphp-git-5f260e14b2b809ab2969db7ee1affff7ae7d5405.tar.gz
Next attempt to fix http://bugs.php.net/bug.php?id=48745. Patch by Andrey.
Diffstat (limited to 'ext/mysqlnd')
-rw-r--r--ext/mysqlnd/mysqlnd_result_meta.c9
-rw-r--r--ext/mysqlnd/mysqlnd_wireprotocol.c11
-rw-r--r--ext/mysqlnd/mysqlnd_wireprotocol.h2
3 files changed, 20 insertions, 2 deletions
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_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c
index 989cc87ed0..79c98741e8 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -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;
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;