Skip to content

Commit c0f2762

Browse files
committed
Improve regression tests for uuid-ossp.
On reflection, the timestamp-advances test might fail if we're unlucky enough for the time_mid field to change between two calls, since uuid_cmp is just bytewise comparison and the field ordering has more significant fields later. Build some field extraction functions so we can do a more honest test of that. Also check that the version and reserved fields contain what they should.
1 parent 2103218 commit c0f2762

File tree

2 files changed

+88
-21
lines changed

2 files changed

+88
-21
lines changed

contrib/uuid-ossp/expected/uuid_ossp.out

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,40 +29,71 @@ SELECT uuid_ns_x500();
2929
6ba7b814-9dad-11d1-80b4-00c04fd430c8
3030
(1 row)
3131

32-
SELECT uuid_generate_v1() < uuid_generate_v1();
33-
?column?
34-
----------
35-
t
32+
-- some quick and dirty field extraction functions
33+
-- this is actually timestamp concatenated with clock sequence, per RFC 4122
34+
CREATE FUNCTION uuid_timestamp_bits(uuid) RETURNS varbit AS
35+
$$ SELECT ('x' || substr($1::text, 15, 4) || substr($1::text, 10, 4) ||
36+
substr($1::text, 1, 8) || substr($1::text, 20, 4))::bit(80)
37+
& x'0FFFFFFFFFFFFFFF3FFF' $$
38+
LANGUAGE SQL STRICT IMMUTABLE;
39+
CREATE FUNCTION uuid_version_bits(uuid) RETURNS varbit AS
40+
$$ SELECT ('x' || substr($1::text, 15, 2))::bit(8) & '11110000' $$
41+
LANGUAGE SQL STRICT IMMUTABLE;
42+
CREATE FUNCTION uuid_reserved_bits(uuid) RETURNS varbit AS
43+
$$ SELECT ('x' || substr($1::text, 20, 2))::bit(8) & '11000000' $$
44+
LANGUAGE SQL STRICT IMMUTABLE;
45+
CREATE FUNCTION uuid_multicast_bits(uuid) RETURNS varbit AS
46+
$$ SELECT ('x' || substr($1::text, 25, 2))::bit(8) & '00000011' $$
47+
LANGUAGE SQL STRICT IMMUTABLE;
48+
CREATE FUNCTION uuid_node(uuid) RETURNS text AS
49+
$$ SELECT substr($1::text, 25) $$
50+
LANGUAGE SQL STRICT IMMUTABLE;
51+
SELECT uuid_version_bits(uuid_generate_v1()),
52+
uuid_reserved_bits(uuid_generate_v1()),
53+
uuid_multicast_bits(uuid_generate_v1());
54+
uuid_version_bits | uuid_reserved_bits | uuid_multicast_bits
55+
-------------------+--------------------+---------------------
56+
00010000 | 10000000 | 00000000
57+
(1 row)
58+
59+
SELECT uuid_version_bits(uuid_generate_v1mc()),
60+
uuid_reserved_bits(uuid_generate_v1mc()),
61+
uuid_multicast_bits(uuid_generate_v1mc());
62+
uuid_version_bits | uuid_reserved_bits | uuid_multicast_bits
63+
-------------------+--------------------+---------------------
64+
00010000 | 10000000 | 00000011
3665
(1 row)
3766

38-
SELECT uuid_generate_v1() < uuid_generate_v1mc();
67+
-- timestamp+clock sequence should be monotonic increasing in v1
68+
SELECT uuid_timestamp_bits(uuid_generate_v1()) < uuid_timestamp_bits(uuid_generate_v1());
3969
?column?
4070
----------
4171
t
4272
(1 row)
4373

44-
SELECT substr(uuid_generate_v1()::text, 25) = substr(uuid_generate_v1()::text, 25);
74+
SELECT uuid_timestamp_bits(uuid_generate_v1mc()) < uuid_timestamp_bits(uuid_generate_v1mc());
4575
?column?
4676
----------
4777
t
4878
(1 row)
4979

