--- /dev/null
+CREATE OPERATOR CLASS gin__uuid_ops
+DEFAULT
+FOR TYPE _uuid USING gin
+AS
+ OPERATOR 1 pg_catalog.&& (anyarray, anyarray),
+ OPERATOR 2 pg_catalog.@> (anyarray, anyarray),
+ OPERATOR 3 pg_catalog.<@ (anyarray, anyarray),
+ OPERATOR 4 pg_catalog.= (anyarray, anyarray),
+ FUNCTION 1 uuid_cmp (uuid, uuid),
+ FUNCTION 2 ginarrayextract (anyarray, internal, internal),
+ FUNCTION 3 ginqueryarrayextract (anyarray, internal, int2, internal, internal, internal, internal),
+ FUNCTION 4 ginarrayconsistent (internal, int2, anyarray, int4, internal, internal, internal, internal),
+ STORAGE uuid
+;
--- /dev/null
+-- uuid support function install script
+-- written by nathan wagner and placed in the public domain
+
+create function uuid_v1() returns uuid as 'pduuid', 'uuid_gen_v1'
+language C strict;
+
+create function uuid_v1mc() returns uuid as 'pduuid', 'uuid_gen_v1_mc'
+language C strict;
+
+create function uuid_v3(uuid, text) returns uuid
+as 'pduuid', 'uuid_gen_v3'
+language C strict;
+
+create function uuid_v4() returns uuid as 'pduuid', 'uuid_gen_v4'
+language C strict;
+
+create function uuid_v5(uuid, text) returns uuid
+as 'pduuid', 'uuid_gen_v5'
+language C strict;
+
+create function uuid_recent() returns uuid as 'pduuid', 'uuid_recent'
+language C strict;
+
+create function uuid_nil() returns uuid as 'pduuid', 'uuid_nil'
+language C immutable strict;
+
+create function uuid_ns_dns() returns uuid as 'pduuid', 'uuid_dns'
+language C immutable strict;
+
+create function uuid_ns_oid() returns uuid as 'pduuid', 'uuid_oid'
+language C immutable strict;
+
+create function uuid_ns_url() returns uuid as 'pduuid', 'uuid_url'
+language C immutable strict;
+
+create function uuid_ns_x500() returns uuid as 'pduuid', 'uuid_x500'
+language C immutable strict;
+
+create function uuid_url(text) returns uuid as $$
+select uuid_v5(uuid_ns_url(), $1);
+$$
+language 'sql' immutable strict;
+
+create function uuid_dns(text) returns uuid as $$
+select uuid_v5(uuid_ns_dns(), $1);
+$$
+language 'sql' immutable strict;
+
+create function uuid_oid(text) returns uuid as $$
+select uuid_v5(uuid_ns_oid(), $1);
+$$
+language 'sql' immutable strict;
+
+create function uuid_x500(text) returns uuid as $$
+select uuid_v5(uuid_ns_x500(), $1);
+$$
+language 'sql' immutable strict;
+
+-- Casts
+
+-- Bytea
+
+create function uuid_bytea_cast(uuid) returns bytea as
+'pduuid', 'uuid_cast_bytea'
+language C strict;
+
+create function uuid_bytea_uncast(bytea) returns uuid as
+'pduuid', 'uuid_cast_from_bytea'
+language C strict;
+
+create cast (uuid as bytea) with function uuid_bytea_cast(uuid);
+
+create cast (bytea as uuid) with function uuid_bytea_uncast(bytea);
+
+-- Numeric
+
+create function uuid_numeric_cast(uuid) returns numeric as
+'pduuid', 'uuid_cast_numeric'
+language C strict;
+
+create function uuid_numeric_uncast(numeric) returns uuid as
+'pduuid', 'uuid_cast_from_numeric'
+language C strict;
+
+create cast (uuid as numeric) with function uuid_numeric_cast(uuid);
+
+create cast (numeric as uuid) with function uuid_numeric_uncast(numeric);
+
+-- Bit and bit varying
+
+create function uuid_bit_cast(uuid) returns bit(128) as
+'pduuid', 'uuid_cast_bit'
+language C strict;
+
+create function uuid_bit_uncast(bit(128)) returns uuid as
+'pduuid', 'uuid_cast_from_bit'
+language C strict;
+
+create cast (uuid as bit(128)) with function uuid_bit_cast(uuid);
+
+create cast (uuid as bit varying) with function uuid_bit_cast(uuid);
+
+create cast (bit(128) as uuid) with function uuid_bit_uncast(bit(128));
+
+create cast (bit varying as uuid) with function uuid_bit_uncast(bit(128));
+
+-- Field extraction functions
+
+create function uuid_version(uuid) returns integer as
+'pduuid', 'uuid_extract_version'
+language C strict;
+
+create function uuid_macaddr(uuid) returns macaddr as
+'pduuid', 'uuid_extract_macaddr'
+language C strict;
+
+create function uuid_timestamp(uuid) returns timestamp as
+'pduuid', 'uuid_extract_timestamp'
+language C strict;
+
+create function uuid_timestamptz(uuid)
+returns timestamp with time zone as
+'pduuid', 'uuid_extract_timestamp'
+language C strict;
+
+-- TODO
+-- cast to timestamp / extract timestamp
+-- cast to macaddr / extract macaddr
+-- extract variant
+-- extract clock sequence
+
+-- Operation Strategy Number
+-- overlap 1
+-- contains 2
+-- contained 3
+-- equal 4
+
+CREATE OPERATOR CLASS gin__uuid_ops
+DEFAULT
+FOR TYPE _uuid USING gin
+AS
+ OPERATOR 1 pg_catalog.&& (anyarray, anyarray),
+ OPERATOR 2 pg_catalog.@> (anyarray, anyarray),
+ OPERATOR 3 pg_catalog.<@ (anyarray, anyarray),
+ OPERATOR 4 pg_catalog.= (anyarray, anyarray),
+ FUNCTION 1 uuid_cmp (uuid, uuid),
+ FUNCTION 2 ginarrayextract (anyarray, internal, internal),
+ FUNCTION 3 ginqueryarrayextract (anyarray, internal, int2, internal, internal, internal, internal),
+ FUNCTION 4 ginarrayconsistent (internal, int2, anyarray, int4, internal, internal, internal, internal),
+ STORAGE uuid
+;