@@ -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
6899SELECT 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
86118SELECT uuid_generate_v4() <> uuid_generate_v4();
0 commit comments