mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-06 05:51:21 +08:00
321 lines
10 KiB
SQL
321 lines
10 KiB
SQL
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
|
\echo Use "CREATE EXTENSION vector" to load this file. \quit
|
|
|
|
-- vector 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,
|
|
STORAGE = external
|
|
);
|
|
|
|
-- vector 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 l1_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;
|
|
|
|
CREATE FUNCTION vector_mul(vector, vector) RETURNS vector
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION quantize_binary(vector) RETURNS bit
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
-- vector 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;
|
|
|
|
CREATE FUNCTION vector_accum(double precision[], vector) RETURNS double precision[]
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION vector_avg(double precision[]) RETURNS vector
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION vector_combine(double precision[], double precision[]) RETURNS double precision[]
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
-- vector aggregates
|
|
|
|
CREATE AGGREGATE avg(vector) (
|
|
SFUNC = vector_accum,
|
|
STYPE = double precision[],
|
|
FINALFUNC = vector_avg,
|
|
COMBINEFUNC = vector_combine,
|
|
INITCOND = '{0}',
|
|
PARALLEL = SAFE
|
|
);
|
|
|
|
CREATE AGGREGATE sum(vector) (
|
|
SFUNC = vector_add,
|
|
STYPE = vector,
|
|
COMBINEFUNC = vector_add,
|
|
PARALLEL = SAFE
|
|
);
|
|
|
|
-- vector 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;
|
|
|
|
-- vector 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;
|
|
|
|
-- vector 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
|
|
);
|
|
|
|
CREATE OPERATOR * (
|
|
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_mul,
|
|
COMMUTATOR = *
|
|
);
|
|
|
|
CREATE OPERATOR < (
|
|
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_lt,
|
|
COMMUTATOR = > , NEGATOR = >= ,
|
|
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
|
|
);
|
|
|
|
CREATE OPERATOR <= (
|
|
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_le,
|
|
COMMUTATOR = >= , NEGATOR = > ,
|
|
RESTRICT = scalarlesel, JOIN = scalarlejoinsel
|
|
);
|
|
|
|
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
|
|
);
|
|
|
|
CREATE OPERATOR >= (
|
|
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_ge,
|
|
COMMUTATOR = <= , NEGATOR = < ,
|
|
RESTRICT = scalargesel, JOIN = scalargejoinsel
|
|
);
|
|
|
|
CREATE OPERATOR > (
|
|
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_gt,
|
|
COMMUTATOR = < , NEGATOR = <= ,
|
|
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
|
|
);
|
|
|
|
-- access methods
|
|
|
|
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';
|
|
|
|
CREATE FUNCTION hnswhandler(internal) RETURNS index_am_handler
|
|
AS 'MODULE_PATHNAME' LANGUAGE C;
|
|
|
|
CREATE ACCESS METHOD hnsw TYPE INDEX HANDLER hnswhandler;
|
|
|
|
COMMENT ON ACCESS METHOD hnsw IS 'hnsw index access method';
|
|
|
|
-- vector 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);
|
|
|
|
CREATE OPERATOR CLASS vector_l2_ops
|
|
FOR TYPE vector USING hnsw AS
|
|
OPERATOR 1 <-> (vector, vector) FOR ORDER BY float_ops,
|
|
FUNCTION 1 vector_l2_squared_distance(vector, vector);
|
|
|
|
CREATE OPERATOR CLASS vector_ip_ops
|
|
FOR TYPE vector USING hnsw AS
|
|
OPERATOR 1 <#> (vector, vector) FOR ORDER BY float_ops,
|
|
FUNCTION 1 vector_negative_inner_product(vector, vector);
|
|
|
|
CREATE OPERATOR CLASS vector_cosine_ops
|
|
FOR TYPE vector USING hnsw AS
|
|
OPERATOR 1 <=> (vector, vector) FOR ORDER BY float_ops,
|
|
FUNCTION 1 vector_negative_inner_product(vector, vector),
|
|
FUNCTION 2 vector_norm(vector);
|
|
|
|
-- bit functions
|
|
|
|
CREATE FUNCTION hamming_distance(bit, bit) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION jaccard_distance(bit, bit) RETURNS float8
|
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
|
|
|
CREATE OPERATOR <~> (
|
|
LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance,
|
|
COMMUTATOR = '<~>'
|
|
);
|
|
|
|
CREATE OPERATOR <%> (
|
|
LEFTARG = bit, RIGHTARG = bit, PROCEDURE = jaccard_distance,
|
|
COMMUTATOR = '<%>'
|
|
);
|
|
|
|
CREATE OPERATOR CLASS bit_hamming_ops
|
|
FOR TYPE bit USING hnsw AS
|
|
OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops,
|
|
FUNCTION 1 hamming_distance(bit, bit);
|
|
|
|
CREATE OPERATOR CLASS bit_jaccard_ops
|
|
FOR TYPE bit USING hnsw AS
|
|
OPERATOR 1 <%> (bit, bit) FOR ORDER BY float_ops,
|
|
FUNCTION 1 jaccard_distance(bit, bit);
|