50-
SELECT substr(uuid_generate_v1()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
80+
-- node should be stable in v1, but not v1mc
81+
SELECT uuid_node(uuid_generate_v1()) = uuid_node(uuid_generate_v1());
5182
?column?
5283
----------
5384
t
5485
(1 row)
5586

56-
SELECT substr(uuid_generate_v1mc()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
87+
SELECT uuid_node(uuid_generate_v1()) <> uuid_node(uuid_generate_v1mc());
5788
?column?
5889
----------
5990
t
6091
(1 row)
6192

62-
SELECT ('x' || substr(uuid_generate_v1mc()::text, 25, 2))::bit(8) & '00000011';
93+
SELECT uuid_node(uuid_generate_v1mc()) <> uuid_node(uuid_generate_v1mc());
6394
?column?
6495
----------
65-
00000011
96+
t
6697
(1 row)
6798

6899
SELECT uuid_generate_v3(uuid_ns_dns(), 'www.widgets.com');
@@ -77,10 +108,11 @@ SELECT uuid_generate_v5(uuid_ns_dns(), 'www.widgets.com');
77108
21f7f8de-8051-5b89-8680-0195ef798b6a
78109
(1 row)
79110

80-
SELECT uuid_generate_v4()::text ~ '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$';
81-
?column?
82-
----------
83-
t
111+
SELECT uuid_version_bits(uuid_generate_v4()),
112+
uuid_reserved_bits(uuid_generate_v4());
113+
uuid_version_bits | uuid_reserved_bits
114+
-------------------+--------------------
115+
01000000 | 10000000
84116
(1 row)
85117

86118
SELECT uuid_generate_v4() <> uuid_generate_v4();

contrib/uuid-ossp/sql/uuid_ossp.sql

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,52 @@ SELECT uuid_ns_url();
66
SELECT uuid_ns_oid();
77
SELECT uuid_ns_x500();
88

9-
SELECT uuid_generate_v1() < uuid_generate_v1();
10-
SELECT uuid_generate_v1() < uuid_generate_v1mc();
9+
-- some quick and dirty field extraction functions
1110

12-
SELECT substr(uuid_generate_v1()::text, 25) = substr(uuid_generate_v1()::text, 25);
13-
SELECT substr(uuid_generate_v1()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
14-
SELECT substr(uuid_generate_v1mc()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
11+
-- this is actually timestamp concatenated with clock sequence, per RFC 4122
12+
CREATE FUNCTION uuid_timestamp_bits(uuid) RETURNS varbit AS
13+
$$ SELECT ('x' || substr($1::text, 15, 4) || substr($1::text, 10, 4) ||
14+
substr($1::text, 1, 8) || substr($1::text, 20, 4))::bit(80)
15+
& x'0FFFFFFFFFFFFFFF3FFF' $$
16+
LANGUAGE SQL STRICT IMMUTABLE;
1517

16-
SELECT ('x' || substr(uuid_generate_v1mc()::text, 25, 2))::bit(8) & '00000011';
18+
CREATE FUNCTION uuid_version_bits(uuid) RETURNS varbit AS
19+
$$ SELECT ('x' || substr($1::text, 15, 2))::bit(8) & '11110000' $$
20+
LANGUAGE SQL STRICT IMMUTABLE;
21+
22+
CREATE FUNCTION uuid_reserved_bits(uuid) RETURNS varbit AS
23+
$$ SELECT ('x' || substr($1::text, 20, 2))::bit(8) & '11000000' $$
24+
LANGUAGE SQL STRICT IMMUTABLE;
25+
26+
CREATE FUNCTION uuid_multicast_bits(uuid) RETURNS varbit AS
27+
$$ SELECT ('x' || substr($1::text, 25, 2))::bit(8) & '00000011' $$
28+
LANGUAGE SQL STRICT IMMUTABLE;
29+
30+
CREATE FUNCTION uuid_node(uuid) RETURNS text AS
31+
$$ SELECT substr($1::text, 25) $$
32+
LANGUAGE SQL STRICT IMMUTABLE;
33+
34+
SELECT uuid_version_bits(uuid_generate_v1()),
35+
uuid_reserved_bits(uuid_generate_v1()),
36+
uuid_multicast_bits(uuid_generate_v1());
37+
38+
SELECT uuid_version_bits(uuid_generate_v1mc()),
39+
uuid_reserved_bits(uuid_generate_v1mc()),
40+
uuid_multicast_bits(uuid_generate_v1mc());
41+
42+
-- timestamp+clock sequence should be monotonic increasing in v1
43+
SELECT uuid_timestamp_bits(uuid_generate_v1()) < uuid_timestamp_bits(uuid_generate_v1());
44+
SELECT uuid_timestamp_bits(uuid_generate_v1mc()) < uuid_timestamp_bits(uuid_generate_v1mc());
45+
46+
-- node should be stable in v1, but not v1mc
47+
SELECT uuid_node(uuid_generate_v1()) = uuid_node(uuid_generate_v1());
48+
SELECT uuid_node(uuid_generate_v1()) <> uuid_node(uuid_generate_v1mc());
49+
SELECT uuid_node(uuid_generate_v1mc()) <> uuid_node(uuid_generate_v1mc());
1750

1851
SELECT uuid_generate_v3(uuid_ns_dns(), 'www.widgets.com');
1952
SELECT uuid_generate_v5(uuid_ns_dns(), 'www.widgets.com');
2053

21-
SELECT uuid_generate_v4()::text ~ '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$';
54+
SELECT uuid_version_bits(uuid_generate_v4()),
55+
uuid_reserved_bits(uuid_generate_v4());
56+
2257
SELECT uuid_generate_v4() <> uuid_generate_v4();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy