Skip to content

Commit 6d10a69

Browse files
Yurunsoftdevnexen
authored andcommitted
Fix the incorrect data type of float values in PDO query results
Close GH-12476
1 parent 8372da7 commit 6d10a69

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed

NEWS

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Opcache:
1919
PDO_PGSQL:
2020
. Fixed GH-12423, DSN credentials being prioritized over the user/password
2121
PDO constructor arguments. (SakiTakamachi)
22+
. Fixed native float support with pdo_pgsql query results. (Yurunsoft)
2223

2324
PGSQL:
2425
. Added the possibility to have no conditions for pg_select. (OmarEmaraDev)

ext/pdo_pgsql/pgsql_statement.c

+22
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
#define TIMESTAMPOID 1114
5252
#define VARCHARLABEL "varchar"
5353
#define VARCHAROID 1043
54+
#define FLOAT4LABEL "float4"
55+
#define FLOAT4OID 700
56+
#define FLOAT8LABEL "float8"
57+
#define FLOAT8OID 701
5458

5559

5660

@@ -513,6 +517,18 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pd
513517
#endif
514518
ZVAL_LONG(result, ZEND_ATOL(ptr));
515519
break;
520+
case FLOAT4OID:
521+
case FLOAT8OID:
522+
if (strncmp(ptr, "Infinity", len) == 0) {
523+
ZVAL_DOUBLE(result, ZEND_INFINITY);
524+
} else if (strncmp(ptr, "-Infinity", len) == 0) {
525+
ZVAL_DOUBLE(result, -ZEND_INFINITY);
526+
} else if (strncmp(ptr, "NaN", len) == 0) {
527+
ZVAL_DOUBLE(result, ZEND_NAN);
528+
} else {
529+
ZVAL_DOUBLE(result, zend_strtod(ptr, NULL));
530+
}
531+
break;
516532

517533
case OIDOID: {
518534
char *end_ptr;
@@ -632,6 +648,12 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, zend_long colno, zval *r
632648
case INT4OID:
633649
add_assoc_string(return_value, "native_type", INT4LABEL);
634650
break;
651+
case FLOAT4OID:
652+
add_assoc_string(return_value, "native_type", FLOAT4LABEL);
653+
break;
654+
case FLOAT8OID:
655+
add_assoc_string(return_value, "native_type", FLOAT8LABEL);
656+
break;
635657
case TEXTOID:
636658
add_assoc_string(return_value, "native_type", TEXTLABEL);
637659
break;

ext/pdo_pgsql/tests/float.phpt

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
--TEST--
2+
PDO PgSQL float value
3+
--EXTENSIONS--
4+
pdo
5+
pdo_pgsql
6+
--SKIPIF--
7+
<?php
8+
require __DIR__ . '/config.inc';
9+
require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
10+
PDOTest::skip();
11+
?>
12+
--FILE--
13+
<?php
14+
require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
15+
$db = PDOTest::test_factory(__DIR__ . '/common.phpt');
16+
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
17+
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
18+
$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
19+
20+
$stmt = $db->query(<<<'SQL'
21+
select cast(0.4 as float4) as value4,
22+
cast(0.8 as float8) as value8,
23+
cast('NaN' as float4) as valuenan,
24+
cast('Infinity' as float4) as valueinfinity,
25+
cast('-Infinity' as float4) as valueninfinity
26+
SQL);
27+
28+
var_dump($stmt->fetchAll());
29+
var_dump($stmt->getColumnMeta(0));
30+
var_dump($stmt->getColumnMeta(1));
31+
var_dump($stmt->getColumnMeta(2));
32+
var_dump($stmt->getColumnMeta(3));
33+
var_dump($stmt->getColumnMeta(4));
34+
?>
35+
--EXPECT--
36+
array(1) {
37+
[0]=>
38+
array(5) {
39+
["value4"]=>
40+
float(0.4)
41+
["value8"]=>
42+
float(0.8)
43+
["valuenan"]=>
44+
float(NAN)
45+
["valueinfinity"]=>
46+
float(INF)
47+
["valueninfinity"]=>
48+
float(-INF)
49+
}
50+
}
51+
array(7) {
52+
["pgsql:oid"]=>
53+
int(700)
54+
["pgsql:table_oid"]=>
55+
int(0)
56+
["native_type"]=>
57+
string(6) "float4"
58+
["pdo_type"]=>
59+
int(2)
60+
["name"]=>
61+
string(6) "value4"
62+
["len"]=>
63+
int(4)
64+
["precision"]=>
65+
int(-1)
66+
}
67+
array(7) {
68+
["pgsql:oid"]=>
69+
int(701)
70+
["pgsql:table_oid"]=>
71+
int(0)
72+
["native_type"]=>
73+
string(6) "float8"
74+
["pdo_type"]=>
75+
int(2)
76+
["name"]=>
77+
string(6) "value8"
78+
["len"]=>
79+
int(8)
80+
["precision"]=>
81+
int(-1)
82+
}
83+
array(7) {
84+
["pgsql:oid"]=>
85+
int(700)
86+
["pgsql:table_oid"]=>
87+
int(0)
88+
["native_type"]=>
89+
string(6) "float4"
90+
["pdo_type"]=>
91+
int(2)
92+
["name"]=>
93+
string(8) "valuenan"
94+
["len"]=>
95+
int(4)
96+
["precision"]=>
97+
int(-1)
98+
}
99+
array(7) {
100+
["pgsql:oid"]=>
101+
int(700)
102+
["pgsql:table_oid"]=>
103+
int(0)
104+
["native_type"]=>
105+
string(6) "float4"
106+
["pdo_type"]=>
107+
int(2)
108+
["name"]=>
109+
string(13) "valueinfinity"
110+
["len"]=>
111+
int(4)
112+
["precision"]=>
113+
int(-1)
114+
}
115+
array(7) {
116+
["pgsql:oid"]=>
117+
int(700)
118+
["pgsql:table_oid"]=>
119+
int(0)
120+
["native_type"]=>
121+
string(6) "float4"
122+
["pdo_type"]=>
123+
int(2)
124+
["name"]=>
125+
string(14) "valueninfinity"
126+
["len"]=>
127+
int(4)
128+
["precision"]=>
129+
int(-1)
130+
}

0 commit comments

Comments
 (0)