Skip to content

Commit 641de7f

Browse files
committed
Add Support for Parameterized Queries issue fixed
1 parent 16c9401 commit 641de7f

File tree

2 files changed

+79
-5
lines changed

2 files changed

+79
-5
lines changed
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from mindsdb_sql_parser.ast.base import ASTNode
2+
from mindsdb_sql_parser.utils import indent
23

34

45
class Parameter(ASTNode):
56
def __init__(self, value, *args, **kwargs):
67
super().__init__(*args, **kwargs)
78
self.value = value
89

9-
def __repr__(self):
10-
return f'Parameter({self.value})'
11-
1210
def to_tree(self, *args, level=0, **kwargs):
13-
return '\t' * level + f'Parameter({repr(self.value)})'
11+
alias_str = f', alias={self.alias.to_tree()}' if self.alias else ''
12+
return indent(level) + f'Parameter(value={repr(self.value)}{alias_str})'
1413

1514
def get_string(self, *args, **kwargs):
16-
return ':' + str(self.value)
15+
return str(self.value)
16+
17+
def __repr__(self):
18+
return f'Parameter({repr(self.value)})'
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from mindsdb_sql_parser import parse_sql
2+
from mindsdb_sql_parser.ast import *
3+
4+
class TestParameters:
5+
def test_select_with_parameter_in_where(self):
6+
sql = "SELECT * FROM tbl WHERE col = ?"
7+
ast = parse_sql(sql)
8+
expected_ast = Select(
9+
targets=[Star()],
10+
from_table=Identifier('tbl'),
11+
where=BinaryOperation(op='=', args=[
12+
Identifier('col'),
13+
Parameter('?')
14+
])
15+
)
16+
assert ast.to_tree() == expected_ast.to_tree()
17+
assert str(ast) == str(expected_ast)
18+
19+
def test_select_multiple_parameters(self):
20+
sql = "SELECT * FROM tbl WHERE col1 > ? AND col2 = ?"
21+
ast = parse_sql(sql)
22+
expected_ast = Select(
23+
targets=[Star()],
24+
from_table=Identifier('tbl'),
25+
where=BinaryOperation(op='and', args=[
26+
BinaryOperation(op='>', args=[
27+
Identifier('col1'),
28+
Parameter('?')
29+
]),
30+
BinaryOperation(op='=', args=[
31+
Identifier('col2'),
32+
Parameter('?')
33+
])
34+
])
35+
)
36+
assert ast.to_tree() == expected_ast.to_tree()
37+
assert str(ast) == str(expected_ast)
38+
39+
def test_insert_with_parameters(self):
40+
sql = "INSERT INTO tbl_name(a, c) VALUES (?, ?)"
41+
ast = parse_sql(sql)
42+
expected_ast = Insert(
43+
table=Identifier('tbl_name'),
44+
columns=[Identifier('a'), Identifier('c')],
45+
values=[
46+
[Parameter('?'), Parameter('?')]
47+
]
48+
)
49+
assert ast.to_tree() == expected_ast.to_tree()
50+
assert str(ast) == str(expected_ast)
51+
52+
def test_insert_with_multiple_parameter_rows(self):
53+
sql = "INSERT INTO tbl_name VALUES (?, ?), (?, ?)"
54+
ast = parse_sql(sql)
55+
expected_ast = Insert(
56+
table=Identifier('tbl_name'),
57+
values=[
58+
[Parameter('?'), Parameter('?')],
59+
[Parameter('?'), Parameter('?')]
60+
]
61+
)
62+
assert ast.to_tree() == expected_ast.to_tree()
63+
assert str(ast) == str(expected_ast)
64+
65+
def test_select_parameter_as_target(self):
66+
sql = "SELECT ?"
67+
ast = parse_sql(sql)
68+
expected_ast = Select(
69+
targets=[Parameter('?')]
70+
)
71+
assert ast.to_tree() == expected_ast.to_tree()
72+
assert str(ast) == str(expected_ast)

0 commit comments

Comments
 (0)