From b37e72ce7d4f40fa22aa65330b217b8948f037ef Mon Sep 17 00:00:00 2001 From: Jeff Raymakers Date: Sun, 3 Nov 2024 20:31:33 -0800 Subject: [PATCH] fix uuid toString --- api/src/values/DuckDBUUIDValue.ts | 8 +++++--- api/test/api.test.ts | 5 ++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/api/src/values/DuckDBUUIDValue.ts b/api/src/values/DuckDBUUIDValue.ts index ec4cae46..5d3e1c28 100644 --- a/api/src/values/DuckDBUUIDValue.ts +++ b/api/src/values/DuckDBUUIDValue.ts @@ -6,14 +6,16 @@ export class DuckDBUUIDValue { } public toString(): string { + // UUID values are stored with their MSB flipped so their numeric ordering matches their string ordering. + const flipped = this.hugeint ^ 0x80000000000000000000000000000000n // Truncate to 32 hex digits, then prepend with a hex 1, before converting to a hex string. // This ensures the trailing 32 characters are the hex digits we want, left padded with zeros as needed. - const hex = ((this.hugeint & 0xffffffffffffffffffffffffffffffffn) | 0x100000000000000000000000000000000n).toString(16); + const hex = ((flipped & 0xffffffffffffffffffffffffffffffffn) | 0x100000000000000000000000000000000n).toString(16); return `${hex.substring(1, 9)}-${hex.substring(9, 13)}-${hex.substring(13, 17)}-${hex.substring(17, 21)}-${hex.substring(21, 33)}`; } - public static readonly Max = new DuckDBUUIDValue(2n ** 127n - 1n); - public static readonly Min = new DuckDBUUIDValue(-(2n ** 127n)); + public static readonly Max = new DuckDBUUIDValue(2n ** 127n - 1n); // 7fffffffffffffffffffffffffffffff + public static readonly Min = new DuckDBUUIDValue(-(2n ** 127n)); // 80000000000000000000000000000000 } export function uuidValue(hugeint: bigint): DuckDBUUIDValue { diff --git a/api/test/api.test.ts b/api/test/api.test.ts index cf1b729a..58c360c7 100644 --- a/api/test/api.test.ts +++ b/api/test/api.test.ts @@ -115,7 +115,6 @@ import { timestampTZValue, timestampValue, unionValue, - uuidValue, version } from '../src'; @@ -920,8 +919,8 @@ describe('api', () => { assert.equal(unionValue('b', 'duck').toString(), 'duck'); // uuid - assert.equal(uuidValue(0n).toString(), '00000000-0000-0000-0000-000000000000'); - assert.equal(uuidValue(2n ** 128n - 1n).toString(), 'ffffffff-ffff-ffff-ffff-ffffffffffff'); + assert.equal(DuckDBUUIDValue.Min.toString(), '00000000-0000-0000-0000-000000000000'); + assert.equal(DuckDBUUIDValue.Max.toString(), 'ffffffff-ffff-ffff-ffff-ffffffffffff'); }); test('date isFinite', () => { assert.isTrue(DuckDBDateValue.Epoch.isFinite);