Skip to content

Commit c632ea4

Browse files
authored
Merge pull request #65 from mindsdb/fix-kw-spaces
Expect spaces between keywords
2 parents 78e1382 + 96e4ba0 commit c632ea4

File tree

6 files changed

+27
-24
lines changed

6 files changed

+27
-24
lines changed

mindsdb_sql_parser/lexer.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ class MindsDBLexer(Lexer):
127127
ANOMALY = r'\bANOMALY\b'
128128
DETECTION = r'\bDETECTION\b'
129129

130-
KNOWLEDGE_BASE = r'\bKNOWLEDGE[_|\s]BASE\b'
131-
KNOWLEDGE_BASES = r'\bKNOWLEDGE[_|\s]BASES\b'
130+
KNOWLEDGE_BASE = r'\bKNOWLEDGE([_]|[\s]+)BASE\b'
131+
KNOWLEDGE_BASES = r'\bKNOWLEDGE([_]|[\s]+)BASES\b'
132132
SKILL = r'\bSKILL\b'
133133
AGENT = r'\bAGENT\b'
134134

@@ -168,7 +168,7 @@ class MindsDBLexer(Lexer):
168168
STATUS = r'\bSTATUS\b'
169169
GLOBAL = r'\bGLOBAL\b'
170170
PROCEDURE = r'\bPROCEDURE\b'
171-
PRIMARY_KEY = r'\bPRIMARY[\s]KEY\b'
171+
PRIMARY_KEY = r'\bPRIMARY[\s]+KEY\b'
172172
DEFAULT = r'\bDEFAULT\b'
173173
FUNCTION = r'\bFUNCTION\b'
174174
INDEX = r'\bINDEX\b'
@@ -215,8 +215,8 @@ class MindsDBLexer(Lexer):
215215
ON = r'\bON\b'
216216
ASC = r'\bASC\b'
217217
DESC = r'\bDESC\b'
218-
NULLS_FIRST = r'\bNULLS FIRST\b'
219-
NULLS_LAST = r'\bNULLS LAST\b'
218+
NULLS_FIRST = r'\bNULLS[\s]+FIRST\b'
219+
NULLS_LAST = r'\bNULLS[\s]+LAST\b'
220220
WITH = r'\bWITH\b'
221221
SELECT = r'\bSELECT\b'
222222
DISTINCT = r'\bDISTINCT\b'
@@ -225,15 +225,15 @@ class MindsDBLexer(Lexer):
225225
WHERE = r'\bWHERE\b'
226226
LIMIT = r'\bLIMIT\b'
227227
OFFSET = r'\bOFFSET\b'
228-
GROUP_BY = r'\bGROUP BY\b'
228+
GROUP_BY = r'\bGROUP[\s]+BY\b'
229229
HAVING = r'\bHAVING\b'
230-
ORDER_BY = r'\bORDER BY\b'
230+
ORDER_BY = r'\bORDER[\s]+BY\b'
231231
STAR = r'\*'
232232
FOR = r'\bFOR\b'
233233
UPDATE = r'\bUPDATE\b'
234234
# FETCH FIRST and FETCH NEXT are the same
235-
FETCH_FIRST = r'\bFETCH[\s](FIRST|NEXT)\b'
236-
ROWS_ONLY = r'\bROWS[\s]ONLY\b'
235+
FETCH_FIRST = r'\bFETCH[\s]+(FIRST|NEXT)\b'
236+
ROWS_ONLY = r'\bROWS[\s]+ONLY\b'
237237
ROLLUP = r'\bROLLUP\b'
238238

239239
JOIN = r'\bJOIN\b'
@@ -330,7 +330,7 @@ class MindsDBLexer(Lexer):
330330
INTERVAL = r'\bINTERVAL\b'
331331
WINDOW = r'\bWINDOW\b'
332332
OVER = r'\bOVER\b'
333-
PARTITION_BY = r'\bPARTITION BY\b'
333+
PARTITION_BY = r'\bPARTITION[\s]+BY\b'
334334

335335
# Data types
336336
NULL = r'\bNULL\b'

mindsdb_sql_parser/parser.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import re
2+
13
from sly import Parser
24
from mindsdb_sql_parser.ast import *
35
from mindsdb_sql_parser.ast.drop import DropDatabase, DropView
@@ -559,7 +561,8 @@ def show(self, p):
559561
def show(self, p):
560562
modes = getattr(p, 'show_modifier_list', None)
561563
return Show(
562-
category=p.show_category,
564+
# replace multiple spaces
565+
category=re.sub(r"[\s]+", " ", p.show_category),
563566
modes=modes
564567
)
565568

@@ -1195,12 +1198,12 @@ def ordering_terms(self, p):
11951198

11961199
@_('ordering_term NULLS_FIRST')
11971200
def ordering_term(self, p):
1198-
p.ordering_term.nulls = p.NULLS_FIRST
1201+
p.ordering_term.nulls = 'NULLS FIRST'
11991202
return p.ordering_term
12001203

