Skip to content

Commit fb76cb9

Browse files
committed
Allow un-quoted skip index parameters
Previously, only this syntax to create a skip index worked: INDEX index_name column_name TYPE vector_similarity('hnsw', 'L2Distance') Now, this syntax will work as well: INDEX index_name column_name TYPE vector_similarity(hnsw, L2Distance)
1 parent d2e79f0 commit fb76cb9

File tree

4 files changed

+46
-4
lines changed

4 files changed

+46
-4
lines changed

docs/en/engines/table-engines/mergetree-family/annindexes.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ CREATE TABLE table
4343
(
4444
id Int64,
4545
vectors Array(Float32),
46-
INDEX index_name vec TYPE vector_similarity(method, distance_function[, quantization, connectivity, expansion_add, expansion_search]) [GRANULARITY N]
46+
INDEX index_name vectors TYPE vector_similarity(method, distance_function[, quantization, connectivity, expansion_add, expansion_search]) [GRANULARITY N]
4747
)
4848
ENGINE = MergeTree
4949
ORDER BY id;
@@ -59,6 +59,19 @@ Parameters:
5959
- `ef_construction`: (optional, default: 128)
6060
- `ef_search`: (optional, default: 64)
6161

62+
Example:
63+
64+
```sql
65+
CREATE TABLE table
66+
(
67+
id Int64,
68+
vectors Array(Float32),
69+
INDEX idx vectors TYPE vector_similarity('hnsw', 'L2Distance') -- Alternative syntax: TYPE vector_similarity(hnsw, L2Distance)
70+
)
71+
ENGINE = MergeTree
72+
ORDER BY id;
73+
```
74+
6275
Vector similarity indexes are based on the [USearch library](https://github.com/unum-cloud/usearch), which implements the [HNSW
6376
algorithm](https://arxiv.org/abs/1603.09320), i.e., a hierarchical graph where each point represents a vector and the edges represent
6477
similarity. Such hierarchical structures can be very efficient on large collections. They may often fetch 0.05% or less data from the

src/Storages/IndicesDescription.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <Storages/IndicesDescription.h>
44

55
#include <Parsers/ASTFunction.h>
6+
#include <Parsers/ASTIdentifier.h>
67
#include <Parsers/ASTIndexDeclaration.h>
78
#include <Parsers/ASTLiteral.h>
89
#include <Parsers/ParserCreateQuery.h>
@@ -130,10 +131,15 @@ IndexDescription IndexDescription::getIndexFromAST(const ASTPtr & definition_ast
130131
{
131132
for (size_t i = 0; i < index_type->arguments->children.size(); ++i)
132133
{
133-
const auto * argument = index_type->arguments->children[i]->as<ASTLiteral>();
134-
if (!argument)
134+
const auto & child = index_type->arguments->children[i];
135+
if (const auto * ast_literal = child->as<ASTLiteral>(); ast_literal != nullptr)
136+
/// E.g. INDEX index_name column_name TYPE vector_similarity('hnsw', 'f32')
137+
result.arguments.emplace_back(ast_literal->value);
138+
else if (const auto * ast_identifier = child->as<ASTIdentifier>(); ast_identifier != nullptr)
139+
/// E.g. INDEX index_name column_name TYPE vector_similarity(hnsw, f32)
140+
result.arguments.emplace_back(ast_identifier->name());
141+
else
135142
throw Exception(ErrorCodes::INCORRECT_QUERY, "Only literals can be skip index arguments");
136-
result.arguments.emplace_back(argument->value);
137143
}
138144
}
139145

tests/queries/0_stateless/02354_vector_search_unquoted_index_parameters.reference

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-- Tags: no-fasttest, no-ordinary-database
2+
3+
SET allow_experimental_vector_similarity_index = 1;
4+
5+
-- Tests that quoted and unquoted parameters can be passed to vector search indexes.
6+
7+
DROP TABLE IF EXISTS tab1;
8+
DROP TABLE IF EXISTS tab2;
9+
10+
CREATE TABLE tab1 (id Int32, vec Array(Float32), PRIMARY KEY id, INDEX vec_idx(vec) TYPE vector_similarity('hnsw', 'L2Distance'));
11+
CREATE TABLE tab2 (id Int32, vec Array(Float32), PRIMARY KEY id, INDEX vec_idx(vec) TYPE vector_similarity(hnsw, L2Distance));
12+
13+
DROP TABLE tab1;
14+
DROP TABLE tab2;
15+
16+
CREATE TABLE tab1 (id Int32, vec Array(Float32), PRIMARY KEY id);
17+
CREATE TABLE tab2 (id Int32, vec Array(Float32), PRIMARY KEY id);
18+
19+
ALTER TABLE tab1 ADD INDEX idx1(vec) TYPE vector_similarity('hnsw', 'L2Distance');
20+
ALTER TABLE tab2 ADD INDEX idx2(vec) TYPE vector_similarity(hnsw, L2Distance);
21+
22+
DROP TABLE tab1;
23+
DROP TABLE tab2;

0 commit comments

Comments
 (0)