Fix precision loss for large CQL timestamp values #636
+186
−10
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Pre-review checklist
./docs/source/.Description
CQL
timestampvalues (signed milliseconds from epoch) lose precision when they are further than ~300 years from Unix epoch due to floating-point conversions during serialization/deserialization. This causes issues where a timestamp retrieved from the database cannot be used to query for the same row.Problem
The driver was converting int64 milliseconds to floating-point values during serialization/deserialization, causing precision loss for timestamps more than ~300 years from the Unix epoch (the maximum number of milliseconds that can be exactly represented in a double).
Example scenario:
Root Causes
*1e3,/1e3) to calculate millisecondsSolution
Implemented integer-only arithmetic throughout the timestamp conversion path:
Added new conversion functions:
datetime_from_timestamp_ms()incassandra/util.py(Python path)datetime_from_timestamp_ms()incassandra/cython_utils.pyx(Cython path)Updated DateType serialization/deserialization:
cassandra/cqltypes.py: ChangedDateType.deserialize()to call the new function directly on milliseconds (no division)cassandra/cqltypes.py: ChangedDateType.serialize()to use integer operations (*1000,//1000) instead of float operations (*1e3,/1e3)cassandra/deserializers.pyx: Updated Cython deserializer to use the new integer-based functionAdded comprehensive test coverage:
tests/unit/test_timestamp_precision.pywith 4 tests:Testing
The changes are minimal and surgical, affecting only the timestamp conversion logic without altering any other functionality.
Original prompt
timestamplose precision due to some floating-point conversions along the way #532💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.