mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-23 04:20:56 +08:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c675198b3 | ||
|
|
d49d053e84 | ||
|
|
31e41b3ba9 | ||
|
|
903a925662 | ||
|
|
96ff19be44 | ||
|
|
6c969bebad |
@@ -1,15 +1,15 @@
|
|||||||
## 0.7.0 (unreleased)
|
## 0.7.0 (unreleased)
|
||||||
|
|
||||||
- Added concatenate operator for vectors
|
- Added `subvector` function
|
||||||
|
|
||||||
## 0.6.2 (unreleased)
|
## 0.6.2 (2024-03-18)
|
||||||
|
|
||||||
- Reduced lock contention with parallel HNSW index builds
|
- Reduced lock contention with parallel HNSW index builds
|
||||||
|
|
||||||
## 0.6.1 (2024-03-04)
|
## 0.6.1 (2024-03-04)
|
||||||
|
|
||||||
- Fixed error with `ANALYZE` and vectors with different dimensions
|
- Fixed error with `ANALYZE` and vectors with different dimensions
|
||||||
- Fixed error with `shared_preload_libraries`
|
- Fixed segmentation fault with `shared_preload_libraries`
|
||||||
- Fixed vector subtraction being marked as commutative
|
- Fixed vector subtraction being marked as commutative
|
||||||
|
|
||||||
## 0.6.0 (2024-01-29)
|
## 0.6.0 (2024-01-29)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "vector",
|
"name": "vector",
|
||||||
"abstract": "Open-source vector similarity search for Postgres",
|
"abstract": "Open-source vector similarity search for Postgres",
|
||||||
"description": "Supports L2 distance, inner product, and cosine distance",
|
"description": "Supports L2 distance, inner product, and cosine distance",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"maintainer": [
|
"maintainer": [
|
||||||
"Andrew Kane <andrew@ankane.org>"
|
"Andrew Kane <andrew@ankane.org>"
|
||||||
],
|
],
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"vector": {
|
"vector": {
|
||||||
"file": "sql/vector.sql",
|
"file": "sql/vector.sql",
|
||||||
"docfile": "README.md",
|
"docfile": "README.md",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"abstract": "Open-source vector similarity search for Postgres"
|
"abstract": "Open-source vector similarity search for Postgres"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
|||||||
EXTENSION = vector
|
EXTENSION = vector
|
||||||
EXTVERSION = 0.6.1
|
EXTVERSION = 0.6.2
|
||||||
|
|
||||||
MODULE_big = vector
|
MODULE_big = vector
|
||||||
DATA = $(wildcard sql/*--*.sql)
|
DATA = $(wildcard sql/*--*.sql)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
EXTENSION = vector
|
EXTENSION = vector
|
||||||
EXTVERSION = 0.6.1
|
EXTVERSION = 0.6.2
|
||||||
|
|
||||||
OBJS = src\hnsw.obj src\hnswbuild.obj src\hnswinsert.obj src\hnswscan.obj src\hnswutils.obj src\hnswvacuum.obj src\ivfbuild.obj src\ivfflat.obj src\ivfinsert.obj src\ivfkmeans.obj src\ivfscan.obj src\ivfutils.obj src\ivfvacuum.obj src\vector.obj
|
OBJS = src\hnsw.obj src\hnswbuild.obj src\hnswinsert.obj src\hnswscan.obj src\hnswutils.obj src\hnswvacuum.obj src\ivfbuild.obj src\ivfflat.obj src\ivfinsert.obj src\ivfkmeans.obj src\ivfscan.obj src\ivfutils.obj src\ivfvacuum.obj src\vector.obj
|
||||||
HEADERS = src\vector.h
|
HEADERS = src\vector.h
|
||||||
|
|||||||
20
README.md
20
README.md
@@ -20,7 +20,7 @@ Compile and install the extension (supports Postgres 12+)
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd /tmp
|
cd /tmp
|
||||||
git clone --branch v0.6.1 https://github.com/pgvector/pgvector.git
|
git clone --branch v0.6.2 https://github.com/pgvector/pgvector.git
|
||||||
cd pgvector
|
cd pgvector
|
||||||
make
|
make
|
||||||
make install # may need sudo
|
make install # may need sudo
|
||||||
@@ -45,7 +45,7 @@ Then use `nmake` to build:
|
|||||||
```cmd
|
```cmd
|
||||||
set "PGROOT=C:\Program Files\PostgreSQL\16"
|
set "PGROOT=C:\Program Files\PostgreSQL\16"
|
||||||
cd %TEMP%
|
cd %TEMP%
|
||||||
git clone --branch v0.6.1 https://github.com/pgvector/pgvector.git
|
git clone --branch v0.6.2 https://github.com/pgvector/pgvector.git
|
||||||
cd pgvector
|
cd pgvector
|
||||||
nmake /F Makefile.win
|
nmake /F Makefile.win
|
||||||
nmake /F Makefile.win install
|
nmake /F Makefile.win install
|
||||||
@@ -604,6 +604,18 @@ and query with:
|
|||||||
SELECT * FROM items ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;
|
SELECT * FROM items ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Are binary vectors supported?
|
||||||
|
|
||||||
|
You can store binary vectors and perform exact nearest neighbor search by Hamming distance in Postgres without an extension ([example](https://github.com/pgvector/pgvector-python/blob/master/examples/hash_image_search.py)).
|
||||||
|
|
||||||
|
```tsql
|
||||||
|
CREATE TABLE items (id bigserial PRIMARY KEY, embedding bit(3));
|
||||||
|
INSERT INTO items (embedding) VALUES (B'000'), (B'111');
|
||||||
|
SELECT * FROM items ORDER BY bit_count(embedding # B'101') LIMIT 5;
|
||||||
|
```
|
||||||
|
|
||||||
|
Indexing is not currently supported.
|
||||||
|
|
||||||
#### Do indexes need to fit into memory?
|
#### Do indexes need to fit into memory?
|
||||||
|
|
||||||
No, but like other index types, you’ll likely see better performance if they do. You can get the size of an index with:
|
No, but like other index types, you’ll likely see better performance if they do. You can get the size of an index with:
|
||||||
@@ -682,7 +694,6 @@ Operator | Description | Added
|
|||||||
\+ | element-wise addition |
|
\+ | element-wise addition |
|
||||||
\- | element-wise subtraction |
|
\- | element-wise subtraction |
|
||||||
\* | element-wise multiplication | 0.5.0
|
\* | element-wise multiplication | 0.5.0
|
||||||
\|\| | concatenate | 0.7.0
|
|
||||||
<-> | Euclidean distance |
|
<-> | Euclidean distance |
|
||||||
<#> | negative inner product |
|
<#> | negative inner product |
|
||||||
<=> | cosine distance |
|
<=> | cosine distance |
|
||||||
@@ -695,6 +706,7 @@ cosine_distance(vector, vector) → double precision | cosine distance |
|
|||||||
inner_product(vector, vector) → double precision | inner product |
|
inner_product(vector, vector) → double precision | inner product |
|
||||||
l2_distance(vector, vector) → double precision | Euclidean distance |
|
l2_distance(vector, vector) → double precision | Euclidean distance |
|
||||||
l1_distance(vector, vector) → double precision | taxicab distance | 0.5.0
|
l1_distance(vector, vector) → double precision | taxicab distance | 0.5.0
|
||||||
|
subvector(vector, integer, integer) → vector | subvector | 0.7.0 [unreleased]
|
||||||
vector_dims(vector) → integer | number of dimensions |
|
vector_dims(vector) → integer | number of dimensions |
|
||||||
vector_norm(vector) → double precision | Euclidean norm |
|
vector_norm(vector) → double precision | Euclidean norm |
|
||||||
|
|
||||||
@@ -780,7 +792,7 @@ This adds pgvector to the [Postgres image](https://hub.docker.com/_/postgres) (r
|
|||||||
You can also build the image manually:
|
You can also build the image manually:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone --branch v0.6.1 https://github.com/pgvector/pgvector.git
|
git clone --branch v0.6.2 https://github.com/pgvector/pgvector.git
|
||||||
cd pgvector
|
cd pgvector
|
||||||
docker build --build-arg PG_MAJOR=16 -t myuser/pgvector .
|
docker build --build-arg PG_MAJOR=16 -t myuser/pgvector .
|
||||||
```
|
```
|
||||||
|
|||||||
2
sql/vector--0.6.1--0.6.2.sql
Normal file
2
sql/vector--0.6.1--0.6.2.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION vector UPDATE TO '0.6.2'" to load this file. \quit
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
\echo Use "ALTER EXTENSION vector UPDATE TO '0.7.0'" to load this file. \quit
|
\echo Use "ALTER EXTENSION vector UPDATE TO '0.7.0'" to load this file. \quit
|
||||||
|
|
||||||
CREATE FUNCTION vector_concat(vector, vector) RETURNS vector
|
CREATE FUNCTION subvector(vector, int, int) RETURNS vector
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
CREATE OPERATOR || (
|
|
||||||
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_concat
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ CREATE FUNCTION vector_sub(vector, vector) RETURNS vector
|
|||||||
CREATE FUNCTION vector_mul(vector, vector) RETURNS vector
|
CREATE FUNCTION vector_mul(vector, vector) RETURNS vector
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
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;
|
||||||
|
|
||||||
-- private functions
|
-- private functions
|
||||||
|
|
||||||
CREATE FUNCTION vector_lt(vector, vector) RETURNS bool
|
CREATE FUNCTION vector_lt(vector, vector) RETURNS bool
|
||||||
@@ -99,9 +102,6 @@ CREATE FUNCTION vector_avg(double precision[]) RETURNS vector
|
|||||||
CREATE FUNCTION vector_combine(double precision[], double precision[]) RETURNS double precision[]
|
CREATE FUNCTION vector_combine(double precision[], double precision[]) RETURNS double precision[]
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
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;
|
|
||||||
|
|
||||||
-- aggregates
|
-- aggregates
|
||||||
|
|
||||||
CREATE AGGREGATE avg(vector) (
|
CREATE AGGREGATE avg(vector) (
|
||||||
@@ -227,10 +227,6 @@ CREATE OPERATOR > (
|
|||||||
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
|
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE OPERATOR || (
|
|
||||||
LEFTARG = vector, RIGHTARG = vector, PROCEDURE = vector_concat
|
|
||||||
);
|
|
||||||
|
|
||||||
-- access methods
|
-- access methods
|
||||||
|
|
||||||
CREATE FUNCTION ivfflathandler(internal) RETURNS index_am_handler
|
CREATE FUNCTION ivfflathandler(internal) RETURNS index_am_handler
|
||||||
|
|||||||
56
src/vector.c
56
src/vector.c
@@ -860,6 +860,37 @@ vector_mul(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a subset of a vector
|
||||||
|
*/
|
||||||
|
PGDLLEXPORT PG_FUNCTION_INFO_V1(subvector);
|
||||||
|
Datum
|
||||||
|
subvector(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
Vector *a = PG_GETARG_VECTOR_P(0);
|
||||||
|
int32 start = PG_GETARG_INT32(1);
|
||||||
|
int32 count = PG_GETARG_INT32(2);
|
||||||
|
int32 end = start + count;
|
||||||
|
float *ax = a->x;
|
||||||
|
Vector *result;
|
||||||
|
int dim;
|
||||||
|
|
||||||
|
if (start < 1)
|
||||||
|
start = 1;
|
||||||
|
|
||||||
|
if (end > a->dim)
|
||||||
|
end = a->dim + 1;
|
||||||
|
|
||||||
|
dim = end - start;
|
||||||
|
CheckDim(dim);
|
||||||
|
result = InitVector(dim);
|
||||||
|
|
||||||
|
for (int i = 0; i < dim; i++)
|
||||||
|
result->x[i] = ax[start - 1 + i];
|
||||||
|
|
||||||
|
PG_RETURN_POINTER(result);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal helper to compare vectors
|
* Internal helper to compare vectors
|
||||||
*/
|
*/
|
||||||
@@ -1160,28 +1191,3 @@ vector_avg(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Concat vectors
|
|
||||||
*/
|
|
||||||
PGDLLEXPORT PG_FUNCTION_INFO_V1(vector_concat);
|
|
||||||
Datum
|
|
||||||
vector_concat(PG_FUNCTION_ARGS)
|
|
||||||
{
|
|
||||||
Vector *a = PG_GETARG_VECTOR_P(0);
|
|
||||||
Vector *b = PG_GETARG_VECTOR_P(1);
|
|
||||||
Vector *result;
|
|
||||||
int dim = a->dim + b->dim;
|
|
||||||
|
|
||||||
CheckDim(dim);
|
|
||||||
|
|
||||||
result = InitVector(dim);
|
|
||||||
|
|
||||||
for (int i = 0; i < a->dim; i++)
|
|
||||||
result->x[i] = a->x[i];
|
|
||||||
|
|
||||||
for (int i = 0; i < b->dim; i++)
|
|
||||||
result->x[i + a->dim] = b->x[i];
|
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -24,14 +24,6 @@ SELECT '[1e37]'::vector * '[1e37]';
|
|||||||
ERROR: value out of range: overflow
|
ERROR: value out of range: overflow
|
||||||
SELECT '[1e-37]'::vector * '[1e-37]';
|
SELECT '[1e-37]'::vector * '[1e-37]';
|
||||||
ERROR: value out of range: underflow
|
ERROR: value out of range: underflow
|
||||||
SELECT '[1,2,3]'::vector || '[4,5]'::vector;
|
|
||||||
?column?
|
|
||||||
-------------
|
|
||||||
[1,2,3,4,5]
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
SELECT array_fill(0, ARRAY[16000])::vector || '[1]'::vector;
|
|
||||||
ERROR: vector cannot have more than 16000 dimensions
|
|
||||||
SELECT '[1,2,3]'::vector = '[1,2,3]';
|
SELECT '[1,2,3]'::vector = '[1,2,3]';
|
||||||
?column?
|
?column?
|
||||||
----------
|
----------
|
||||||
@@ -216,6 +208,34 @@ SELECT l1_distance('[3e38]', '[-3e38]');
|
|||||||
Infinity
|
Infinity
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 1, 3);
|
||||||
|
subvector
|
||||||
|
-----------
|
||||||
|
[1,2,3]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 3, 2);
|
||||||
|
subvector
|
||||||
|
-----------
|
||||||
|
[3,4]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', -1, 3);
|
||||||
|
subvector
|
||||||
|
-----------
|
||||||
|
[1]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 3, 9);
|
||||||
|
subvector
|
||||||
|
-----------
|
||||||
|
[3,4,5]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 1, 0);
|
||||||
|
ERROR: vector must have at least 1 dimension
|
||||||
|
SELECT subvector('[1,2,3,4,5]', -1, 2);
|
||||||
|
ERROR: vector must have at least 1 dimension
|
||||||
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]']) v;
|
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]']) v;
|
||||||
avg
|
avg
|
||||||
-----------
|
-----------
|
||||||
|
|||||||
@@ -116,8 +116,30 @@ SELECT '[1, ,3]'::vector;
|
|||||||
ERROR: invalid input syntax for type vector: "[1, ,3]"
|
ERROR: invalid input syntax for type vector: "[1, ,3]"
|
||||||
LINE 1: SELECT '[1, ,3]'::vector;
|
LINE 1: SELECT '[1, ,3]'::vector;
|
||||||
^
|
^
|
||||||
|
SELECT '[1,2,3]'::vector(3);
|
||||||
|
vector
|
||||||
|
---------
|
||||||
|
[1,2,3]
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '[1,2,3]'::vector(2);
|
SELECT '[1,2,3]'::vector(2);
|
||||||
ERROR: expected 2 dimensions, not 3
|
ERROR: expected 2 dimensions, not 3
|
||||||
|
SELECT '[1,2,3]'::vector(3, 2);
|
||||||
|
ERROR: invalid type modifier
|
||||||
|
LINE 1: SELECT '[1,2,3]'::vector(3, 2);
|
||||||
|
^
|
||||||
|
SELECT '[1,2,3]'::vector('a');
|
||||||
|
ERROR: invalid input syntax for type integer: "a"
|
||||||
|
LINE 1: SELECT '[1,2,3]'::vector('a');
|
||||||
|
^
|
||||||
|
SELECT '[1,2,3]'::vector(0);
|
||||||
|
ERROR: dimensions for type vector must be at least 1
|
||||||
|
LINE 1: SELECT '[1,2,3]'::vector(0);
|
||||||
|
^
|
||||||
|
SELECT '[1,2,3]'::vector(16001);
|
||||||
|
ERROR: dimensions for type vector cannot exceed 16000
|
||||||
|
LINE 1: SELECT '[1,2,3]'::vector(16001);
|
||||||
|
^
|
||||||
SELECT unnest('{"[1,2,3]", "[4,5,6]"}'::vector[]);
|
SELECT unnest('{"[1,2,3]", "[4,5,6]"}'::vector[]);
|
||||||
unnest
|
unnest
|
||||||
---------
|
---------
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ SELECT '[1,2,3]'::vector * '[4,5,6]';
|
|||||||
SELECT '[1e37]'::vector * '[1e37]';
|
SELECT '[1e37]'::vector * '[1e37]';
|
||||||
SELECT '[1e-37]'::vector * '[1e-37]';
|
SELECT '[1e-37]'::vector * '[1e-37]';
|
||||||
|
|
||||||
SELECT '[1,2,3]'::vector || '[4,5]'::vector;
|
|
||||||
SELECT array_fill(0, ARRAY[16000])::vector || '[1]'::vector;
|
|
||||||
|
|
||||||
SELECT '[1,2,3]'::vector = '[1,2,3]';
|
SELECT '[1,2,3]'::vector = '[1,2,3]';
|
||||||
SELECT '[1,2,3]'::vector = '[1,2]';
|
SELECT '[1,2,3]'::vector = '[1,2]';
|
||||||
|
|
||||||
@@ -51,6 +48,13 @@ SELECT l1_distance('[0,0]', '[0,1]');
|
|||||||
SELECT l1_distance('[1,2]', '[3]');
|
SELECT l1_distance('[1,2]', '[3]');
|
||||||
SELECT l1_distance('[3e38]', '[-3e38]');
|
SELECT l1_distance('[3e38]', '[-3e38]');
|
||||||
|
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 1, 3);
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 3, 2);
|
||||||
|
SELECT subvector('[1,2,3,4,5]', -1, 3);
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 3, 9);
|
||||||
|
SELECT subvector('[1,2,3,4,5]', 1, 0);
|
||||||
|
SELECT subvector('[1,2,3,4,5]', -1, 2);
|
||||||
|
|
||||||
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]']) v;
|
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]']) v;
|
||||||
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]', NULL]) v;
|
SELECT avg(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]', NULL]) v;
|
||||||
SELECT avg(v) FROM unnest(ARRAY[]::vector[]) v;
|
SELECT avg(v) FROM unnest(ARRAY[]::vector[]) v;
|
||||||
|
|||||||
@@ -22,7 +22,13 @@ SELECT '[1,]'::vector;
|
|||||||
SELECT '[1a]'::vector;
|
SELECT '[1a]'::vector;
|
||||||
SELECT '[1,,3]'::vector;
|
SELECT '[1,,3]'::vector;
|
||||||
SELECT '[1, ,3]'::vector;
|
SELECT '[1, ,3]'::vector;
|
||||||
|
|
||||||
|
SELECT '[1,2,3]'::vector(3);
|
||||||
SELECT '[1,2,3]'::vector(2);
|
SELECT '[1,2,3]'::vector(2);
|
||||||
|
SELECT '[1,2,3]'::vector(3, 2);
|
||||||
|
SELECT '[1,2,3]'::vector('a');
|
||||||
|
SELECT '[1,2,3]'::vector(0);
|
||||||
|
SELECT '[1,2,3]'::vector(16001);
|
||||||
|
|
||||||
SELECT unnest('{"[1,2,3]", "[4,5,6]"}'::vector[]);
|
SELECT unnest('{"[1,2,3]", "[4,5,6]"}'::vector[]);
|
||||||
SELECT '{"[1,2,3]"}'::vector(2)[];
|
SELECT '{"[1,2,3]"}'::vector(2)[];
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
comment = 'vector data type and ivfflat and hnsw access methods'
|
comment = 'vector data type and ivfflat and hnsw access methods'
|
||||||
default_version = '0.6.1'
|
default_version = '0.6.2'
|
||||||
module_pathname = '$libdir/vector'
|
module_pathname = '$libdir/vector'
|
||||||
relocatable = true
|
relocatable = true
|
||||||
|
|||||||
Reference in New Issue
Block a user