From 7b3c62d1b673e37d2817c6046242ad8e7bf281c0 Mon Sep 17 00:00:00 2001 From: Gatefixer <313497061+lancedb-gatefixer[bot]@users.noreply.github.com> Date: Sat, 3 Oct 2026 02:40:59 +0000 Subject: [PATCH] fix(python): preserve automatic remote full-text search fallback --- python/python/lancedb/remote/table.py | 6 +++++ python/python/tests/test_remote_db.py | 38 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/python/python/lancedb/remote/table.py b/python/python/lancedb/remote/table.py index c3f521509..19a443950 100644 --- a/python/python/lancedb/remote/table.py +++ b/python/python/lancedb/remote/table.py @@ -757,6 +757,12 @@ class RemoteTable(Table): """ if isinstance(query, FullTextQuery): query_type = "fts" + elif ( + query_type == "auto" + and isinstance(query, str) + and not self.embedding_functions + ): + query_type = "fts" vector_column_name = infer_vector_column_name( schema=self.schema, query_type=query_type, diff --git a/python/python/tests/test_remote_db.py b/python/python/tests/test_remote_db.py index d846a0120..97504085e 100644 --- a/python/python/tests/test_remote_db.py +++ b/python/python/tests/test_remote_db.py @@ -17,6 +17,7 @@ from packaging.version import Version import lancedb from lancedb.conftest import MockTextEmbeddingFunction +from lancedb.embeddings import EmbeddingFunctionConfig from lancedb.query import ColumnOrdering, MatchQuery from lancedb.remote import ClientConfig from lancedb.remote.errors import HttpError, RetryError @@ -1547,6 +1548,43 @@ def test_query_sync_rejects_ambiguous_vector_column(mem_db): assert str(remote_error.value) == str(local_error.value) +@pytest.mark.parametrize("vector_columns", [(), (("v1", 4), ("v2", 8))]) +@pytest.mark.parametrize("query_type", ["auto", "fts"]) +def test_query_sync_fts_without_embeddings(vector_columns, query_type): + seen = [] + + def handler(body): + seen.append(body) + assert body["full_text_query"] == {"query": "hello", "columns": []} + assert body["vector"] == [] + assert "vector_column" not in body + return pa.table({"id": [1]}) + + with query_test_table(handler, vector_columns=vector_columns) as table: + assert table.search("hello", query_type=query_type).to_list() == [{"id": 1}] + assert len(seen) == 1 + + +def test_query_sync_auto_with_embedding_function(): + def handler(body): + assert body["vector_column"] == "vector" + assert body["vector"] == [0.0] * 10 + assert "full_text_query" not in body + return pa.table({"id": [1]}) + + with query_test_table(handler, vector_columns=(("vector", 10),)) as table: + table.embedding_functions = { + "vector": EmbeddingFunctionConfig( + source_column="text", + vector_column="vector", + function=MockTextEmbeddingFunction(), + ) + } + query = table.search("hello") + assert query.to_query_object().vector_column == "vector" + assert query.to_list() == [{"id": 1}] + + def test_head(): def handler(body): assert body == {