You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Feb 7, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Feb 7, 2026. It is now read-only.
losing precision in converting TIMESTAMP and INT64 to Javascript Number #6
Thank you for opening this, @c0b! I think we're okay on integer & timestamp precision, since it is available through the raw apiResponse argument when the user requires it.
Based on the discussion in the Node.js standup today, we are deciding this is not release blocking. A user who needs the full precision can get it from the raw API response in the third callback argument.
I don't believe there is a good solution for this without introducing complexity.
TIMESTAMP
The docs say that TIMESTAMPs are stored internally with microsecond precision, however, the raw API response seems to be returning the value in seconds.
functionInt(value){this.value=value.toString();}Int.prototype.valueOf=function(){varnumber=Number(this.value);if(number>Number.MAX_SAFE_INTEGER){thrownewError('Integer '+this.value+' is out of bounds.');}returnnumber;};
table.read(query,function(err,rows){varrow=rows[0]row=[{name: 'SafeInt',value: {value: '2'// string}},{name: 'OutOfBoundsInt',value: {value: '--out-of-bounds-integer--'// string}}]varsafeInt=row[0].valuetypeofsafeInt===Spanner.Intconsole.log(safeInt.value)// '2' (String)console.log(safeInt)// 2 (Number type)varoutOfBoundsInt=row[1].valuetypeofoutOfBoundsInt===Spanner.Intconsole.log(outOfBoundsInt.value)// '--out-of-bounds-integer--' (String)console.log(outOfBoundsInt)// throws 'Integer '--out-of-bounds-integer-as-string--' is out of bounds.'})
@lukesneeringer how should we determine if the precision is worth the complexity?
A pretty neat feature that the mysql client offers is type casting. Users can essentially supply a callback to convert the raw value to whatever they want. With newer versions of Node supporting BigInt, I think it might benefit the BigQuery library (and maybe others like Spanner and Datastore) if we offered similar functionality.
@callmehiphop seems like a great use of BigInt, would be interesting if you could find an elegant way to add this feature progressively so that folks can opt in to using BigInt if they need the precision.
After reading this issue, I tried to query a table with identifiers stored in INT64 columns with wrapIntegers property set to true, but it loses precision even using the latest release (5.9.3) on Node.js 14. Could you take a look at this code, please? I do not see anything wrong.
@sergioregueira, the behavior that you reported is indeed an issue in our library. Basically the Query.wrapIntegers was being ignored. For it to works you need to pass as a QueryResultsOptions.
As for the microsecond precision support, another PR was opened to fix that ( #1192 ). It basically that uses @google-cloud/precise-date to parse timestamp arriving as a float64 to a timestamp string with microsecond resolution.
Activity
stephenplusplus commentedon Nov 17, 2017
Thank you for opening this, @c0b! I think we're okay on integer & timestamp precision, since it is available through the raw
apiResponseargument when the user requires it.@callmehiphop what do you think?
stephenplusplus commentedon Nov 17, 2017
From @callmehiphop on October 10, 2016 19:55
Maybe in the docs we could recommend/show examples for precision using an int64 lib? We use node-int64 in Bigtable.
stephenplusplus commentedon Nov 17, 2017
From @lukesneeringer on March 13, 2017 19:41
Based on the discussion in the Node.js standup today, we are deciding this is not release blocking. A user who needs the full precision can get it from the raw API response in the third callback argument.
stephenplusplus commentedon Nov 17, 2017
I don't believe there is a good solution for this without introducing complexity.
TIMESTAMP
The docs say that TIMESTAMPs are stored internally with microsecond precision, however, the raw API response seems to be returning the value in seconds.
INT64
The solution for this would be a bit more complex for the user. Currently, if you read one of these values, you get the native JS "Number" type. For our
@google-cloud/spannerAPI, the Spanner team wanted to guarantee the same precision the API stores, so this is how the "more complex" solution looks for that API: https://github.com/googleapis/nodejs-spanner/blob/8a8b43f52afdbcd443cdc6d6c5d0f2fa68ee5566/src/codec.js#L54-L66:@lukesneeringer how should we determine if the precision is worth the complexity?
stephenplusplus commentedon Apr 2, 2018
@alexander-fenster any input?
callmehiphop commentedon Mar 18, 2019
A pretty neat feature that the
mysqlclient offers is type casting. Users can essentially supply a callback to convert the raw value to whatever they want. With newer versions of Node supportingBigInt, I think it might benefit the BigQuery library (and maybe others like Spanner and Datastore) if we offered similar functionality.@stephenplusplus @bcoe @JustinBeckwith WDYT?
JustinBeckwith commentedon Mar 18, 2019
Sounds awesome to me, but please do run by @shollyman and @tswast first :)
bcoe commentedon Mar 18, 2019
@callmehiphop seems like a great use of
BigInt, would be interesting if you could find an elegant way to add this feature progressively so that folks can opt in to usingBigIntif they need the precision.21 remaining items
sergioregueira commentedon Dec 16, 2021
Hello everybody,
After reading this issue, I tried to query a table with identifiers stored in
INT64columns withwrapIntegersproperty set totrue, but it loses precision even using the latest release (5.9.3) on Node.js 14. Could you take a look at this code, please? I do not see anything wrong.Thank you!
meredithslota commentedon Mar 10, 2023
(I'm tempted to classify this as a "bug" but it is technically a feature request; asking @alvarowolfx to look into it.)
alvarowolfx commentedon Mar 10, 2023
@sergioregueira, the behavior that you reported is indeed an issue in our library. Basically the
Query.wrapIntegerswas being ignored. For it to works you need to pass as aQueryResultsOptions.But I opened a PR with a fix for that to support the way that you reported too. See #1191
alvarowolfx commentedon Mar 10, 2023
As for the microsecond precision support, another PR was opened to fix that ( #1192 ). It basically that uses @google-cloud/precise-date to parse timestamp arriving as a float64 to a timestamp string with microsecond resolution.
Example output:
feat: add support for microseconds precision (#1192)