mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-22 12:07:34 +08:00
Compare commits
13 Commits
v0.7.3
...
hnsw-build
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e43b1e660f | ||
|
|
33f5c41623 | ||
|
|
3c99b55cf9 | ||
|
|
020d3edaa9 | ||
|
|
1e9e355175 | ||
|
|
f1d283f565 | ||
|
|
8684c2ba62 | ||
|
|
6c692ef23f | ||
|
|
bb424e96e7 | ||
|
|
30911edb7a | ||
|
|
5ae2bd9efb | ||
|
|
19215317a4 | ||
|
|
c7ca7f05de |
@@ -1,3 +1,7 @@
|
|||||||
|
## 0.7.4 (unreleased)
|
||||||
|
|
||||||
|
- Fixed compilation error with GCC 14 on i386 when SSE2 is not enabled
|
||||||
|
|
||||||
## 0.7.3 (2024-07-22)
|
## 0.7.3 (2024-07-22)
|
||||||
|
|
||||||
- Fixed `failed to add index item` error with `sparsevec`
|
- Fixed `failed to add index item` error with `sparsevec`
|
||||||
|
|||||||
7
Makefile
7
Makefile
@@ -2,7 +2,8 @@ EXTENSION = vector
|
|||||||
EXTVERSION = 0.7.3
|
EXTVERSION = 0.7.3
|
||||||
|
|
||||||
MODULE_big = vector
|
MODULE_big = vector
|
||||||
DATA = $(wildcard sql/*--*.sql)
|
DATA = $(wildcard sql/*--*--*.sql)
|
||||||
|
DATA_built = sql/$(EXTENSION)--$(EXTVERSION).sql
|
||||||
OBJS = src/bitutils.o src/bitvec.o src/halfutils.o src/halfvec.o src/hnsw.o src/hnswbuild.o src/hnswinsert.o src/hnswscan.o src/hnswutils.o src/hnswvacuum.o src/ivfbuild.o src/ivfflat.o src/ivfinsert.o src/ivfkmeans.o src/ivfscan.o src/ivfutils.o src/ivfvacuum.o src/sparsevec.o src/vector.o
|
OBJS = src/bitutils.o src/bitvec.o src/halfutils.o src/halfvec.o src/hnsw.o src/hnswbuild.o src/hnswinsert.o src/hnswscan.o src/hnswutils.o src/hnswvacuum.o src/ivfbuild.o src/ivfflat.o src/ivfinsert.o src/ivfkmeans.o src/ivfscan.o src/ivfutils.o src/ivfvacuum.o src/sparsevec.o src/vector.o
|
||||||
HEADERS = src/halfvec.h src/sparsevec.h src/vector.h
|
HEADERS = src/halfvec.h src/sparsevec.h src/vector.h
|
||||||
|
|
||||||
@@ -42,8 +43,6 @@ all: sql/$(EXTENSION)--$(EXTVERSION).sql
|
|||||||
sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
|
sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
|
||||||
cp $< $@
|
cp $< $@
|
||||||
|
|
||||||
EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
|
|
||||||
|
|
||||||
PG_CONFIG ?= pg_config
|
PG_CONFIG ?= pg_config
|
||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
include $(PGXS)
|
include $(PGXS)
|
||||||
@@ -53,7 +52,7 @@ ifeq ($(PROVE),)
|
|||||||
PROVE = prove
|
PROVE = prove
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# for Postgres 15
|
# for Postgres < 15
|
||||||
PROVE_FLAGS += -I ./test/perl
|
PROVE_FLAGS += -I ./test/perl
|
||||||
|
|
||||||
prove_installcheck:
|
prove_installcheck:
|
||||||
|
|||||||
15
Makefile.win
15
Makefile.win
@@ -1,6 +1,7 @@
|
|||||||
EXTENSION = vector
|
EXTENSION = vector
|
||||||
EXTVERSION = 0.7.3
|
EXTVERSION = 0.7.3
|
||||||
|
|
||||||
|
DATA_built = sql\$(EXTENSION)--$(EXTVERSION).sql
|
||||||
OBJS = src\bitutils.obj src\bitvec.obj src\halfutils.obj src\halfvec.obj 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\sparsevec.obj src\vector.obj
|
OBJS = src\bitutils.obj src\bitvec.obj src\halfutils.obj src\halfvec.obj 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\sparsevec.obj src\vector.obj
|
||||||
HEADERS = src\halfvec.h src\sparsevec.h src\vector.h
|
HEADERS = src\halfvec.h src\sparsevec.h src\vector.h
|
||||||
|
|
||||||
@@ -19,11 +20,6 @@ PG_CFLAGS = $(PG_CFLAGS) $(OPTFLAGS) /O2 /fp:fast
|
|||||||
# https://learn.microsoft.com/en-us/cpp/error-messages/tool-errors/vectorizer-and-parallelizer-messages
|
# https://learn.microsoft.com/en-us/cpp/error-messages/tool-errors/vectorizer-and-parallelizer-messages
|
||||||
# PG_CFLAGS = $(PG_CFLAGS) /Qvec-report:2
|
# PG_CFLAGS = $(PG_CFLAGS) /Qvec-report:2
|
||||||
|
|
||||||
all: sql\$(EXTENSION)--$(EXTVERSION).sql
|
|
||||||
|
|
||||||
sql\$(EXTENSION)--$(EXTVERSION).sql: sql\$(EXTENSION).sql
|
|
||||||
copy sql\$(EXTENSION).sql $@
|
|
||||||
|
|
||||||
# TODO use pg_config
|
# TODO use pg_config
|
||||||
!ifndef PGROOT
|
!ifndef PGROOT
|
||||||
!error PGROOT is not set
|
!error PGROOT is not set
|
||||||
@@ -43,15 +39,18 @@ SHLIB = $(EXTENSION).dll
|
|||||||
|
|
||||||
LIBS = "$(LIBDIR)\postgres.lib"
|
LIBS = "$(LIBDIR)\postgres.lib"
|
||||||
|
|
||||||
|
all: $(SHLIB) $(DATA_built)
|
||||||
|
|
||||||
.c.obj:
|
.c.obj:
|
||||||
$(CC) $(CFLAGS) /c $< /Fo$@
|
$(CC) $(CFLAGS) /c $< /Fo$@
|
||||||
|
|
||||||
$(SHLIB): $(OBJS)
|
$(SHLIB): $(OBJS)
|
||||||
$(CC) $(CFLAGS) $(OBJS) $(LIBS) /link /DLL /OUT:$(SHLIB)
|
$(CC) $(CFLAGS) $(OBJS) $(LIBS) /link /DLL /OUT:$(SHLIB)
|
||||||
|
|
||||||
all: $(SHLIB)
|
sql\$(EXTENSION)--$(EXTVERSION).sql: sql\$(EXTENSION).sql
|
||||||
|
copy sql\$(EXTENSION).sql $@
|
||||||
|
|
||||||
install:
|
install: all
|
||||||
copy $(SHLIB) "$(PKGLIBDIR)"
|
copy $(SHLIB) "$(PKGLIBDIR)"
|
||||||
copy $(EXTENSION).control "$(SHAREDIR)\extension"
|
copy $(EXTENSION).control "$(SHAREDIR)\extension"
|
||||||
copy sql\$(EXTENSION)--*.sql "$(SHAREDIR)\extension"
|
copy sql\$(EXTENSION)--*.sql "$(SHAREDIR)\extension"
|
||||||
@@ -70,6 +69,6 @@ uninstall:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
del /f $(SHLIB) $(EXTENSION).lib $(EXTENSION).exp
|
del /f $(SHLIB) $(EXTENSION).lib $(EXTENSION).exp
|
||||||
|
del /f $(DATA_built)
|
||||||
del /f $(OBJS)
|
del /f $(OBJS)
|
||||||
del /f sql\$(EXTENSION)--$(EXTVERSION).sql
|
|
||||||
del /f /s /q results regression.diffs regression.out tmp_check tmp_check_iso log output_iso
|
del /f /s /q results regression.diffs regression.out tmp_check tmp_check_iso log output_iso
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
/* F16C has better performance than _Float16 (on x86-64) */
|
/* F16C has better performance than _Float16 (on x86-64) */
|
||||||
#if defined(__F16C__)
|
#if defined(__F16C__)
|
||||||
#define F16C_SUPPORT
|
#define F16C_SUPPORT
|
||||||
#elif defined(__FLT16_MAX__) && !defined(HALFVEC_DISPATCH) && !defined(__FreeBSD__)
|
#elif defined(__FLT16_MAX__) && !defined(HALFVEC_DISPATCH) && !defined(__FreeBSD__) && (!defined(__i386__) || defined(__SSE2__))
|
||||||
#define FLT16_SUPPORT
|
#define FLT16_SUPPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -379,7 +379,13 @@ UpdateNeighborsInMemory(char *base, FmgrInfo *procinfo, Oid collation, HnswEleme
|
|||||||
for (int lc = e->level; lc >= 0; lc--)
|
for (int lc = e->level; lc >= 0; lc--)
|
||||||
{
|
{
|
||||||
int lm = HnswGetLayerM(m, lc);
|
int lm = HnswGetLayerM(m, lc);
|
||||||
HnswNeighborArray *neighbors = HnswGetNeighbors(base, e, lc);
|
Size neighborsSize = HNSW_NEIGHBOR_ARRAY_SIZE(lm);
|
||||||
|
HnswNeighborArray *neighbors = palloc(neighborsSize);
|
||||||
|
|
||||||
|
/* Copy neighbors to local memory */
|
||||||
|
LWLockAcquire(&e->lock, LW_SHARED);
|
||||||
|
memcpy(neighbors, HnswGetNeighbors(base, e, lc), neighborsSize);
|
||||||
|
LWLockRelease(&e->lock);
|
||||||
|
|
||||||
for (int i = 0; i < neighbors->length; i++)
|
for (int i = 0; i < neighbors->length; i++)
|
||||||
{
|
{
|
||||||
@@ -389,7 +395,6 @@ UpdateNeighborsInMemory(char *base, FmgrInfo *procinfo, Oid collation, HnswEleme
|
|||||||
/* Keep scan-build happy on Mac x86-64 */
|
/* Keep scan-build happy on Mac x86-64 */
|
||||||
Assert(neighborElement);
|
Assert(neighborElement);
|
||||||
|
|
||||||
/* Use element for lock instead of hc since hc can be replaced */
|
|
||||||
LWLockAcquire(&neighborElement->lock, LW_EXCLUSIVE);
|
LWLockAcquire(&neighborElement->lock, LW_EXCLUSIVE);
|
||||||
HnswUpdateConnection(base, e, hc, lm, lc, NULL, NULL, procinfo, collation);
|
HnswUpdateConnection(base, e, hc, lm, lc, NULL, NULL, procinfo, collation);
|
||||||
LWLockRelease(&neighborElement->lock);
|
LWLockRelease(&neighborElement->lock);
|
||||||
|
|||||||
11
test/perl/PostgreSQL/Test/Cluster.pm
Normal file
11
test/perl/PostgreSQL/Test/Cluster.pm
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package PostgreSQL::Test::Cluster;
|
||||||
|
|
||||||
|
use PostgresNode;
|
||||||
|
|
||||||
|
sub new
|
||||||
|
{
|
||||||
|
my ($class, $name) = @_;
|
||||||
|
return get_new_node($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
5
test/perl/PostgreSQL/Test/Utils.pm
Normal file
5
test/perl/PostgreSQL/Test/Utils.pm
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package PostgreSQL::Test::Utils;
|
||||||
|
|
||||||
|
use TestLib;
|
||||||
|
|
||||||
|
1;
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
use PostgreSQL::Test::Cluster;
|
|
||||||
|
|
||||||
sub get_new_node
|
|
||||||
{
|
|
||||||
return PostgreSQL::Test::Cluster->new(@_);
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
use PostgreSQL::Test::Utils;
|
|
||||||
|
|
||||||
1;
|
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
# Test generic xlog record work for ivfflat index replication.
|
# Test generic xlog record work for ivfflat index replication.
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 32;
|
my $dim = 32;
|
||||||
@@ -49,7 +49,7 @@ sub test_index_replay
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize primary node
|
# Initialize primary node
|
||||||
$node_primary = get_new_node('primary');
|
$node_primary = PostgreSQL::Test::Cluster->new('primary');
|
||||||
$node_primary->init(allows_streaming => 1);
|
$node_primary->init(allows_streaming => 1);
|
||||||
if ($dim > 32)
|
if ($dim > 32)
|
||||||
{
|
{
|
||||||
@@ -67,7 +67,7 @@ my $backup_name = 'my_backup';
|
|||||||
$node_primary->backup($backup_name);
|
$node_primary->backup($backup_name);
|
||||||
|
|
||||||
# Create streaming replica linking to primary
|
# Create streaming replica linking to primary
|
||||||
$node_replica = get_new_node('replica');
|
$node_replica = PostgreSQL::Test::Cluster->new('replica');
|
||||||
$node_replica->init_from_backup($node_primary, $backup_name, has_streaming => 1);
|
$node_replica->init_from_backup($node_primary, $backup_name, has_streaming => 1);
|
||||||
$node_replica->start;
|
$node_replica->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 3;
|
my $dim = 3;
|
||||||
@@ -15,7 +15,7 @@ for (1 .. $dim)
|
|||||||
my $array_sql = join(", ", @r);
|
my $array_sql = join(", ", @r);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -49,7 +49,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 768;
|
my $dim = 768;
|
||||||
@@ -9,7 +9,7 @@ my $dim = 768;
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 3;
|
my $dim = 3;
|
||||||
@@ -11,7 +11,7 @@ my $limit = 20;
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
# Test generic xlog record work for hnsw index replication.
|
# Test generic xlog record work for hnsw index replication.
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 32;
|
my $dim = 32;
|
||||||
@@ -49,7 +49,7 @@ sub test_index_replay
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize primary node
|
# Initialize primary node
|
||||||
$node_primary = get_new_node('primary');
|
$node_primary = PostgreSQL::Test::Cluster->new('primary');
|
||||||
$node_primary->init(allows_streaming => 1);
|
$node_primary->init(allows_streaming => 1);
|
||||||
if ($dim > 32)
|
if ($dim > 32)
|
||||||
{
|
{
|
||||||
@@ -67,7 +67,7 @@ my $backup_name = 'my_backup';
|
|||||||
$node_primary->backup($backup_name);
|
$node_primary->backup($backup_name);
|
||||||
|
|
||||||
# Create streaming replica linking to primary
|
# Create streaming replica linking to primary
|
||||||
$node_replica = get_new_node('replica');
|
$node_replica = PostgreSQL::Test::Cluster->new('replica');
|
||||||
$node_replica->init_from_backup($node_primary, $backup_name, has_streaming => 1);
|
$node_replica->init_from_backup($node_primary, $backup_name, has_streaming => 1);
|
||||||
$node_replica->start;
|
$node_replica->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 3;
|
my $dim = 3;
|
||||||
@@ -15,7 +15,7 @@ for (1 .. $dim)
|
|||||||
my $array_sql = join(", ", @r);
|
my $array_sql = join(", ", @r);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -47,7 +47,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -47,7 +47,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Ensures elements and neighbors on both same and different pages
|
# Ensures elements and neighbors on both same and different pages
|
||||||
@@ -10,7 +10,7 @@ my $dim = 1900;
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 3;
|
my $dim = 3;
|
||||||
@@ -11,7 +11,7 @@ my $limit = 20;
|
|||||||
my $array_sql = join(",", ('random()') x $dim);
|
my $array_sql = join(",", ('random()') x $dim);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ sub test_aggregate
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
# Does not raise overflow error in this instance due to loss of precision
|
# Does not raise overflow error in this instance due to loss of precision
|
||||||
is($res, "[24576,24576,49152]")
|
is($res, "[24576,24576,49152]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $dim = 1024;
|
my $dim = 1024;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -51,7 +51,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -51,7 +51,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -51,7 +51,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -47,7 +47,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -47,7 +47,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -48,7 +48,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -51,7 +51,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
my $array_sql = join(",", ('floor(random() * 2)::int - 1') x 3);
|
my $array_sql = join(",", ('floor(random() * 2)::int - 1') x 3);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -10,7 +10,7 @@ my $dim = 5;
|
|||||||
my $array_sql = join(",", ('floor(random() * 4)::int - 2') x $dim);
|
my $array_sql = join(",", ('floor(random() * 4)::int - 2') x $dim);
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
my $node;
|
my $node;
|
||||||
@@ -51,7 +51,7 @@ sub test_recall
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
$node = get_new_node('node');
|
$node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings FATAL => 'all';
|
||||||
use PostgresNode;
|
use PostgreSQL::Test::Cluster;
|
||||||
use TestLib;
|
use PostgreSQL::Test::Utils;
|
||||||
use Test::More;
|
use Test::More;
|
||||||
|
|
||||||
# Initialize node
|
# Initialize node
|
||||||
my $node = get_new_node('node');
|
my $node = PostgreSQL::Test::Cluster->new('node');
|
||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
@@ -14,13 +14,17 @@ $node->safe_psql("postgres", "CREATE EXTENSION vector;");
|
|||||||
$node->safe_psql("postgres", "CREATE TABLE tst (i serial, v sparsevec(100000));");
|
$node->safe_psql("postgres", "CREATE TABLE tst (i serial, v sparsevec(100000));");
|
||||||
$node->safe_psql("postgres", "CREATE INDEX ON tst USING hnsw (v sparsevec_l2_ops);");
|
$node->safe_psql("postgres", "CREATE INDEX ON tst USING hnsw (v sparsevec_l2_ops);");
|
||||||
|
|
||||||
for (1 .. 3) {
|
for (1 .. 3)
|
||||||
for (1 .. 100) {
|
{
|
||||||
|
for (1 .. 100)
|
||||||
|
{
|
||||||
my @elements;
|
my @elements;
|
||||||
my %indices;
|
my %indices;
|
||||||
for (1 .. int(rand() * 100)) {
|
for (1 .. int(rand() * 100))
|
||||||
|
{
|
||||||
my $index = int(rand() * (100000 - 1)) + 1;
|
my $index = int(rand() * (100000 - 1)) + 1;
|
||||||
if (!exists($indices{$index})) {
|
if (!exists($indices{$index}))
|
||||||
|
{
|
||||||
my $value = rand();
|
my $value = rand();
|
||||||
push(@elements, "$index:$value");
|
push(@elements, "$index:$value");
|
||||||
$indices{$index} = 1;
|
$indices{$index} = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user