-- complain if script is sourced in psql, rather than via CREATE EXTENSION \echo Use "CREATE EXTENSION vector" to load this file. \quit -- type CREATE TYPE vector; CREATE FUNCTION vector_in(cstring, oid, integer) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_out(vector) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_typmod_in(cstring[]) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_recv(internal, oid, integer) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_send(vector) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE TYPE vector ( INPUT = vector_in, OUTPUT = vector_out, TYPMOD_IN = vector_typmod_in, RECEIVE = vector_recv, SEND = vector_send ); -- functions CREATE FUNCTION l2_distance(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION inner_product(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION cosine_distance(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_dims(vector) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_norm(vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_add(vector, vector) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_sub(vector, vector) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; -- private functions CREATE FUNCTION vector_lt(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_le(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_eq(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_ne(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_ge(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_gt(vector, vector) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_cmp(vector, vector) RETURNS int4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_l2_squared_distance(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_negative_inner_product(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_spherical_distance(vector, vector) RETURNS float8 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; -- cast functions CREATE FUNCTION vector(vector, integer, boolean) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION array_to_vector(integer[], integer, boolean) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION array_to_vector(real[], integer, boolean) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION array_to_vector(double precision[], integer, boolean) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION array_to_vector(numeric[], integer, boolean) RETURNS vector AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE FUNCTION vector_to_float4(vector, integer, boolean) RETURNS real[] AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; -- casts CREATE CAST (vector AS vector) WITH FUNCTION vector(vector, integer, boolean) AS IMPLICIT; CREATE CAST (vector AS real[]) WITH FUNCTION vector_to_float4(vector, integer, boolean) AS IMPLICIT; CREATE CAST (integer[] AS vector) WITH FUNCTION array_to_vector(integer[], integer, boolean) AS ASSIGNMENT; CREATE CAST (real[] AS vector) WITH FUNCTION array_to_vector(real[], integer, boolean) AS ASSIGNMENT; CREATE CAST (double precision[] AS vector) WITH FUNCTION array_to_vector(double precision[], integer, boolean) AS ASSIGNMENT; CREATE CAST (numeric[] AS vector) WITH FUNCTION array_to_vector(numeric[], integer, boolean) AS ASSIGNMENT; -- operators CREATE OPERATOR <-> ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = l2_distance, COMMUTATOR = '<->' ); CREATE OPERATOR <#> ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_negative_inner_product, COMMUTATOR = '<#>' ); CREATE OPERATOR <=> ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = cosine_distance, COMMUTATOR = '<=>' ); CREATE OPERATOR + ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_add, COMMUTATOR = + ); CREATE OPERATOR - ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_sub, COMMUTATOR = - ); CREATE OPERATOR < ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_lt, COMMUTATOR = > , NEGATOR = >= , RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); -- should use scalarlesel and scalarlejoinsel, but not supported in Postgres < 11 CREATE OPERATOR <= ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_le, COMMUTATOR = >= , NEGATOR = > , RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR = ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_eq, COMMUTATOR = = , NEGATOR = <> , RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_ne, COMMUTATOR = <> , NEGATOR = = , RESTRICT = eqsel, JOIN = eqjoinsel ); -- should use scalargesel and scalargejoinsel, but not supported in Postgres < 11 CREATE OPERATOR >= ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_ge, COMMUTATOR = <= , NEGATOR = < , RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_gt, COMMUTATOR = < , NEGATOR = <= , RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); -- access method CREATE FUNCTION ivfflathandler(internal) RETURNS index_am_handler AS 'MODULE_PATHNAME' LANGUAGE C; CREATE ACCESS METHOD ivfflat TYPE INDEX HANDLER ivfflathandler; COMMENT ON ACCESS METHOD ivfflat IS 'ivfflat index access method'; -- opclasses CREATE OPERATOR CLASS vector_ops DEFAULT FOR TYPE vector USING btree AS OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 vector_cmp(vector, vector); CREATE OPERATOR CLASS vector_l2_ops DEFAULT FOR TYPE vector USING ivfflat AS OPERATOR 1 <-> (vector, vector) FOR ORDER BY float_ops, FUNCTION 1 vector_l2_squared_distance(vector, vector), FUNCTION 3 l2_distance(vector, vector); CREATE OPERATOR CLASS vector_ip_ops FOR TYPE vector USING ivfflat AS OPERATOR 1 <#> (vector, vector) FOR ORDER BY float_ops, FUNCTION 1 vector_negative_inner_product(vector, vector), FUNCTION 3 vector_spherical_distance(vector, vector), FUNCTION 4 vector_norm(vector); CREATE OPERATOR CLASS vector_cosine_ops FOR TYPE vector USING ivfflat AS OPERATOR 1 <=> (vector, vector) FOR ORDER BY float_ops, FUNCTION 1 vector_negative_inner_product(vector, vector), FUNCTION 2 vector_norm(vector), FUNCTION 3 vector_spherical_distance(vector, vector), FUNCTION 4 vector_norm(vector);