summaryrefslogtreecommitdiff
path: root/contrib/uuid-ossp/sql
diff options
context:
space:
mode:
authorTom Lane2014-05-28 18:21:17 +0000
committerTom Lane2014-05-28 18:21:17 +0000
commitc0f27628d2fb53e8e5d190da2132739a2bb2f500 (patch)
tree7e4c65bde6d72c62ef1ecece4e88f970dfc027e8 /contrib/uuid-ossp/sql
parent2103218dd4a0c6a44d05c09c066da20e1c2360fb (diff)
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.
Diffstat (limited to 'contrib/uuid-ossp/sql')
-rw-r--r--contrib/uuid-ossp/sql/uuid_ossp.sql49
1 files changed, 42 insertions, 7 deletions
diff --git a/contrib/uuid-ossp/sql/uuid_ossp.sql b/contrib/uuid-ossp/sql/uuid_ossp.sql
index 29fba21b3f7..3b1fa24bc6b 100644
--- a/contrib/uuid-ossp/sql/uuid_ossp.sql
+++ b/contrib/uuid-ossp/sql/uuid_ossp.sql
@@ -6,17 +6,52 @@ SELECT uuid_ns_url();
SELECT uuid_ns_oid();
SELECT uuid_ns_x500();
-SELECT uuid_generate_v1() < uuid_generate_v1();
-SELECT uuid_generate_v1() < uuid_generate_v1mc();
+-- some quick and dirty field extraction functions
-SELECT substr(uuid_generate_v1()::text, 25) = substr(uuid_generate_v1()::text, 25);
-SELECT substr(uuid_generate_v1()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
-SELECT substr(uuid_generate_v1mc()::text, 25) <> substr(uuid_generate_v1mc()::text, 25);
+-- this is actually timestamp concatenated with clock sequence, per RFC 4122
+CREATE FUNCTION uuid_timestamp_bits(uuid) RETURNS varbit AS
+$$ SELECT ('x' || substr($1::text, 15, 4) || substr($1::text, 10, 4) ||
+ substr($1::text, 1, 8) || substr($1::text, 20, 4))::bit(80)
+ & x'0FFFFFFFFFFFFFFF3FFF' $$
+LANGUAGE SQL STRICT IMMUTABLE;
-SELECT ('x' || substr(uuid_generate_v1mc()::text, 25, 2))::bit(8) & '00000011';
+CREATE FUNCTION uuid_version_bits(uuid) RETURNS varbit AS
+$$ SELECT ('x' || substr($1::text, 15, 2))::bit(8) & '11110000' $$
+LANGUAGE SQL STRICT IMMUTABLE;
+
+CREATE FUNCTION uuid_reserved_bits(uuid) RETURNS varbit AS
+$$ SELECT ('x' || substr($1::text, 20, 2))::bit(8) & '11000000' $$
+LANGUAGE SQL STRICT IMMUTABLE;
+
+CREATE FUNCTION uuid_multicast_bits(uuid) RETURNS varbit AS
+$$ SELECT ('x' || substr($1::text, 25, 2))::bit(8) & '00000011' $$
+LANGUAGE SQL STRICT IMMUTABLE;
+
+CREATE FUNCTION uuid_node(uuid) RETURNS text AS
+$$ SELECT substr($1::text, 25) $$
+LANGUAGE SQL STRICT IMMUTABLE;
+
+SELECT uuid_version_bits(uuid_generate_v1()),
+ uuid_reserved_bits(uuid_generate_v1()),
+ uuid_multicast_bits(uuid_generate_v1());
+
+SELECT uuid_version_bits(uuid_generate_v1mc()),
+ uuid_reserved_bits(uuid_generate_v1mc()),
+ uuid_multicast_bits(uuid_generate_v1mc());
+
+-- timestamp+clock sequence should be monotonic increasing in v1
+SELECT uuid_timestamp_bits(uuid_generate_v1()) < uuid_timestamp_bits(uuid_generate_v1());
+SELECT uuid_timestamp_bits(uuid_generate_v1mc()) < uuid_timestamp_bits(uuid_generate_v1mc());
+
+-- node should be stable in v1, but not v1mc
+SELECT uuid_node(uuid_generate_v1()) = uuid_node(uuid_generate_v1());
+SELECT uuid_node(uuid_generate_v1()) <> uuid_node(uuid_generate_v1mc());
+SELECT uuid_node(uuid_generate_v1mc()) <> uuid_node(uuid_generate_v1mc());
SELECT uuid_generate_v3(uuid_ns_dns(), 'www.widgets.com');
SELECT uuid_generate_v5(uuid_ns_dns(), 'www.widgets.com');
-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}$';
+SELECT uuid_version_bits(uuid_generate_v4()),
+ uuid_reserved_bits(uuid_generate_v4());
+
SELECT uuid_generate_v4() <> uuid_generate_v4();