Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PostgreSQL: Floating point value in scientific notation with trailing zero gets changed #307

Closed
NTSFka opened this issue May 5, 2024 · 1 comment

Comments

@NTSFka
Copy link

NTSFka commented May 5, 2024

Version: 3.2, 3.1.7, 3.1, ...

Bug Description

Row normalizer changes value of floating point value in scientific notation (e.g. 1E-10) with exponent that ends with zeroes. This is only done when PDO driver returns floating point value as string (PostgreSQL) and not as float (MySQL and SQLite3).

Steps To Reproduce

Can be reproduced by adding this code to ResultSet.normalizeRow.postgre.phpt.

$res = $connection->query('SELECT CAST(1.2E-10 AS double precision) AS value');

Assert::same([
	'value' => 1.2E-10,
], (array) $res->fetch());

It fails with:

Driver: pgsql
Failed: ['value' => 0.12] should be 
    ... ['value' => 1.2E-10]

Database returns value as '1.2E-10' but row normalizer changes value to '1.2E-1' by removing trailing zeroes.

Problem is caused by first block of handling float and decimal values (from v3.2):

} elseif ($type === IStructure::FIELD_FLOAT || $type === IStructure::FIELD_DECIMAL) {
	if (is_string($value) && ($pos = strpos($value, '.')) !== false) {
		$value = rtrim(rtrim($pos === 0 ? "0$value" : $value, '0'), '.');
	}

	$row[$key] = (float) $value;

} ...

Expected Behavior

Floating point values shouldn't be changed.

Possible Solution

  1. Remove code that remove trailing zeroes from string representation of floating point values - tests didn't failed.
  2. Modify condition in row normalizer to ignore string in scientific notation.

Before 3.1.5 there was code that returns numeric values that are not possible to represent as floating point as string (if I understand correctly) but that was removed in order to fix #289. In result I see no point of having that code because PHP's cast operator can handle conversion and floating point and decimal values are never returned as string after 3.1.5.

dg added a commit that referenced this issue Aug 9, 2024
@dg
Copy link
Member

dg commented Aug 9, 2024

You're probably right that it can be simplified. I just need to leave the fix for SQL Server, which returns decimal numbers like .123, making it impossible to cast them using (float). 0c2ebef

@dg dg closed this as completed Aug 9, 2024
dg added a commit that referenced this issue Aug 13, 2024
dg added a commit that referenced this issue Aug 15, 2024
dg added a commit that referenced this issue Aug 17, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 18, 2024
dg added a commit that referenced this issue Aug 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants