Skip to content

Commit ee52445

Browse files
committed
support pgvector operators
1 parent 239cd4e commit ee52445

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

mindsdb_sql_parser/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__title__ = 'mindsdb_sql_parser'
22
__package_name__ = 'mindsdb_sql_parser'
3-
__version__ = '0.3.1'
3+
__version__ = '0.4.0'
44
__description__ = "Mindsdb SQL parser"
55
__email__ = "[email protected]"
66
__author__ = 'MindsDB Inc'

mindsdb_sql_parser/lexer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class MindsDBLexer(Lexer):
7373
EQUALS, NEQUALS, GREATER, GEQ, LESS, LEQ,
7474
AND, OR, NOT, IS, IS_NOT, TYPECAST,
7575
IN, NOT_IN, LIKE, NOT_LIKE, CONCAT, BETWEEN, WINDOW, OVER, PARTITION_BY,
76+
VECT_L2, VECT_L1, VECT_INNER, VECT_COS, VECT_HAMM, VECT_JACC,
7677
JSON_GET, JSON_GET_STR, INTERVAL,
7778

7879
# Data types
@@ -272,6 +273,13 @@ class MindsDBLexer(Lexer):
272273
SEMICOLON = r'\;'
273274

274275
# Operators
276+
VECT_L2 = r'<->'
277+
VECT_L1 = r'<\+>'
278+
VECT_INNER = r'<#>'
279+
VECT_COS = r'<=>'
280+
VECT_HAMM = r'<~>'
281+
VECT_JACC = r'<%>'
282+
275283
JSON_GET = r'->'
276284
JSON_GET_STR = r'->>'
277285
PLUS = r'\+'

mindsdb_sql_parser/parser.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,6 +1572,12 @@ def star(self, p):
15721572
'expr LIKE expr',
15731573
'expr NOT_LIKE expr',
15741574
'expr CONCAT expr',
1575+
'expr VECT_L2 expr',
1576+
'expr VECT_L1 expr',
1577+
'expr VECT_INNER expr',
1578+
'expr VECT_COS expr',
1579+
'expr VECT_HAMM expr',
1580+
'expr VECT_JACC expr',
15751581
'expr JSON_GET constant',
15761582
'expr JSON_GET_STR constant',
15771583
'expr NOT_IN expr',

tests/test_mindsdb/test_selects.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from mindsdb_sql_parser import parse_sql
23
from mindsdb_sql_parser.ast import *
34
from mindsdb_sql_parser.utils import JoinType
@@ -188,6 +189,26 @@ def test_json(self):
188189
assert ast.to_tree() == expected_ast.to_tree()
189190
assert str(ast) == str(expected_ast)
190191

192+
@pytest.mark.parametrize('op', ['<->', '<+>', '<#>', '<=>', '<~>', '<%>'])
193+
def test_vector(self, op):
194+
sql = f"SELECT * from TAB1 WHERE embedding {op} '[3,1,2]'"
195+
196+
ast = parse_sql(sql)
197+
expected_ast = Select(
198+
targets=[Star()],
199+
where=BinaryOperation(
200+
op=op,
201+
args=[
202+
Identifier('embedding'),
203+
Constant('[3,1,2]')
204+
]
205+
),
206+
from_table=Identifier(parts=['TAB1']),
207+
)
208+
209+
assert ast.to_tree() == expected_ast.to_tree()
210+
assert str(ast) == str(expected_ast)
211+
191212
def test_match(self):
192213
sql = "SELECT a~b, a!~c from TAB1"
193214

0 commit comments

Comments
 (0)