diff --git a/.github/workflows/build-pgvector-embedded.yml b/.github/workflows/build-pgvector-embedded.yml index ad515911a..da70edea0 100644 --- a/.github/workflows/build-pgvector-embedded.yml +++ b/.github/workflows/build-pgvector-embedded.yml @@ -77,7 +77,14 @@ jobs: - uses: actions/upload-artifact@v4 with: name: pgvector-${{ matrix.platform }} - path: packages/pgvector-embedded/prebuilt/${{ matrix.platform }} + # The platform-specific library plus the shared control/SQL (vendored + # once at the prebuilt root). The least-common-ancestor is `prebuilt/`, + # so the artifact lays out as `/vector.*`, `vector.control`, + # `vector--*.sql`. + path: | + packages/pgvector-embedded/prebuilt/${{ matrix.platform }} + packages/pgvector-embedded/prebuilt/vector.control + packages/pgvector-embedded/prebuilt/vector--*.sql if-no-files-found: error open-pr: @@ -91,12 +98,17 @@ jobs: - name: Stage regenerated artifacts run: | + PREBUILT=packages/pgvector-embedded/prebuilt for dir in /tmp/pgvector-artifacts/pgvector-*; do platform="$(basename "$dir" | sed 's/^pgvector-//')" - dest="packages/pgvector-embedded/prebuilt/${platform}" + dest="$PREBUILT/${platform}" rm -rf "$dest" mkdir -p "$dest" - cp -R "$dir/." "$dest/" + # Platform-specific library lives under / in the artifact. + cp "$dir/$platform/"* "$dest/" + # Control + SQL are byte-identical across platforms — refresh the + # single shared copy at the prebuilt root (last writer wins). + cp "$dir"/vector.control "$dir"/vector--*.sql "$PREBUILT/" done - name: Open PR diff --git a/packages/pgvector-embedded/prebuilt/darwin-x64/vector--0.8.1.sql b/packages/pgvector-embedded/prebuilt/darwin-x64/vector--0.8.1.sql deleted file mode 100644 index 7fc36712b..000000000 --- a/packages/pgvector-embedded/prebuilt/darwin-x64/vector--0.8.1.sql +++ /dev/null @@ -1,918 +0,0 @@ --- 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 l2_normalize(vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(vector) RETURNS bit - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(vector, int, int) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- vector private functions - -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 vector_concat(vector, vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -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 = l1_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_concat -); - -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'; - --- access method private functions - -CREATE FUNCTION ivfflat_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION ivfflat_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_sparsevec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - --- 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); - -CREATE OPERATOR CLASS vector_l1_ops - FOR TYPE vector USING hnsw AS - OPERATOR 1 <+> (vector, vector) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(vector, vector); - --- halfvec type - -CREATE TYPE halfvec; - -CREATE FUNCTION halfvec_in(cstring, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_out(halfvec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_recv(internal, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_send(halfvec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE halfvec ( - INPUT = halfvec_in, - OUTPUT = halfvec_out, - TYPMOD_IN = halfvec_typmod_in, - RECEIVE = halfvec_recv, - SEND = halfvec_send, - STORAGE = external -); - --- halfvec functions - -CREATE FUNCTION l2_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_dims(halfvec) RETURNS integer - AS 'MODULE_PATHNAME', 'halfvec_vector_dims' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(halfvec) RETURNS bit - AS 'MODULE_PATHNAME', 'halfvec_binary_quantize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(halfvec, int, int) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_subvector' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec private functions - -CREATE FUNCTION halfvec_add(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_sub(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_mul(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_concat(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_lt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_le(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_eq(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ne(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ge(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_gt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_cmp(halfvec, halfvec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_l2_squared_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_negative_inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_spherical_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_accum(double precision[], halfvec) RETURNS double precision[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_avg(double precision[]) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_combine(double precision[], double precision[]) RETURNS double precision[] - AS 'MODULE_PATHNAME', 'vector_combine' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec aggregates - -CREATE AGGREGATE avg(halfvec) ( - SFUNC = halfvec_accum, - STYPE = double precision[], - FINALFUNC = halfvec_avg, - COMBINEFUNC = halfvec_combine, - INITCOND = '{0}', - PARALLEL = SAFE -); - -CREATE AGGREGATE sum(halfvec) ( - SFUNC = halfvec_add, - STYPE = halfvec, - COMBINEFUNC = halfvec_add, - PARALLEL = SAFE -); - --- halfvec cast functions - -CREATE FUNCTION halfvec(halfvec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_vector(halfvec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_halfvec(vector, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(integer[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(real[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(double precision[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(numeric[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_float4(halfvec, integer, boolean) RETURNS real[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec casts - -CREATE CAST (halfvec AS halfvec) - WITH FUNCTION halfvec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS vector) - WITH FUNCTION halfvec_to_vector(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS halfvec) - WITH FUNCTION vector_to_halfvec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS real[]) - WITH FUNCTION halfvec_to_float4(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (integer[] AS halfvec) - WITH FUNCTION array_to_halfvec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS halfvec) - WITH FUNCTION array_to_halfvec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS halfvec) - WITH FUNCTION array_to_halfvec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS halfvec) - WITH FUNCTION array_to_halfvec(numeric[], integer, boolean) AS ASSIGNMENT; - --- halfvec operators - -CREATE OPERATOR <-> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR + ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_add, - COMMUTATOR = + -); - -CREATE OPERATOR - ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_sub -); - -CREATE OPERATOR * ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_mul, - COMMUTATOR = * -); - -CREATE OPERATOR || ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_concat -); - -CREATE OPERATOR < ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- halfvec opclasses - -CREATE OPERATOR CLASS halfvec_ops - DEFAULT FOR TYPE halfvec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 halfvec_cmp(halfvec, halfvec); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 l2_distance(halfvec, halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l1_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <+> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - --- 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; - --- bit operators - -CREATE OPERATOR <~> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance, - COMMUTATOR = '<~>' -); - -CREATE OPERATOR <%> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = jaccard_distance, - COMMUTATOR = '<%>' -); - --- bit opclasses - -CREATE OPERATOR CLASS bit_hamming_ops - FOR TYPE bit USING ivfflat AS - OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops, - FUNCTION 1 hamming_distance(bit, bit), - FUNCTION 3 hamming_distance(bit, bit), - FUNCTION 5 ivfflat_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - ---- sparsevec type - -CREATE TYPE sparsevec; - -CREATE FUNCTION sparsevec_in(cstring, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_out(sparsevec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_recv(internal, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_send(sparsevec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE sparsevec ( - INPUT = sparsevec_in, - OUTPUT = sparsevec_out, - TYPMOD_IN = sparsevec_typmod_in, - RECEIVE = sparsevec_recv, - SEND = sparsevec_send, - STORAGE = external -); - --- sparsevec functions - -CREATE FUNCTION l2_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(sparsevec) RETURNS sparsevec - AS 'MODULE_PATHNAME', 'sparsevec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec private functions - -CREATE FUNCTION sparsevec_lt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_le(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_eq(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ne(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ge(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_gt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_cmp(sparsevec, sparsevec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_l2_squared_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_negative_inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec cast functions - -CREATE FUNCTION sparsevec(sparsevec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_sparsevec(vector, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(integer[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(real[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(double precision[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(numeric[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec casts - -CREATE CAST (sparsevec AS sparsevec) - WITH FUNCTION sparsevec(sparsevec, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS vector) - WITH FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS sparsevec) - WITH FUNCTION vector_to_sparsevec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS halfvec) - WITH FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (halfvec AS sparsevec) - WITH FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (integer[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(numeric[], integer, boolean) AS ASSIGNMENT; - --- sparsevec operators - -CREATE OPERATOR <-> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR < ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- sparsevec opclasses - -CREATE OPERATOR CLASS sparsevec_ops - DEFAULT FOR TYPE sparsevec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 sparsevec_cmp(sparsevec, sparsevec); - -CREATE OPERATOR CLASS sparsevec_l2_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <-> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_l2_squared_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_ip_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <#> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_cosine_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <=> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 2 l2_norm(sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_l1_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <+> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); diff --git a/packages/pgvector-embedded/prebuilt/darwin-x64/vector.control b/packages/pgvector-embedded/prebuilt/darwin-x64/vector.control deleted file mode 100644 index 2ad02286a..000000000 --- a/packages/pgvector-embedded/prebuilt/darwin-x64/vector.control +++ /dev/null @@ -1,4 +0,0 @@ -comment = 'vector data type and ivfflat and hnsw access methods' -default_version = '0.8.1' -module_pathname = '$libdir/vector' -relocatable = true diff --git a/packages/pgvector-embedded/prebuilt/linux-arm64/vector--0.8.1.sql b/packages/pgvector-embedded/prebuilt/linux-arm64/vector--0.8.1.sql deleted file mode 100644 index 7fc36712b..000000000 --- a/packages/pgvector-embedded/prebuilt/linux-arm64/vector--0.8.1.sql +++ /dev/null @@ -1,918 +0,0 @@ --- 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 l2_normalize(vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(vector) RETURNS bit - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(vector, int, int) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- vector private functions - -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 vector_concat(vector, vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -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 = l1_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_concat -); - -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'; - --- access method private functions - -CREATE FUNCTION ivfflat_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION ivfflat_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_sparsevec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - --- 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); - -CREATE OPERATOR CLASS vector_l1_ops - FOR TYPE vector USING hnsw AS - OPERATOR 1 <+> (vector, vector) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(vector, vector); - --- halfvec type - -CREATE TYPE halfvec; - -CREATE FUNCTION halfvec_in(cstring, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_out(halfvec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_recv(internal, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_send(halfvec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE halfvec ( - INPUT = halfvec_in, - OUTPUT = halfvec_out, - TYPMOD_IN = halfvec_typmod_in, - RECEIVE = halfvec_recv, - SEND = halfvec_send, - STORAGE = external -); - --- halfvec functions - -CREATE FUNCTION l2_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_dims(halfvec) RETURNS integer - AS 'MODULE_PATHNAME', 'halfvec_vector_dims' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(halfvec) RETURNS bit - AS 'MODULE_PATHNAME', 'halfvec_binary_quantize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(halfvec, int, int) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_subvector' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec private functions - -CREATE FUNCTION halfvec_add(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_sub(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_mul(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_concat(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_lt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_le(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_eq(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ne(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ge(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_gt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_cmp(halfvec, halfvec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_l2_squared_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_negative_inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_spherical_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_accum(double precision[], halfvec) RETURNS double precision[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_avg(double precision[]) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_combine(double precision[], double precision[]) RETURNS double precision[] - AS 'MODULE_PATHNAME', 'vector_combine' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec aggregates - -CREATE AGGREGATE avg(halfvec) ( - SFUNC = halfvec_accum, - STYPE = double precision[], - FINALFUNC = halfvec_avg, - COMBINEFUNC = halfvec_combine, - INITCOND = '{0}', - PARALLEL = SAFE -); - -CREATE AGGREGATE sum(halfvec) ( - SFUNC = halfvec_add, - STYPE = halfvec, - COMBINEFUNC = halfvec_add, - PARALLEL = SAFE -); - --- halfvec cast functions - -CREATE FUNCTION halfvec(halfvec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_vector(halfvec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_halfvec(vector, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(integer[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(real[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(double precision[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(numeric[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_float4(halfvec, integer, boolean) RETURNS real[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec casts - -CREATE CAST (halfvec AS halfvec) - WITH FUNCTION halfvec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS vector) - WITH FUNCTION halfvec_to_vector(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS halfvec) - WITH FUNCTION vector_to_halfvec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS real[]) - WITH FUNCTION halfvec_to_float4(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (integer[] AS halfvec) - WITH FUNCTION array_to_halfvec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS halfvec) - WITH FUNCTION array_to_halfvec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS halfvec) - WITH FUNCTION array_to_halfvec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS halfvec) - WITH FUNCTION array_to_halfvec(numeric[], integer, boolean) AS ASSIGNMENT; - --- halfvec operators - -CREATE OPERATOR <-> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR + ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_add, - COMMUTATOR = + -); - -CREATE OPERATOR - ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_sub -); - -CREATE OPERATOR * ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_mul, - COMMUTATOR = * -); - -CREATE OPERATOR || ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_concat -); - -CREATE OPERATOR < ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- halfvec opclasses - -CREATE OPERATOR CLASS halfvec_ops - DEFAULT FOR TYPE halfvec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 halfvec_cmp(halfvec, halfvec); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 l2_distance(halfvec, halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l1_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <+> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - --- 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; - --- bit operators - -CREATE OPERATOR <~> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance, - COMMUTATOR = '<~>' -); - -CREATE OPERATOR <%> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = jaccard_distance, - COMMUTATOR = '<%>' -); - --- bit opclasses - -CREATE OPERATOR CLASS bit_hamming_ops - FOR TYPE bit USING ivfflat AS - OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops, - FUNCTION 1 hamming_distance(bit, bit), - FUNCTION 3 hamming_distance(bit, bit), - FUNCTION 5 ivfflat_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - ---- sparsevec type - -CREATE TYPE sparsevec; - -CREATE FUNCTION sparsevec_in(cstring, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_out(sparsevec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_recv(internal, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_send(sparsevec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE sparsevec ( - INPUT = sparsevec_in, - OUTPUT = sparsevec_out, - TYPMOD_IN = sparsevec_typmod_in, - RECEIVE = sparsevec_recv, - SEND = sparsevec_send, - STORAGE = external -); - --- sparsevec functions - -CREATE FUNCTION l2_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(sparsevec) RETURNS sparsevec - AS 'MODULE_PATHNAME', 'sparsevec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec private functions - -CREATE FUNCTION sparsevec_lt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_le(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_eq(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ne(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ge(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_gt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_cmp(sparsevec, sparsevec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_l2_squared_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_negative_inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec cast functions - -CREATE FUNCTION sparsevec(sparsevec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_sparsevec(vector, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(integer[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(real[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(double precision[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(numeric[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec casts - -CREATE CAST (sparsevec AS sparsevec) - WITH FUNCTION sparsevec(sparsevec, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS vector) - WITH FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS sparsevec) - WITH FUNCTION vector_to_sparsevec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS halfvec) - WITH FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (halfvec AS sparsevec) - WITH FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (integer[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(numeric[], integer, boolean) AS ASSIGNMENT; - --- sparsevec operators - -CREATE OPERATOR <-> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR < ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- sparsevec opclasses - -CREATE OPERATOR CLASS sparsevec_ops - DEFAULT FOR TYPE sparsevec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 sparsevec_cmp(sparsevec, sparsevec); - -CREATE OPERATOR CLASS sparsevec_l2_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <-> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_l2_squared_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_ip_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <#> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_cosine_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <=> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 2 l2_norm(sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_l1_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <+> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); diff --git a/packages/pgvector-embedded/prebuilt/linux-arm64/vector.control b/packages/pgvector-embedded/prebuilt/linux-arm64/vector.control deleted file mode 100644 index 2ad02286a..000000000 --- a/packages/pgvector-embedded/prebuilt/linux-arm64/vector.control +++ /dev/null @@ -1,4 +0,0 @@ -comment = 'vector data type and ivfflat and hnsw access methods' -default_version = '0.8.1' -module_pathname = '$libdir/vector' -relocatable = true diff --git a/packages/pgvector-embedded/prebuilt/linux-x64/vector--0.8.1.sql b/packages/pgvector-embedded/prebuilt/linux-x64/vector--0.8.1.sql deleted file mode 100644 index 7fc36712b..000000000 --- a/packages/pgvector-embedded/prebuilt/linux-x64/vector--0.8.1.sql +++ /dev/null @@ -1,918 +0,0 @@ --- 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 l2_normalize(vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(vector) RETURNS bit - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(vector, int, int) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- vector private functions - -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 vector_concat(vector, vector) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -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 = l1_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_concat -); - -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'; - --- access method private functions - -CREATE FUNCTION ivfflat_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION ivfflat_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_halfvec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_bit_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - -CREATE FUNCTION hnsw_sparsevec_support(internal) RETURNS internal - AS 'MODULE_PATHNAME' LANGUAGE C; - --- 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); - -CREATE OPERATOR CLASS vector_l1_ops - FOR TYPE vector USING hnsw AS - OPERATOR 1 <+> (vector, vector) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(vector, vector); - --- halfvec type - -CREATE TYPE halfvec; - -CREATE FUNCTION halfvec_in(cstring, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_out(halfvec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_recv(internal, oid, integer) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_send(halfvec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE halfvec ( - INPUT = halfvec_in, - OUTPUT = halfvec_out, - TYPMOD_IN = halfvec_typmod_in, - RECEIVE = halfvec_recv, - SEND = halfvec_send, - STORAGE = external -); - --- halfvec functions - -CREATE FUNCTION l2_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_dims(halfvec) RETURNS integer - AS 'MODULE_PATHNAME', 'halfvec_vector_dims' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(halfvec) RETURNS float8 - AS 'MODULE_PATHNAME', 'halfvec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION binary_quantize(halfvec) RETURNS bit - AS 'MODULE_PATHNAME', 'halfvec_binary_quantize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION subvector(halfvec, int, int) RETURNS halfvec - AS 'MODULE_PATHNAME', 'halfvec_subvector' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec private functions - -CREATE FUNCTION halfvec_add(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_sub(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_mul(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_concat(halfvec, halfvec) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_lt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_le(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_eq(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ne(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_ge(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_gt(halfvec, halfvec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_cmp(halfvec, halfvec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_l2_squared_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_negative_inner_product(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_spherical_distance(halfvec, halfvec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_accum(double precision[], halfvec) RETURNS double precision[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_avg(double precision[]) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_combine(double precision[], double precision[]) RETURNS double precision[] - AS 'MODULE_PATHNAME', 'vector_combine' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec aggregates - -CREATE AGGREGATE avg(halfvec) ( - SFUNC = halfvec_accum, - STYPE = double precision[], - FINALFUNC = halfvec_avg, - COMBINEFUNC = halfvec_combine, - INITCOND = '{0}', - PARALLEL = SAFE -); - -CREATE AGGREGATE sum(halfvec) ( - SFUNC = halfvec_add, - STYPE = halfvec, - COMBINEFUNC = halfvec_add, - PARALLEL = SAFE -); - --- halfvec cast functions - -CREATE FUNCTION halfvec(halfvec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_vector(halfvec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_halfvec(vector, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(integer[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(real[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(double precision[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_halfvec(numeric[], integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_float4(halfvec, integer, boolean) RETURNS real[] - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- halfvec casts - -CREATE CAST (halfvec AS halfvec) - WITH FUNCTION halfvec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS vector) - WITH FUNCTION halfvec_to_vector(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS halfvec) - WITH FUNCTION vector_to_halfvec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (halfvec AS real[]) - WITH FUNCTION halfvec_to_float4(halfvec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (integer[] AS halfvec) - WITH FUNCTION array_to_halfvec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS halfvec) - WITH FUNCTION array_to_halfvec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS halfvec) - WITH FUNCTION array_to_halfvec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS halfvec) - WITH FUNCTION array_to_halfvec(numeric[], integer, boolean) AS ASSIGNMENT; - --- halfvec operators - -CREATE OPERATOR <-> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR + ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_add, - COMMUTATOR = + -); - -CREATE OPERATOR - ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_sub -); - -CREATE OPERATOR * ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_mul, - COMMUTATOR = * -); - -CREATE OPERATOR || ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_concat -); - -CREATE OPERATOR < ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = halfvec, RIGHTARG = halfvec, PROCEDURE = halfvec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- halfvec opclasses - -CREATE OPERATOR CLASS halfvec_ops - DEFAULT FOR TYPE halfvec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 halfvec_cmp(halfvec, halfvec); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 l2_distance(halfvec, halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING ivfflat AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 halfvec_spherical_distance(halfvec, halfvec), - FUNCTION 4 l2_norm(halfvec), - FUNCTION 5 ivfflat_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l2_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <-> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_l2_squared_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_ip_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <#> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_cosine_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <=> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 halfvec_negative_inner_product(halfvec, halfvec), - FUNCTION 2 l2_norm(halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - -CREATE OPERATOR CLASS halfvec_l1_ops - FOR TYPE halfvec USING hnsw AS - OPERATOR 1 <+> (halfvec, halfvec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(halfvec, halfvec), - FUNCTION 3 hnsw_halfvec_support(internal); - --- 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; - --- bit operators - -CREATE OPERATOR <~> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = hamming_distance, - COMMUTATOR = '<~>' -); - -CREATE OPERATOR <%> ( - LEFTARG = bit, RIGHTARG = bit, PROCEDURE = jaccard_distance, - COMMUTATOR = '<%>' -); - --- bit opclasses - -CREATE OPERATOR CLASS bit_hamming_ops - FOR TYPE bit USING ivfflat AS - OPERATOR 1 <~> (bit, bit) FOR ORDER BY float_ops, - FUNCTION 1 hamming_distance(bit, bit), - FUNCTION 3 hamming_distance(bit, bit), - FUNCTION 5 ivfflat_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - -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), - FUNCTION 3 hnsw_bit_support(internal); - ---- sparsevec type - -CREATE TYPE sparsevec; - -CREATE FUNCTION sparsevec_in(cstring, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_out(sparsevec) RETURNS cstring - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_typmod_in(cstring[]) RETURNS integer - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_recv(internal, oid, integer) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_send(sparsevec) RETURNS bytea - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE TYPE sparsevec ( - INPUT = sparsevec_in, - OUTPUT = sparsevec_out, - TYPMOD_IN = sparsevec_typmod_in, - RECEIVE = sparsevec_recv, - SEND = sparsevec_send, - STORAGE = external -); - --- sparsevec functions - -CREATE FUNCTION l2_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_inner_product' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION cosine_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_cosine_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l1_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_norm(sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME', 'sparsevec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION l2_normalize(sparsevec) RETURNS sparsevec - AS 'MODULE_PATHNAME', 'sparsevec_l2_normalize' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec private functions - -CREATE FUNCTION sparsevec_lt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_le(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_eq(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ne(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_ge(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_gt(sparsevec, sparsevec) RETURNS bool - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_cmp(sparsevec, sparsevec) RETURNS int4 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_l2_squared_distance(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_negative_inner_product(sparsevec, sparsevec) RETURNS float8 - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec cast functions - -CREATE FUNCTION sparsevec(sparsevec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION vector_to_sparsevec(vector, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) RETURNS vector - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) RETURNS halfvec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(integer[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(real[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(double precision[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - -CREATE FUNCTION array_to_sparsevec(numeric[], integer, boolean) RETURNS sparsevec - AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; - --- sparsevec casts - -CREATE CAST (sparsevec AS sparsevec) - WITH FUNCTION sparsevec(sparsevec, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS vector) - WITH FUNCTION sparsevec_to_vector(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (vector AS sparsevec) - WITH FUNCTION vector_to_sparsevec(vector, integer, boolean) AS IMPLICIT; - -CREATE CAST (sparsevec AS halfvec) - WITH FUNCTION sparsevec_to_halfvec(sparsevec, integer, boolean) AS ASSIGNMENT; - -CREATE CAST (halfvec AS sparsevec) - WITH FUNCTION halfvec_to_sparsevec(halfvec, integer, boolean) AS IMPLICIT; - -CREATE CAST (integer[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(integer[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (real[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(real[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (double precision[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(double precision[], integer, boolean) AS ASSIGNMENT; - -CREATE CAST (numeric[] AS sparsevec) - WITH FUNCTION array_to_sparsevec(numeric[], integer, boolean) AS ASSIGNMENT; - --- sparsevec operators - -CREATE OPERATOR <-> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l2_distance, - COMMUTATOR = '<->' -); - -CREATE OPERATOR <#> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_negative_inner_product, - COMMUTATOR = '<#>' -); - -CREATE OPERATOR <=> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = cosine_distance, - COMMUTATOR = '<=>' -); - -CREATE OPERATOR <+> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = l1_distance, - COMMUTATOR = '<+>' -); - -CREATE OPERATOR < ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_lt, - COMMUTATOR = > , NEGATOR = >= , - RESTRICT = scalarltsel, JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_le, - COMMUTATOR = >= , NEGATOR = > , - RESTRICT = scalarlesel, JOIN = scalarlejoinsel -); - -CREATE OPERATOR = ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_eq, - COMMUTATOR = = , NEGATOR = <> , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ne, - COMMUTATOR = <> , NEGATOR = = , - RESTRICT = eqsel, JOIN = eqjoinsel -); - -CREATE OPERATOR >= ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_ge, - COMMUTATOR = <= , NEGATOR = < , - RESTRICT = scalargesel, JOIN = scalargejoinsel -); - -CREATE OPERATOR > ( - LEFTARG = sparsevec, RIGHTARG = sparsevec, PROCEDURE = sparsevec_gt, - COMMUTATOR = < , NEGATOR = <= , - RESTRICT = scalargtsel, JOIN = scalargtjoinsel -); - --- sparsevec opclasses - -CREATE OPERATOR CLASS sparsevec_ops - DEFAULT FOR TYPE sparsevec USING btree AS - OPERATOR 1 < , - OPERATOR 2 <= , - OPERATOR 3 = , - OPERATOR 4 >= , - OPERATOR 5 > , - FUNCTION 1 sparsevec_cmp(sparsevec, sparsevec); - -CREATE OPERATOR CLASS sparsevec_l2_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <-> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_l2_squared_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_ip_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <#> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_cosine_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <=> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 sparsevec_negative_inner_product(sparsevec, sparsevec), - FUNCTION 2 l2_norm(sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); - -CREATE OPERATOR CLASS sparsevec_l1_ops - FOR TYPE sparsevec USING hnsw AS - OPERATOR 1 <+> (sparsevec, sparsevec) FOR ORDER BY float_ops, - FUNCTION 1 l1_distance(sparsevec, sparsevec), - FUNCTION 3 hnsw_sparsevec_support(internal); diff --git a/packages/pgvector-embedded/prebuilt/linux-x64/vector.control b/packages/pgvector-embedded/prebuilt/linux-x64/vector.control deleted file mode 100644 index 2ad02286a..000000000 --- a/packages/pgvector-embedded/prebuilt/linux-x64/vector.control +++ /dev/null @@ -1,4 +0,0 @@ -comment = 'vector data type and ivfflat and hnsw access methods' -default_version = '0.8.1' -module_pathname = '$libdir/vector' -relocatable = true diff --git a/packages/pgvector-embedded/prebuilt/darwin-arm64/vector--0.8.1.sql b/packages/pgvector-embedded/prebuilt/vector--0.8.1.sql similarity index 100% rename from packages/pgvector-embedded/prebuilt/darwin-arm64/vector--0.8.1.sql rename to packages/pgvector-embedded/prebuilt/vector--0.8.1.sql diff --git a/packages/pgvector-embedded/prebuilt/darwin-arm64/vector.control b/packages/pgvector-embedded/prebuilt/vector.control similarity index 100% rename from packages/pgvector-embedded/prebuilt/darwin-arm64/vector.control rename to packages/pgvector-embedded/prebuilt/vector.control diff --git a/packages/pgvector-embedded/scripts/build.sh b/packages/pgvector-embedded/scripts/build.sh index b94ca7637..48440f6c3 100755 --- a/packages/pgvector-embedded/scripts/build.sh +++ b/packages/pgvector-embedded/scripts/build.sh @@ -48,15 +48,17 @@ git clone --depth 1 --branch "${PGVECTOR_VERSION}" https://github.com/pgvector/p make -C "${WORK}/pgvector" PG_CONFIG="${PG_CONFIG}" OPTFLAGS="" PKGLIBDIR="$(${PG_CONFIG} --pkglibdir)" +SHARED_DIR="${PKG_ROOT}/prebuilt" rm -rf "${OUT_DIR}" -mkdir -p "${OUT_DIR}" +mkdir -p "${OUT_DIR}" "${SHARED_DIR}" # Stage straight from the build dir — we run `make` but not `make install`, so # nothing lands in the OS Postgres's pkglibdir/sharedir. The library, control # file, and generated SQL all sit under the cloned/built pgvector tree. # -# Compiled extension library — name differs per platform ($(DLSUFFIX)). +# Compiled extension library is the only PLATFORM-SPECIFIC artifact → goes in +# prebuilt// (name differs per platform via $(DLSUFFIX)). cp "${WORK}/pgvector/vector"*.so "${OUT_DIR}/" 2>/dev/null || true cp "${WORK}/pgvector/vector"*.dylib "${OUT_DIR}/" 2>/dev/null || true # Fall back to an installed copy only if the build dir somehow lacks the lib. @@ -64,14 +66,16 @@ if ! ls "${OUT_DIR}"/vector.* >/dev/null 2>&1; then cp "${PKGLIBDIR}/vector".* "${OUT_DIR}/" fi -# Control + the full-install SQL for the pinned version only. CREATE EXTENSION -# at default_version reads vector--.sql directly; the vector--A--B.sql -# upgrade scripts are only for ALTER EXTENSION ... UPDATE, which never runs on a -# fresh embedded DB, so we don't ship them. `vector.control` is checked into the -# repo; `sql/vector--.sql` is generated by `make`. +# Control + the full-install SQL for the pinned version are byte-identical +# across platforms, so they're vendored ONCE at the prebuilt root (not per +# platform). CREATE EXTENSION at default_version reads vector--.sql +# directly; the vector--A--B.sql upgrade scripts only run on ALTER EXTENSION +# UPDATE, never on a fresh embedded DB, so we don't ship them. PGVECTOR_SQL_VERSION="${PGVECTOR_VERSION#v}" -cp "${WORK}/pgvector/vector.control" "${OUT_DIR}/" -cp "${WORK}/pgvector/sql/vector--${PGVECTOR_SQL_VERSION}.sql" "${OUT_DIR}/" +cp "${WORK}/pgvector/vector.control" "${SHARED_DIR}/" +cp "${WORK}/pgvector/sql/vector--${PGVECTOR_SQL_VERSION}.sql" "${SHARED_DIR}/" -echo "==> staged $(ls "${OUT_DIR}" | wc -l | tr -d ' ') files in ${OUT_DIR}" +echo "==> staged $(ls "${OUT_DIR}" | wc -l | tr -d ' ') platform file(s) in ${OUT_DIR}" ls -1 "${OUT_DIR}" | sed 's/^/ /' +echo "==> staged shared control + SQL in ${SHARED_DIR}" +ls -1 "${SHARED_DIR}"/vector.control "${SHARED_DIR}"/vector--*.sql | sed 's/^/ /' diff --git a/packages/pgvector-embedded/src/index.ts b/packages/pgvector-embedded/src/index.ts index 0f6bd0dc2..08d06bcc5 100644 --- a/packages/pgvector-embedded/src/index.ts +++ b/packages/pgvector-embedded/src/index.ts @@ -2,11 +2,15 @@ * @lobu/pgvector-embedded * * `embedded-postgres` ships vanilla PostgreSQL binaries with no pgvector. This - * package carries small prebuilt pgvector artifacts (the compiled extension - * library + its `.control` / `.sql` files) for each platform `embedded-postgres` - * supports, and injects the host platform's artifact into the live - * `@embedded-postgres//native` tree so `CREATE EXTENSION vector` - * resolves at runtime. + * package carries small prebuilt pgvector artifacts and injects the host + * platform's into the live `@embedded-postgres//native` tree so + * `CREATE EXTENSION vector` resolves at runtime. + * + * Layout: the compiled library is platform-specific (`prebuilt// + * vector.{so,dylib}`); `vector.control` + `vector--.sql` are + * byte-identical across platforms, so they're vendored ONCE at the prebuilt + * root (`prebuilt/vector.control`, `prebuilt/vector--.sql`) rather + * than copied into each platform dir. * * Artifacts are built by `scripts/build.sh` (one platform per CI matrix cell) * against a same-major PostgreSQL — the extension ABI is stable within a major, @@ -26,14 +30,27 @@ export function currentPlatformKey(): string { return `${process.platform}-${process.arch}`; } -/** Directory holding the prebuilt pgvector files for a platform. */ +/** Directory holding the platform-specific prebuilt pgvector library. */ export function prebuiltDir(platform: string = currentPlatformKey()): string { return join(PREBUILT_ROOT, platform); } +/** True if the platform library file (vector.so / vector.dylib) is present. */ +function hasPrebuiltLibrary(platform: string): boolean { + const dir = prebuiltDir(platform); + if (!existsSync(dir)) return false; + return readdirSync(dir).some( + (f) => f.startsWith("vector") && (f.endsWith(".so") || f.endsWith(".dylib")) + ); +} + /** Whether a usable prebuilt pgvector artifact exists for the platform. */ export function hasPrebuilt(platform: string = currentPlatformKey()): boolean { - return existsSync(join(prebuiltDir(platform), "vector.control")); + // Platform-specific library + the shared control file (vendored once at root). + return ( + hasPrebuiltLibrary(platform) && + existsSync(join(PREBUILT_ROOT, "vector.control")) + ); } /** @@ -83,16 +100,25 @@ export function injectPgvector( ); } - const src = prebuiltDir(platform); mkdirSync(libDst, { recursive: true }); mkdirSync(extDst, { recursive: true }); - for (const file of readdirSync(src)) { - if (!file.startsWith("vector")) continue; - // The compiled library (vector.so / vector.dylib) goes to lib/postgresql; - // the control + version SQL files go to share/postgresql/extension. - const dest = - file.endsWith(".so") || file.endsWith(".dylib") ? libDst : extDst; - cpSync(join(src, file), join(dest, file)); + // Platform-specific compiled library → lib/postgresql. + const binDir = prebuiltDir(platform); + for (const file of readdirSync(binDir)) { + if (file.endsWith(".so") || file.endsWith(".dylib")) { + cpSync(join(binDir, file), join(libDst, file)); + } + } + + // Shared control + version SQL (vendored once at the prebuilt root) → + // share/postgresql/extension. + for (const file of readdirSync(PREBUILT_ROOT)) { + if ( + file === "vector.control" || + (file.startsWith("vector--") && file.endsWith(".sql")) + ) { + cpSync(join(PREBUILT_ROOT, file), join(extDst, file)); + } } }