12011204
@_('ordering_term NULLS_LAST')
12021205
def ordering_term(self, p):
1203-
p.ordering_term.nulls = p.NULLS_LAST
1206+
p.ordering_term.nulls = 'NULLS LAST'
12041207
return p.ordering_term
12051208

12061209
@_('ordering_term DESC')

tests/test_base_sql/test_create.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_create(self):
113113

114114
sql = f'''
115115
CREATE TABLE mydb.Persons(
116-
PersonID INT PRIMARY KEY,
116+
PersonID INT PRIMARY KEY,
117117
name TEXT NULL
118118
)
119119
'''

tests/test_base_sql/test_select_structure.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def test_select_group_by(self):
294294
ast = parse_sql(sql)
295295
assert str(ast).lower() == sql.lower()
296296

297-
sql = f'SELECT column FROM tab WHERE column != 1 GROUP BY column1, column2'
297+
sql = f'SELECT column FROM tab WHERE column != 1 GROUP BY column1, column2'
298298
ast = parse_sql(sql)
299299

300300
assert isinstance(ast, Select)
@@ -314,7 +314,7 @@ def test_select_group_by(self):
314314
assert isinstance(ast.group_by[1], Identifier)
315315
assert ast.group_by[1].parts[0] == 'column2'
316316

317-
assert str(ast).lower() == sql.lower()
317+
assert str(ast).lower() == sql.lower().replace(" ", " ")
318318

319319
def test_select_group_by_elaborate(self):
320320
query = """SELECT column1, column2, sum(column3) AS total FROM t1 GROUP BY column1, column2"""
@@ -356,7 +356,7 @@ def test_select_group_by_having_elaborate(self):
356356
assert str(parse_sql(sql)) == sql
357357

358358
def test_select_order_by_elaborate(self):
359-
sql = """SELECT * FROM t1 ORDER BY column1 ASC, column2, column3 DESC NULLS FIRST"""
359+
sql = """SELECT * FROM t1 ORDER BY column1 ASC, column2, column3 DESC NULLS FIRST"""
360360
ast = parse_sql(sql)
361361
expected_ast = Select(targets=[Star()],
362362
from_table=Identifier(parts=['t1']),
@@ -367,18 +367,18 @@ def test_select_order_by_elaborate(self):
367367
nulls='NULLS FIRST')],
368368
)
369369

370-
assert str(ast).lower() == sql.lower()
370+
assert str(ast).lower() == sql.replace(" ", " ").lower()
371371
assert ast.to_tree() == expected_ast.to_tree()
372372
assert str(ast) == str(expected_ast)
373373

374374
def test_select_aliases_order_by(self):
375-
sql = "select max(name) as `max(name)` from tbl order by `max(name)`"
375+
sql = "select max(name) as `max(name)` from tbl order by `max(name)` NULLS LAST"
376376

377377
ast = parse_sql(sql)
378378

379379
expected_ast = Select(targets=[Function('max', args=[Identifier('name')], alias=Identifier('max(name)'))],
380380
from_table=Identifier('tbl'),
381-
order_by=[OrderBy(Identifier('max(name)'))])
381+
order_by=[OrderBy(Identifier('max(name)'), nulls='NULLS LAST')])
382382

383383
assert ast.to_tree() == expected_ast.to_tree()
384384

@@ -829,7 +829,7 @@ def test_window_function(self):
829829
assert ast.to_tree() == expected_ast.to_tree()
830830

831831
# no order by
832-
query = "select SUM(col0) OVER (PARTITION BY col1) from table1 "
832+
query = "select SUM(col0) OVER (PARTITION BY col1) from table1 "
833833
expected_ast = Select(
834834
targets=[
835835
WindowFunction(

tests/test_mindsdb/test_knowledgebase.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def test_create_knowledge_base(self):
5252

5353
# the order of MODEL and STORAGE should not matter
5454
sql = """
55-
CREATE KNOWLEDGE_BASE my_knowledge_base
55+
CREATE KNOWLEDGE BASE my_knowledge_base
5656
USING
5757
STORAGE = my_vector_database.some_table,
5858
MODEL = mindsdb.my_embedding_model
@@ -224,7 +224,7 @@ def test_show_knowledge_base(self):
224224

225225
# without underscore shall also work
226226
sql = """
227-
SHOW KNOWLEDGE BASES
227+
SHOW KNOWLEDGE \n BASES
228228
"""
229229
ast = parse_sql(sql)
230230
expected_ast = Show(

tests/test_mindsdb/test_oracle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_left_outer_join_render_skip(self):
2929

3030
def test_limit(self):
3131
for keyword in ('NEXT', 'FIRST'):
32-
sql = f"SELECT * FROM customer FETCH {keyword} 10 ROWS ONLY"
32+
sql = f"SELECT * FROM customer FETCH {keyword} 10 ROWS ONLY"
3333

3434
ast = parse_sql(sql)
3535
expected_ast = Select(

0 commit comments

Comments
 (0)