Skip to content

Commit e79159b

Browse files
authored
Merge pull request #74 from mindsdb/named-parameters
Named parameters support
2 parents 34763e5 + b8f033c commit e79159b

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
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.13.1'
3+
__version__ = '0.13.2'
44
__description__ = "Mindsdb SQL parser"
55
__email__ = "[email protected]"
66
__author__ = 'MindsDB Inc'

mindsdb_sql_parser/lexer.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ class MindsDBLexer(Lexer):
272272
COMMA = r','
273273
LPAREN = r'\('
274274
RPAREN = r'\)'
275-
PARAMETER = r'\?'
276275

277276
ASSIGN_COLON = r':='
278277

@@ -281,7 +280,6 @@ class MindsDBLexer(Lexer):
281280
RBRACE = r'\}'
282281
LBRACKET = r'\['
283282
RBRACKET = r'\]'
284-
COLON = r'\:'
285283
SEMICOLON = r'\;'
286284

287285
# Operators
@@ -337,6 +335,13 @@ class MindsDBLexer(Lexer):
337335
TRUE = r'\bTRUE\b'
338336
FALSE = r'\bFALSE\b'
339337

338+
@_(r':[a-zA-Z]{1}[a-zA-Z_\d]*', r'\?')
339+
def PARAMETER(self, t):
340+
t.value = t.value.lstrip(':')
341+
return t
342+
343+
COLON = r'\:'
344+
340345
@_(r'(?:([a-zA-Z_$0-9]*[a-zA-Z_$]+[a-zA-Z_$0-9]*)|(?:`([^`]+)`))')
341346
def ID(self, t):
342347
return t

tests/test_base_sql/test_parameters.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from mindsdb_sql_parser import parse_sql
22
from mindsdb_sql_parser.ast import *
33

4+
45
class TestParameters:
56
def test_select_with_parameter_in_where(self):
67
sql = "SELECT * FROM tbl WHERE col = ?"
@@ -25,4 +26,28 @@ def test_insert_with_multiple_parameter_rows(self):
2526
def test_select_parameter_as_target(self):
2627
sql = "SELECT ?"
2728
ast = parse_sql(sql)
28-
assert str(ast) == sql
29+
assert str(ast) == sql
30+
31+
def test_named_parameters(self):
32+
sql = "SELECT :a, max(1-:second_param), ? from t where x=:col_1"
33+
ast = parse_sql(sql)
34+
35+
expected = Select(
36+
targets=[
37+
Parameter("a"),
38+
Function("max", args=[
39+
BinaryOperation(op="-", args=[
40+
Constant(1),
41+
Parameter("second_param")
42+
])
43+
]),
44+
Parameter("?")
45+
],
46+
from_table=Identifier("t"),
47+
where=BinaryOperation(op="=", args=[
48+
Identifier("x"),
49+
Parameter("col_1")
50+
])
51+
)
52+
53+
assert str(ast) == str(expected)

0 commit comments

Comments
 (0)