Skip to content

Commit 27b253f

Browse files
committed
Add more tests and a bugfix
1 parent 0262149 commit 27b253f

File tree

4 files changed

+35
-16
lines changed

4 files changed

+35
-16
lines changed

src/vec_type.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ static inline LDBVec *NewLDBVec(int dim, int elem_type)
3939
}
4040

4141
/* Confined by uint16 in LDBVec structure */
42-
#define LDB_VEC_MAX_DIM 1 << 16
42+
#define LDB_VEC_MAX_DIM ((1 << 16) - 1)
4343
/*
4444
* Returns a pointer to the actual array data.
4545
*/

src/vector_casts.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ Datum ldb_generic_vec_typmod_in(PG_FUNCTION_ARGS)
8484
}
8585

8686
if(*tl < 1) {
87-
elog(ERROR, "vector dimensions must be at least 1");
87+
elog(ERROR, "vector dimension must be >= 1");
8888
}
8989

9090
if(*tl > LDB_VEC_MAX_DIM) {
@@ -342,8 +342,9 @@ LDBVec *ldb_generic_cast_array_vec(ArrayType *array, int expected_dim, usearch_s
342342
for(int i = 0; i < nelemsp; i++) {
343343
vec_floats[ i ] = DatumGetFloat4(DirectFunctionCall1(numeric_float4, elemsp[ i ]));
344344
}
345+
break;
345346
default:
346-
elog(ERROR, "unknown array elem type %d", ARR_ELEMTYPE(array));
347+
elog(ERROR, "unknown array element type %d", ARR_ELEMTYPE(array));
347348
}
348349

349350
if(usearch_scalar_f8_k == to) {

test/expected/casts.out

+26-13
Original file line numberDiff line numberDiff line change
@@ -43,49 +43,62 @@ SELECT '{.1, 0.33, .42, .55, -.42, -0.00001, -.1234567}'::vec8, '{.1, 0.33, .42,
4343
{1,1,1,1,1,1,1} | {0.1,0.33,0.42,0.55,-0.42,0,-0.12}
4444
(1 row)
4545

46+
SELECT ARRAY[1,.2,.3]::uvec8;
47+
array
48+
-------------
49+
{1,0.2,0.3}
50+
(1 row)
51+
52+
SELECT ARRAY(SELECT ROUND(RANDOM()) FROM generate_series(1,65534))::uvec8
4653
SELECT '{1,2,3}'::uvec8;
47-
psql:test/sql/casts.sql:20: ERROR: uvec8 must be in range [-1, 1]
54+
psql:test/sql/casts.sql:22: ERROR: uvec8 must be in range [-1, 1]
4855
LINE 1: SELECT '{1,2,3}'::uvec8;
4956
^
5057
SELECT '{}'::uvec8;
51-
psql:test/sql/casts.sql:21: ERROR: array must not be empty
58+
psql:test/sql/casts.sql:23: ERROR: array must not be empty
5259
LINE 1: SELECT '{}'::uvec8;
5360
^
5461
SELECT 'abra'::uvec8;
55-
psql:test/sql/casts.sql:22: ERROR: malformed array literal: "abra"
62+
psql:test/sql/casts.sql:24: ERROR: malformed array literal: "abra"
5663
LINE 1: SELECT 'abra'::uvec8;
5764
^
5865
DETAIL: Array value must start with "{" or dimension information.
5966
SELECT '{"haha"}'::uvec8;
60-
psql:test/sql/casts.sql:23: ERROR: invalid input syntax for type real: "haha"
67+
psql:test/sql/casts.sql:25: ERROR: invalid input syntax for type real: "haha"
6168
LINE 1: SELECT '{"haha"}'::uvec8;
6269
^
6370
SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8;
64-
psql:test/sql/casts.sql:24: ERROR: array must be 1-D
71+
psql:test/sql/casts.sql:26: ERROR: array must be 1-D
6572
LINE 1: SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8;
6673
^
6774
SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8(4);
68-
psql:test/sql/casts.sql:25: ERROR: array must be 1-D
75+
psql:test/sql/casts.sql:27: ERROR: array must be 1-D
6976
LINE 1: SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8(4);
7077
^
7178
SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8[4];
72-
psql:test/sql/casts.sql:27: ERROR: malformed array literal: ".1"
79+
psql:test/sql/casts.sql:29: ERROR: malformed array literal: ".1"
7380
LINE 1: SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8[4];
7481
^
7582
DETAIL: Array value must start with "{" or dimension information.
7683
SELECT '{0.111,NULL}'::uvec8(2);
77-
psql:test/sql/casts.sql:29: ERROR: array must not contain nulls
84+
psql:test/sql/casts.sql:31: ERROR: array must not contain nulls
7885
LINE 1: SELECT '{0.111,NULL}'::uvec8(2);
7986
^
87+
SELECT '{.1, .2}'::uvec8(-2);
88+
psql:test/sql/casts.sql:32: ERROR: vector dimension must be >= 1
89+
LINE 1: SELECT '{.1, .2}'::uvec8(-2);
90+
^
91+
SELECT ARRAY(SELECT ROUND(RANDOM()) FROM generate_series(1,65536))::uvec8;
92+
psql:test/sql/casts.sql:33: ERROR: array too large. max vec dimension is 65535
8093
SELECT '{0.1,0.2,0.3}'::uvec8(3,3);
81-
psql:test/sql/casts.sql:30: ERROR: wrong number of modifiers
94+
psql:test/sql/casts.sql:35: ERROR: wrong number of modifiers
8295
LINE 1: SELECT '{0.1,0.2,0.3}'::uvec8(3,3);
8396
^
8497
SELECT '{0.1,0.2,0.3}'::uvec8(2);
85-
psql:test/sql/casts.sql:31: ERROR: invalid cast. vector dim: 3, cast dim:2
98+
psql:test/sql/casts.sql:36: ERROR: invalid cast. vector dim: 3, cast dim:2
8699
SELECT '{0.1,0.2,0.3}'::uvec8(3)::uvec8(2);
87-
psql:test/sql/casts.sql:32: ERROR: invalid cast. vector dim: 3, cast dim:2
100+
psql:test/sql/casts.sql:37: ERROR: invalid cast. vector dim: 3, cast dim:2
88101
SELECT '{1,1,1}'::int[3]::uvec8(4);
89-
psql:test/sql/casts.sql:33: ERROR: invalid cast. vector dim: 3, cast dim:4
102+
psql:test/sql/casts.sql:38: ERROR: invalid cast. vector dim: 3, cast dim:4
90103
SELECT '{1,1,1}'::int[3]::uvec8(3)::uvec8(4);
91-
psql:test/sql/casts.sql:34: ERROR: invalid cast. vector dim: 3, cast dim:4
104+
psql:test/sql/casts.sql:39: ERROR: invalid cast. vector dim: 3, cast dim:4

test/sql/casts.sql

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ SELECT '{-0.42,0.0000001,0.00002}'::float[3]::uvec8(3)::float4[3];
1515
-- vec8
1616
SELECT '{.1, 0.33, .42, .55, -.42, -0.00001, -.1234567}'::vec8, '{.1, 0.33, .42, .55, -.42, -0.00001, -.1234567}'::uvec8;
1717

18+
SELECT ARRAY[1,.2,.3]::uvec8;
19+
SELECT ARRAY(SELECT ROUND(RANDOM()) FROM generate_series(1,65534))::uvec8 \gset
1820

1921
\set ON_ERROR_STOP off
2022
SELECT '{1,2,3}'::uvec8;
@@ -27,6 +29,9 @@ SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8(4);
2729
SELECT '{{.1,.2,.3},{.4,.5,.6}}'::uvec8[4];
2830

2931
SELECT '{0.111,NULL}'::uvec8(2);
32+
SELECT '{.1, .2}'::uvec8(-2);
33+
SELECT ARRAY(SELECT ROUND(RANDOM()) FROM generate_series(1,65536))::uvec8;
34+
3035
SELECT '{0.1,0.2,0.3}'::uvec8(3,3);
3136
SELECT '{0.1,0.2,0.3}'::uvec8(2);
3237
SELECT '{0.1,0.2,0.3}'::uvec8(3)::uvec8(2);

0 commit comments

Comments
 (0)