Hi,

I think I found a small typo in the function that extracts a timestamp from
a UUIDv7 (uuid_extract_timestamp). Unless I am mistaken, the constant
US_PER_MS should be used instead of NS_PER_US when converting milliseconds
to microseconds. Fortunately, these constants are the same so the
calculation is still correct.

Anyway, attaching a patch to fix this typo.

On a related note, I am wondering why this function doesn't extract and use
the sub-millisecond information in the rand_a bits? These bits are added
when generating the UUID, but they don't seem to be extracted. Hopefully
somebody could shed some light on this and whether it would be a worthwhile
addition.

Thank you,

- Erik
From 5c8b4070366581219bab0cdda27336bb0cea5844 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Erik=20Nordstr=C3=B6m?= <erik.nordst...@gmail.com>
Date: Wed, 13 Aug 2025 09:41:08 +0200
Subject: [PATCH] Fix constant when extracting timestamp from UUIDv7

When extracting a timestamp from a UUIDv7, a conversion from
milliseconds to microseconds is performed using the wrong constant
NS_PER_US instead of US_PER_MS. Fortunately, these constants are both
the same so the fix is mostly to avoid confusion.
---
 src/backend/utils/adt/uuid.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c
index bce7309c183..a746388b073 100644
--- a/src/backend/utils/adt/uuid.c
+++ b/src/backend/utils/adt/uuid.c
@@ -752,7 +752,7 @@ uuid_extract_timestamp(PG_FUNCTION_ARGS)
 			+ (((uint64) uuid->data[0]) << 40);
 
 		/* convert ms to us, then adjust */
-		ts = (TimestampTz) (tms * NS_PER_US) -
+		ts = (TimestampTz) (tms * US_PER_MS) -
 			(POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC;
 
 		PG_RETURN_TIMESTAMPTZ(ts);
-- 
2.48.1

Reply via email to