From f12be5292b634e8014f442b53439286459dcaac4 Mon Sep 17 00:00:00 2001 From: Alex Garcia Date: Wed, 13 Nov 2024 22:26:06 -0800 Subject: [PATCH] finish type checking --- sqlite-vec.c | 12 ++++++++++-- tests/__snapshots__/test-metadata.ambr | 26 +++++++++++++++----------- tests/test-metadata.py | 12 ++++++++---- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/sqlite-vec.c b/sqlite-vec.c index c981465..5615a96 100644 --- a/sqlite-vec.c +++ b/sqlite-vec.c @@ -7334,11 +7334,19 @@ int vec0_insert_metadata_values(vec0_vtab *p, int argc, sqlite3_value ** argv, i break; } case VEC0_METADATA_COLUMN_KIND_FLOAT: { - // TODO verify v is SQLITE_FLOAT + if(sqlite3_value_type(v) != SQLITE_FLOAT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected float for FLOAT metadata column %.*s, received %s", p->metadata_columns[metadata_idx].name_length, p->metadata_columns[metadata_idx].name, type_name(sqlite3_value_type(v))); + goto done; + } break; } case VEC0_METADATA_COLUMN_KIND_TEXT: { - // TODO verify v is SQLITE_TEXT + if(sqlite3_value_type(v) != SQLITE_TEXT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected text for TEXT metadata column %.*s, received %s", p->metadata_columns[metadata_idx].name_length, p->metadata_columns[metadata_idx].name, type_name(sqlite3_value_type(v))); + goto done; + } break; } } diff --git a/tests/__snapshots__/test-metadata.ambr b/tests/__snapshots__/test-metadata.ambr index 226812a..973c1e3 100644 --- a/tests/__snapshots__/test-metadata.ambr +++ b/tests/__snapshots__/test-metadata.ambr @@ -1154,24 +1154,28 @@ 'message': 'Expected 0 or 1 for BOOLEAN metadata column b', }) # --- -# name: test_types[illegal-float] - OrderedDict({ - 'sql': 'insert into v(vector, b, n, f, t) values (?, ?, ?, ?, ?)', - 'rows': list([ - ]), +# name: test_types[illegal-type-boolean] + dict({ + 'error': 'OperationalError', + 'message': 'Expected 0 or 1 for BOOLEAN metadata column b', }) # --- -# name: test_types[illegal-int] +# name: test_types[illegal-type-float] + dict({ + 'error': 'OperationalError', + 'message': 'Expected float for FLOAT metadata column f, received TEXT', + }) +# --- +# name: test_types[illegal-type-int] dict({ 'error': 'OperationalError', 'message': 'Expected integer for INTEGER metadata column n, received TEXT', }) # --- -# name: test_types[illegal-text] - OrderedDict({ - 'sql': 'insert into v(vector, b, n, f, t) values (?, ?, ?, ?, ?)', - 'rows': list([ - ]), +# name: test_types[illegal-type-text] + dict({ + 'error': 'OperationalError', + 'message': 'Expected text for TEXT metadata column t, received INTEGER', }) # --- # name: test_types[legal] diff --git a/tests/test-metadata.py b/tests/test-metadata.py index 4cb330b..b60c4d9 100644 --- a/tests/test-metadata.py +++ b/tests/test-metadata.py @@ -55,12 +55,16 @@ def test_types(db, snapshot): ) # fmt: off - assert exec(db, INSERT, [b"\x11\x11\x11\x11", 'illegal', 1, 1.1, 'test']) == snapshot(name="illegal-boolean") - assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 'illegal', 1.1, 'test']) == snapshot(name="illegal-int") - assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 1, 'illegal', 'test']) == snapshot(name="illegal-float") - assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 1, 1.1, 420]) == snapshot(name="illegal-text") + assert exec(db, INSERT, [b"\x11\x11\x11\x11", 'illegal', 1, 1.1, 'test']) == snapshot(name="illegal-type-boolean") + assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 'illegal', 1.1, 'test']) == snapshot(name="illegal-type-int") + assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 1, 'illegal', 'test']) == snapshot(name="illegal-type-float") + assert exec(db, INSERT, [b"\x11\x11\x11\x11", 1, 1, 1.1, 420]) == snapshot(name="illegal-type-text") # fmt: on + assert exec(db, INSERT, [b"\x11\x11\x11\x11", 44, 1, 1.1, "test"]) == snapshot( + name="illegal-boolean" + ) + def test_updates(db, snapshot): pass