]> granicus.if.org Git - php/commitdiff
Fixed REFERENCE handling
authorXinchen Hui <laruence@php.net>
Thu, 8 May 2014 08:11:50 +0000 (16:11 +0800)
committerXinchen Hui <laruence@php.net>
Thu, 8 May 2014 08:11:50 +0000 (16:11 +0800)
ext/pdo/pdo_sql_parser.c
ext/pdo/pdo_sql_parser.re
ext/pdo_mysql/tests/common.phpt
ext/pdo_mysql/tests/config.inc

index 50b2b5d6ec6d5a63e1510945a3f82855729a08e7..cf108991e537047d167d159a310b93ee81345d62 100644 (file)
@@ -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 = &param->parameter;
+                               }
+                               if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) {
                                        php_stream *stm;
 
-                                       php_stream_from_zval_no_verify(stm, &param->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, &param->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 = &param->parameter;
+                               }
+                               plc->quoted = Z_STRVAL_P(parameter);
+                               plc->qlen = Z_STRLEN_P(parameter);
                        }
                        newbuffer_len += plc->qlen;
                }
index 4a206c79f485c4a2ebad4f1d975a6072454925a0..48d80e26841e1adf6e8cdcc606819dcddf7a54cd 100644 (file)
@@ -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 = &param->parameter;
+                               }
+                               if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) {
                                        php_stream *stm;
 
-                                       php_stream_from_zval_no_verify(stm, &param->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, &param->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 = &param->parameter;
+                               }
+                               plc->quoted = Z_STRVAL_P(parameter);
+                               plc->qlen = Z_STRLEN_P(parameter);
                        }
                        newbuffer_len += plc->qlen;
                }
index f55d1f883b482ddba7d66363393aa6e7649b40e1..18c5c1b20dd89c33c8a98693d8eed24f9431bcde 100644 (file)
@@ -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'] = '';
 }
index 2530442c0eaabd753d69f71ff9d14984b3cdba26..21f33a2d599c7bbdace3eb4fcc89e9e61b94a9bf 100644 (file)
@@ -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
+?>