mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-25 08:46:49 +02:00
memset 0 all applicable mallocs, fix windows?
This commit is contained in:
parent
da8a19fb0b
commit
44aef7a50f
1 changed files with 33 additions and 11 deletions
44
sqlite-vec.c
44
sqlite-vec.c
|
|
@ -431,10 +431,13 @@ struct Array {
|
||||||
* SQLITE_NOMEM
|
* SQLITE_NOMEM
|
||||||
*/
|
*/
|
||||||
int array_init(struct Array *array, size_t element_size, size_t init_capacity) {
|
int array_init(struct Array *array, size_t element_size, size_t init_capacity) {
|
||||||
void *z = sqlite3_malloc(element_size * init_capacity);
|
int sz = element_size * init_capacity;
|
||||||
|
void *z = sqlite3_malloc(sz);
|
||||||
if (!z) {
|
if (!z) {
|
||||||
return SQLITE_NOMEM;
|
return SQLITE_NOMEM;
|
||||||
}
|
}
|
||||||
|
memset(z, 0, sz);
|
||||||
|
|
||||||
array->element_size = element_size;
|
array->element_size = element_size;
|
||||||
array->length = 0;
|
array->length = 0;
|
||||||
array->capacity = init_capacity;
|
array->capacity = init_capacity;
|
||||||
|
|
@ -870,6 +873,7 @@ static void vec_npy_file(sqlite3_context *context, int argc,
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(f, 0, sizeof(*f));
|
||||||
|
|
||||||
f->path = path;
|
f->path = path;
|
||||||
f->pathLength = pathLength;
|
f->pathLength = pathLength;
|
||||||
|
|
@ -1081,9 +1085,11 @@ static void vec_quantize_i8(sqlite3_context *context, int argc,
|
||||||
fvec_cleanup cleanup;
|
fvec_cleanup cleanup;
|
||||||
char *err;
|
char *err;
|
||||||
int rc = fvec_from_value(argv[0], &srcVector, &dimensions, &cleanup, &err);
|
int rc = fvec_from_value(argv[0], &srcVector, &dimensions, &cleanup, &err);
|
||||||
assert(rc == SQLITE_OK);
|
todo_assert(rc == SQLITE_OK);
|
||||||
i8 *out = sqlite3_malloc(dimensions * sizeof(i8));
|
int sz = dimensions * sizeof(i8);
|
||||||
assert(out);
|
i8 *out = sqlite3_malloc(sz);
|
||||||
|
todo_assert(out);
|
||||||
|
memset(out, 0, sz);
|
||||||
|
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
if ((sqlite3_value_type(argv[1]) != SQLITE_TEXT) ||
|
if ((sqlite3_value_type(argv[1]) != SQLITE_TEXT) ||
|
||||||
|
|
@ -1133,12 +1139,14 @@ static void vec_quantize_binary(sqlite3_context *context, int argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elementType == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) {
|
if (elementType == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) {
|
||||||
u8 *out = sqlite3_malloc(dimensions / CHAR_BIT);
|
int sz = dimensions / CHAR_BIT;
|
||||||
|
u8 *out = sqlite3_malloc(sz);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
cleanup(vector);
|
cleanup(vector);
|
||||||
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, sz);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
int res = ((f32 *)vector)[i] > 0.0;
|
int res = ((f32 *)vector)[i] > 0.0;
|
||||||
out[i / 8] |= (res << (i % 8));
|
out[i / 8] |= (res << (i % 8));
|
||||||
|
|
@ -1146,12 +1154,14 @@ static void vec_quantize_binary(sqlite3_context *context, int argc,
|
||||||
sqlite3_result_blob(context, out, dimensions / CHAR_BIT, sqlite3_free);
|
sqlite3_result_blob(context, out, dimensions / CHAR_BIT, sqlite3_free);
|
||||||
sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT);
|
sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT);
|
||||||
} else if (elementType == SQLITE_VEC_ELEMENT_TYPE_INT8) {
|
} else if (elementType == SQLITE_VEC_ELEMENT_TYPE_INT8) {
|
||||||
u8 *out = sqlite3_malloc(dimensions / CHAR_BIT);
|
int sz = dimensions / CHAR_BIT;
|
||||||
|
u8 *out = sqlite3_malloc(sz);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
cleanup(vector);
|
cleanup(vector);
|
||||||
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, sz);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
int res = ((i8 *)vector)[i] > 0;
|
int res = ((i8 *)vector)[i] > 0;
|
||||||
out[i / 8] |= (res << (i % 8));
|
out[i / 8] |= (res << (i % 8));
|
||||||
|
|
@ -1193,6 +1203,7 @@ static void vec_add(sqlite3_context *context, int argc, sqlite3_value **argv) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
out[i] = ((f32 *)a)[i] + ((f32 *)b)[i];
|
out[i] = ((f32 *)a)[i] + ((f32 *)b)[i];
|
||||||
}
|
}
|
||||||
|
|
@ -1207,6 +1218,7 @@ static void vec_add(sqlite3_context *context, int argc, sqlite3_value **argv) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
out[i] = ((i8 *)a)[i] + ((i8 *)b)[i];
|
out[i] = ((i8 *)a)[i] + ((i8 *)b)[i];
|
||||||
}
|
}
|
||||||
|
|
@ -1249,6 +1261,7 @@ static void vec_sub(sqlite3_context *context, int argc, sqlite3_value **argv) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
out[i] = ((f32 *)a)[i] - ((f32 *)b)[i];
|
out[i] = ((f32 *)a)[i] - ((f32 *)b)[i];
|
||||||
}
|
}
|
||||||
|
|
@ -1263,6 +1276,7 @@ static void vec_sub(sqlite3_context *context, int argc, sqlite3_value **argv) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < dimensions; i++) {
|
for (size_t i = 0; i < dimensions; i++) {
|
||||||
out[i] = ((i8 *)a)[i] - ((i8 *)b)[i];
|
out[i] = ((i8 *)a)[i] - ((i8 *)b)[i];
|
||||||
}
|
}
|
||||||
|
|
@ -1328,11 +1342,13 @@ static void vec_slice(sqlite3_context *context, int argc,
|
||||||
|
|
||||||
switch (elementType) {
|
switch (elementType) {
|
||||||
case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: {
|
case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: {
|
||||||
f32 *out = sqlite3_malloc(n * sizeof(f32));
|
int outSize = n * sizeof(f32);
|
||||||
|
f32 *out = sqlite3_malloc(outSize);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
out[i] = ((f32 *)vector)[start + i];
|
out[i] = ((f32 *)vector)[start + i];
|
||||||
}
|
}
|
||||||
|
|
@ -1341,11 +1357,13 @@ static void vec_slice(sqlite3_context *context, int argc,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
case SQLITE_VEC_ELEMENT_TYPE_INT8: {
|
case SQLITE_VEC_ELEMENT_TYPE_INT8: {
|
||||||
i8 *out = sqlite3_malloc(n * sizeof(i8));
|
int outSize = n * sizeof(i8);
|
||||||
|
i8 *out = sqlite3_malloc(outSize);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
out[i] = ((i8 *)vector)[start + i];
|
out[i] = ((i8 *)vector)[start + i];
|
||||||
}
|
}
|
||||||
|
|
@ -1362,12 +1380,13 @@ static void vec_slice(sqlite3_context *context, int argc,
|
||||||
sqlite3_result_error(context, "end index must be divisible by 8.", -1);
|
sqlite3_result_error(context, "end index must be divisible by 8.", -1);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
int outSize = n / CHAR_BIT;
|
||||||
u8 *out = sqlite3_malloc(n / CHAR_BIT);
|
u8 *out = sqlite3_malloc(outSize);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
for (size_t i = 0; i < n / CHAR_BIT; i++) {
|
for (size_t i = 0; i < n / CHAR_BIT; i++) {
|
||||||
out[i] = ((u8 *)vector)[(start / CHAR_BIT) + i];
|
out[i] = ((u8 *)vector)[(start / CHAR_BIT) + i];
|
||||||
}
|
}
|
||||||
|
|
@ -1454,12 +1473,14 @@ static void vec_normalize(sqlite3_context *context, int argc,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 *out = sqlite3_malloc(dimensions * sizeof(f32));
|
int outSize = dimensions * sizeof(f32);
|
||||||
|
f32 *out = sqlite3_malloc(outSize);
|
||||||
if (!out) {
|
if (!out) {
|
||||||
cleanup(vector);
|
cleanup(vector);
|
||||||
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
sqlite3_result_error_code(context, SQLITE_NOMEM);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(out, 0, outSize);
|
||||||
|
|
||||||
f32 *v = (f32 *)vector;
|
f32 *v = (f32 *)vector;
|
||||||
|
|
||||||
|
|
@ -5618,6 +5639,7 @@ static void vec_static_blob_from_raw(sqlite3_context *context, int argc,
|
||||||
sqlite3_result_error_nomem(context);
|
sqlite3_result_error_nomem(context);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
memset(p, 0, sizeof(*p));
|
||||||
p->p = sqlite3_value_int64(argv[0]);
|
p->p = sqlite3_value_int64(argv[0]);
|
||||||
p->element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32;
|
p->element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32;
|
||||||
p->dimensions = sqlite3_value_int64(argv[2]);
|
p->dimensions = sqlite3_value_int64(argv[2]);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue