com php-src: Fixed REFERENCE handling: ext/pdo/pdo_sql_pars er.c ext/pdo/pdo_sql_parser.re ext/pdo_mysql/test s/common.phpt
ext/pdo_mysql/tests/config.inc
| From: | Xinchen Hui | Date: | Thu, 08 May 2014 08:11:50 +0000 |
| Subject: | com php-src: Fixed REFERENCE handling: ext/pdo/pdo_sql_pars er.c ext/pdo/pdo_sql_parser.re ext/pdo_mysql/test s/common.phpt ext/pdo_mysql/tests/config.inc |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-78204@lists.php.net to get a copy of this message | ||
Commit: be79628b8747ea1311964d9834d99c06abe76278
Author: Xinchen Hui <laruence@php.net> Thu, 8 May 2014 16:11:50 +0800
Parents: c242518bf0d2c3132c60c8f8dfba64329f73e90e
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=be79628b8747ea1311964d9834d99c06abe76278
Log:
Fixed REFERENCE handling
Changed paths:
M ext/pdo/pdo_sql_parser.c
M ext/pdo/pdo_sql_parser.re
M ext/pdo_mysql/tests/common.phpt
M ext/pdo_mysql/tests/config.inc
Diff:
diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c
index 50b2b5d..cf10899 100644
--- a/ext/pdo/pdo_sql_parser.c
+++ b/ext/pdo/pdo_sql_parser.c
@@ -527,7 +527,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno >
zend_hash_num_elements(params)) {
int ok = 1;
for (plc = placeholders; plc; plc = plc->next) {
- if ((params = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) {
+ if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) {
ok = 0;
break;
}
@@ -561,10 +561,16 @@ safe:
goto clean_up;
}
if (stmt->dbh->methods->quoter) {
- if (param->param_type == PDO_PARAM_LOB && Z_TYPE(param->parameter) ==
IS_RESOURCE) {
+ zval *parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = ¶m->parameter;
+ }
+ if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) {
php_stream *stm;
- php_stream_from_zval_no_verify(stm, ¶m->parameter);
+ php_stream_from_zval_no_verify(stm, parameter);
if (stm) {
zend_string *buf;
@@ -590,7 +596,7 @@ safe:
plc->freeq = 1;
} else {
zval tmp_param;
- ZVAL_DUP(&tmp_param, ¶m->parameter);
+ ZVAL_DUP(&tmp_param, parameter);
switch (Z_TYPE(tmp_param)) {
case IS_NULL:
plc->quoted = "NULL";
@@ -625,8 +631,14 @@ safe:
zval_dtor(&tmp_param);
}
} else {
- plc->quoted = Z_STRVAL(param->parameter);
- plc->qlen = Z_STRLEN(param->parameter);
+ zval *parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = ¶m->parameter;
+ }
+ plc->quoted = Z_STRVAL_P(parameter);
+ plc->qlen = Z_STRLEN_P(parameter);
}
newbuffer_len += plc->qlen;
}
diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re
index 4a206c7..48d80e2 100644
--- a/ext/pdo/pdo_sql_parser.re
+++ b/ext/pdo/pdo_sql_parser.re
@@ -169,7 +169,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno >
zend_hash_num_elements(params)) {
int ok = 1;
for (plc = placeholders; plc; plc = plc->next) {
- if ((params = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) {
+ if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) {
ok = 0;
break;
}
@@ -203,10 +203,16 @@ safe:
goto clean_up;
}
if (stmt->dbh->methods->quoter) {
- if (param->param_type == PDO_PARAM_LOB && Z_TYPE(param->parameter) ==
IS_RESOURCE) {
+ zval *parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = ¶m->parameter;
+ }
+ if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) {
php_stream *stm;
- php_stream_from_zval_no_verify(stm, ¶m->parameter);
+ php_stream_from_zval_no_verify(stm, parameter);
if (stm) {
zend_string *buf;
@@ -232,7 +238,7 @@ safe:
plc->freeq = 1;
} else {
zval tmp_param;
- ZVAL_DUP(&tmp_param, ¶m->parameter);
+ ZVAL_DUP(&tmp_param, parameter);
switch (Z_TYPE(tmp_param)) {
case IS_NULL:
plc->quoted = "NULL";
@@ -267,8 +273,14 @@ safe:
zval_dtor(&tmp_param);
}
} else {
- plc->quoted = Z_STRVAL(param->parameter);
- plc->qlen = Z_STRLEN(param->parameter);
+ zval *parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = ¶m->parameter;
+ }
+ plc->quoted = Z_STRVAL_P(parameter);
+ plc->qlen = Z_STRLEN_P(parameter);
}
newbuffer_len += plc->qlen;
}
diff --git a/ext/pdo_mysql/tests/common.phpt b/ext/pdo_mysql/tests/common.phpt
index f55d1f8..18c5c1b 100644
--- a/ext/pdo_mysql/tests/common.phpt
+++ b/ext/pdo_mysql/tests/common..phpt
@@ -20,7 +20,7 @@ if (false !== getenv('PDO_MYSQL_TEST_DSN')) {
$config['ENV']['PDOTEST_ATTR'] = getenv('PDO_MYSQL_TEST_ATTR');
}
} else {
- $config['ENV']['PDOTEST_DSN'] = 'mysql:host=localhost;dbname=test';
+ $config['ENV']['PDOTEST_DSN'] =
'mysql:host=127.0.0.1;port=3308;dbname=test';
$config['ENV']['PDOTEST_USER'] = 'root';
$config['ENV']['PDOTEST_PASS'] = '';
}
diff --git a/ext/pdo_mysql/tests/config.inc b/ext/pdo_mysql/tests/config.inc
index 2530442..21f33a2 100644
--- a/ext/pdo_mysql/tests/config.inc
+++ b/ext/pdo_mysql/tests/config.inc
@@ -10,7 +10,7 @@ if (false !== getenv('PDO_MYSQL_TEST_DSN')) {
$config['ENV']['PDOTEST_ATTR'] = getenv('PDO_MYSQL_TEST_ATTR');
}
} else {
- $config['ENV']['PDOTEST_DSN'] = 'mysql:host=localhost;dbname=test';
+ $config['ENV']['PDOTEST_DSN'] =
'mysql:host=127.0.0.1;port=3308;dbname=test';
$config['ENV']['PDOTEST_USER'] = 'root';
$config['ENV']['PDOTEST_PASS'] = '';
}
@@ -49,4 +49,4 @@ if (!function_exists('sys_get_temp_dir')) {
return FALSE;
}
}
-?>
\ No newline at end of file
+?>