From cb3833a3bef1d40ff630f6a0af55648acaf664f7 Mon Sep 17 00:00:00 2001 From: William Felipe Welter Date: Tue, 3 Feb 2015 22:47:05 -0200 Subject: Fixed bug #68638 pg_update() fails to store infinite values. Regex to check float values changed to accept "infinity" values and ignore case. Quotes are added to prevent syntax error on PostgreSQL. --- ext/pgsql/pgsql.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 16ce7bfb7f..e8070acbb2 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5590,11 +5590,12 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con } else { /* FIXME: better regex must be used */ - if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)$", 0 TSRMLS_CC) == FAILURE) { + if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)|([+-]{0,1}(INF)(inity){0,1})$", 1 TSRMLS_CC) == FAILURE) { err = 1; } else { ZVAL_STRING(new_val, Z_STRVAL_PP(val), 1); + php_pgsql_add_quotes(new_val, 1 TSRMLS_CC); } } break; -- cgit v1.2.1 From b64f1491768426cd9602dc7057a220ef5b5e4cfd Mon Sep 17 00:00:00 2001 From: William Felipe Welter Date: Thu, 5 Feb 2015 13:19:52 -0200 Subject: Test case Bug #68638 pg_update() fails to store infinite values --- ext/pgsql/tests/bug68638.phpt | 53 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 ext/pgsql/tests/bug68638.phpt diff --git a/ext/pgsql/tests/bug68638.phpt b/ext/pgsql/tests/bug68638.phpt new file mode 100644 index 0000000000..e0701a79f5 --- /dev/null +++ b/ext/pgsql/tests/bug68638.phpt @@ -0,0 +1,53 @@ +--TEST-- +Bug #68638 pg_update() fails to store infinite values +--SKIPIF-- + +--FILE-- + 1, 'value' => 1.2)); +pg_insert($conn,$table, array('id' => 2, 'value' => 10)); +pg_insert($conn,$table, array('id' => 3, 'value' => 15)); + +var_dump(pg_update($conn,$table, array('value' => 'inf'), array('id' => 1), PGSQL_DML_STRING)); + +pg_update($conn,$table, array('value' => 'inf'), array('id' => 1)); +pg_update($conn,$table, array('value' => '-inf'), array('id' => 2)); +pg_update($conn,$table, array('value' => '+inf'), array('id' => 3)); + +$rs = pg_query("SELECT * FROM $table"); +while ($row = pg_fetch_assoc($rs)) { + var_dump($row); +} + +pg_query("DROP TABLE $table"); + +?> +--EXPECT-- +string(52) "UPDATE "test_68638" SET "value"=E'inf' WHERE "id"=1;" +array(2) { + ["id"]=> + string(1) "1" + ["value"]=> + string(8) "Infinity" +} +array(2) { + ["id"]=> + string(1) "2" + ["value"]=> + string(9) "-Infinity" +} +array(2) { + ["id"]=> + string(1) "3" + ["value"]=> + string(8) "Infinity" +} -- cgit v1.2.1 From bb3a81c4b482e94354fed40d0f1e1f81afca7437 Mon Sep 17 00:00:00 2001 From: William Felipe Welter Date: Sat, 7 Feb 2015 01:26:12 -0200 Subject: Fixed bug #68638 pg_update() fails to store infinite values. Add quotes only if "infinity" values are received. --- ext/pgsql/pgsql.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index e8070acbb2..f4595c7503 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5590,12 +5590,16 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con } else { /* FIXME: better regex must be used */ - if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)|([+-]{0,1}(INF)(inity){0,1})$", 1 TSRMLS_CC) == FAILURE) { + if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)|([+-]{0,1}(inf)(inity){0,1})$", 1 TSRMLS_CC) == FAILURE) { err = 1; } else { + ZVAL_STRING(new_val, Z_STRVAL_PP(val), 1); - php_pgsql_add_quotes(new_val, 1 TSRMLS_CC); + if(php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}(inf)(inity){0,1})$", 1 TSRMLS_CC) == SUCCESS) { + php_pgsql_add_quotes(new_val, 1 TSRMLS_CC); + } + } } break; -- cgit v1.2.1 From 60d5cdf1379950afde23de10acc964e7fc34145b Mon Sep 17 00:00:00 2001 From: William Felipe Welter Date: Mon, 9 Feb 2015 20:35:18 -0200 Subject: Fixed bug #68638 pg_update() fails to store infinite values Check if value is "infinity" with strcasestr() to add quotes --- ext/pgsql/pgsql.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index f4595c7503..d8c99f2d09 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5591,15 +5591,13 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con else { /* FIXME: better regex must be used */ if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)|([+-]{0,1}(inf)(inity){0,1})$", 1 TSRMLS_CC) == FAILURE) { - err = 1; + err = 1; } else { - ZVAL_STRING(new_val, Z_STRVAL_PP(val), 1); - if(php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}(inf)(inity){0,1})$", 1 TSRMLS_CC) == SUCCESS) { + if(strcasestr(Z_STRVAL_PP(val),"inf")!=0){ php_pgsql_add_quotes(new_val, 1 TSRMLS_CC); } - } } break; -- cgit v1.2.1 From 0421404b7322167cdc7e3b5232757ce4a7bc7e11 Mon Sep 17 00:00:00 2001 From: William Felipe Welter Date: Thu, 12 Feb 2015 23:39:54 -0200 Subject: Fixed bug #68638 pg_update() fails to store infinite values Fix indent --- ext/pgsql/pgsql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index d8c99f2d09..458827865b 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5591,7 +5591,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con else { /* FIXME: better regex must be used */ if (php_pgsql_convert_match(Z_STRVAL_PP(val), Z_STRLEN_PP(val), "^([+-]{0,1}[0-9]+)|([+-]{0,1}[0-9]*[\\.][0-9]+)|([+-]{0,1}[0-9]+[\\.][0-9]*)|([+-]{0,1}(inf)(inity){0,1})$", 1 TSRMLS_CC) == FAILURE) { - err = 1; + err = 1; } else { ZVAL_STRING(new_val, Z_STRVAL_PP(val), 1); -- cgit v1.2.1