Skip to content

Commit 939e17f

Browse files
authored
Merge pull request #8 from qidi1/format_bug_fix
add format for sound_like window_function and fix parserutils bug
2 parents c930736 + b0d5783 commit 939e17f

File tree

13 files changed

+5552
-5442
lines changed

13 files changed

+5552
-5442
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
44

55
[project]
66
name = "sqlgpt-parser"
7-
version = "0.0.1a4"
7+
version = "0.0.1a5"
88
authors = [
99
{ name="luliwjc", email="[email protected]" },
1010
{ name="Ifffff", email="[email protected]" },

sqlgpt_parser/format/formatter.py

+49-14
Original file line numberDiff line numberDiff line change
@@ -421,24 +421,33 @@ def visit_list_expression(self, node, unmangle_names):
421421
else:
422422
return "(%s)" % self._join_expressions(node.values, unmangle_names)
423423

424+
def visit_window_func(self, node, unmangle_names):
425+
args = ", ".join([self.process(arg, unmangle_names) for arg in node.func_args])
426+
ignore_null = f" {node.ignore_null} NULLS" if node.ignore_null else ""
427+
window_spec = " OVER " + self.process(node.window_spec, unmangle_names)
428+
return f"{node.func_name.upper()}({args}){ignore_null}{window_spec}"
429+
424430
def visit_window_spec(self, node, unmangle_names):
425-
parts = []
431+
if node.window_name is not None:
432+
return node.window_name
426433

434+
parts = []
427435
if node.partition_by:
428-
parts.append(
429-
"PARTITION BY "
430-
+ self._join_expressions(node.partition_by, unmangle_names)
431-
)
436+
self.process(node.partition_by, unmangle_names)
432437
if node.order_by:
433438
parts.append("ORDER BY " + format_sort_items(node.order_by, unmangle_names))
434-
if node.frame:
435-
parts.append(self.process(node.frame, unmangle_names))
436-
439+
if node.frame_clause:
440+
parts.append(self.process(node.frame_clause, unmangle_names))
437441
return '(' + ' '.join(parts) + ')'
438442

439-
def visit_window_frame(self, node, unmangle_names):
440-
ret = node.type + " "
443+
def visit_partition_by_clause(self, node, unmangle_names):
444+
return "PARTITION BY " + self._join_expressions(node.items, unmangle_names)
445+
446+
def visit_frame_clause(self, node, unmangle_names):
447+
return f"{node.type} {self.process(node.frame_range, unmangle_names)}"
441448

449+
def visit_window_frame(self, node, unmangle_names):
450+
ret = ""
442451
if node.end:
443452
ret += "BETWEEN %s AND %s" % (
444453
self.process(node.start, unmangle_names),
@@ -449,6 +458,19 @@ def visit_window_frame(self, node, unmangle_names):
449458

450459
return ret
451460

461+
def visit_frame_bound(self, node, unmangle_names):
462+
if node.type.upper() == "ROW":
463+
return "CURRENT ROW"
464+
expr = (
465+
self.process(node.expr, unmangle_names)
466+
if node.expr is not None
467+
else "UNBOUNDED "
468+
)
469+
return f"{expr} {node.type.upper()}"
470+
471+
def visit_frame_expr(self, node, unmangle_names):
472+
return self.process(node.value, unmangle_names)
473+
452474
def visit_single_column(self, node, indent):
453475
format_expression(node.expression)
454476

@@ -468,6 +490,9 @@ def visit_match_against_expression(self, node, unmangle_names):
468490
full_text_search_modifier = full_text_search_modifier.upper()
469491
return f"MATCH({columns}) AGAINST ({self.process(node.expr, unmangle_names)}{full_text_search_modifier})"
470492

493+
def visit_sound_like(self, node, unmangle_names):
494+
return f"{self.process(node.arguments[0])} SOUNDS LIKE {self.process(node.arguments[1])}"
495+
471496
def _format_binary_expression(self, operator, left, right, unmangle_names):
472497
return "%s %s %s" % (
473498
self.process(left, unmangle_names),
@@ -689,13 +714,14 @@ def visit_table_subquery(self, node, indent):
689714
return None
690715

691716
def visit_union(self, node, indent):
692-
all = node.all
693717
for i, relation in enumerate(node.relations):
694718
self._process_relation(relation, indent)
695719
self.builder.append("\n")
696720
if i != len(node.relations) - 1:
697-
if all:
721+
if node.all:
698722
self._append(indent, "UNION ALL")
723+
elif node.distinct:
724+
self._append(indent, "UNION DISTINCT")
699725
else:
700726
self._append(indent, "UNION")
701727
self.builder.append("\n")
@@ -704,7 +730,12 @@ def visit_union(self, node, indent):
704730

705731
def visit_except(self, node, indent):
706732
self._process_relation(node.left, indent)
707-
self.builder.append("EXCEPT " + "ALL " if not node.distinct else "")
733+
if node.all is not None:
734+
self._append(indent, "EXCEPT ALL")
735+
elif node.distinct is not None:
736+
self._append(indent, "EXCEPT DISTINCT")
737+
else:
738+
self._append(indent, "EXCEPT")
708739
self._process_relation(node.right, indent)
709740

710741
return None
@@ -756,7 +787,11 @@ def visit_intersect(self, node, indent):
756787
relations = [
757788
self._process_relation(relation, indent) for relation in node.relations
758789
]
759-
intersect = "INTERSECT " + "ALL " if not node.distinct else ""
790+
intersect = "INTERSECT"
791+
if node.all is not None:
792+
intersect += " ALL"
793+
elif node.distinct is not None:
794+
intersect += " DISTINCT"
760795
self.builder.append(intersect.join(relations))
761796
return None
762797

sqlgpt_parser/parser/mysql_parser/parser.py

+10-12
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,7 @@ def p_alias_opt(p):
12061206
if p.slice[1].type == "alias":
12071207
p[0] = p[1]
12081208
else:
1209-
p[0] = ()
1209+
p[0] = []
12101210

12111211

12121212
def p_alias(p):
@@ -1215,9 +1215,9 @@ def p_alias(p):
12151215
| AS string_lit
12161216
| string_lit"""
12171217
if len(p) == 3:
1218-
p[0] = (p[1], p[2])
1218+
p[0] = [p[1], p[2]]
12191219
else:
1220-
p[0] = p[1]
1220+
p[0] = [p[1]]
12211221

12221222

12231223
def p_expression(p):
@@ -1570,7 +1570,7 @@ def p_window_func_call(p):
15701570
| ROW_NUMBER LPAREN RPAREN over_clause
15711571
"""
15721572
length = len(p)
1573-
window_spec = p[-1]
1573+
window_spec = p[length-1]
15741574
args = []
15751575
ignore_null = None
15761576

@@ -1711,7 +1711,10 @@ def p_frame_start(p):
17111711
| frame_expr PRECEDING
17121712
| frame_expr FOLLOWING
17131713
"""
1714-
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1714+
if p.slice[1].type == 'frame_expr':
1715+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1716+
else:
1717+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=None)
17151718

17161719

17171720
def p_frame_end(p):
@@ -1726,13 +1729,8 @@ def p_frame_between(p):
17261729

17271730
def p_frame_expr(p):
17281731
r"""frame_expr : figure
1729-
| QM
1730-
| INTERVAL expression time_unit
1731-
|"""
1732-
if len(p) == 4:
1733-
p[0] = FrameExpr(p.lineno(1), p.lexpos(1), value=p[2], unit=p[3])
1734-
else:
1735-
p[0] = FrameExpr(p.lineno(1), p.lexpos(1), value=p[1])
1732+
| time_interval"""
1733+
p[0] = FrameExpr(p.lineno(1), p.lexpos(1), value=p[1])
17361734

17371735

17381736
def p_lead_lag_info_opt(p):

sqlgpt_parser/parser/mysql_parser/parser_table.py

+1,483-1,485
Large diffs are not rendered by default.

sqlgpt_parser/parser/oceanbase_parser/parser.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -1203,7 +1203,7 @@ def p_alias_opt(p):
12031203
if p.slice[1].type == "alias":
12041204
p[0] = p[1]
12051205
else:
1206-
p[0] = ()
1206+
p[0] = []
12071207

12081208

12091209
def p_alias(p):
@@ -1212,9 +1212,9 @@ def p_alias(p):
12121212
| AS string_lit
12131213
| string_lit"""
12141214
if len(p) == 3:
1215-
p[0] = (p[1], p[2])
1215+
p[0] = [p[1], p[2]]
12161216
else:
1217-
p[0] = p[1]
1217+
p[0] = [p[1]]
12181218

12191219

12201220
def p_expression(p):
@@ -1649,7 +1649,7 @@ def p_window_func_call(p):
16491649
| ROW_NUMBER LPAREN RPAREN over_clause
16501650
"""
16511651
length = len(p)
1652-
window_spec = p[-1]
1652+
window_spec = p[length-1]
16531653
args = []
16541654
ignore_null = None
16551655

@@ -1790,7 +1790,10 @@ def p_frame_start(p):
17901790
| frame_expr PRECEDING
17911791
| frame_expr FOLLOWING
17921792
"""
1793-
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1793+
if p.slice[1].type == 'frame_expr':
1794+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1795+
else:
1796+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=None)
17941797

17951798

17961799
def p_frame_end(p):
@@ -1802,12 +1805,9 @@ def p_frame_between(p):
18021805
r"""frame_between : BETWEEN frame_start AND frame_end"""
18031806
p[0] = WindowFrame(p.lineno(1), p.lexpos(1), start=p[2], end=p[4])
18041807

1805-
18061808
def p_frame_expr(p):
18071809
r"""frame_expr : figure
1808-
| QM
1809-
| time_interval
1810-
|"""
1810+
| time_interval"""
18111811
p[0] = FrameExpr(p.lineno(1), p.lexpos(1), value=p[1])
18121812

18131813

sqlgpt_parser/parser/oceanbase_parser/parser_table.py

+1,894-1,896
Large diffs are not rendered by default.

sqlgpt_parser/parser/odps_parser/parser.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ def p_alias_opt(p):
12051205
if p.slice[1].type == "alias":
12061206
p[0] = p[1]
12071207
else:
1208-
p[0] = ()
1208+
p[0] = []
12091209

12101210

12111211
def p_alias(p):
@@ -1214,7 +1214,7 @@ def p_alias(p):
12141214
| AS string_lit
12151215
| string_lit"""
12161216
if len(p) == 3:
1217-
p[0] = (p[1], p[2])
1217+
p[0] = [p[1], p[2]]
12181218
else:
12191219
p[0] = p[1]
12201220

@@ -1657,7 +1657,7 @@ def p_window_func_call(p):
16571657
| ROW_NUMBER LPAREN RPAREN over_clause
16581658
"""
16591659
length = len(p)
1660-
window_spec = p[-1]
1660+
window_spec = p[length-1]
16611661
args = []
16621662
ignore_null = None
16631663

@@ -1798,8 +1798,10 @@ def p_frame_start(p):
17981798
| frame_expr PRECEDING
17991799
| frame_expr FOLLOWING
18001800
"""
1801-
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1802-
1801+
if p.slice[1].type == 'frame_expr':
1802+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=p[1])
1803+
else:
1804+
p[0] = FrameBound(p.lineno(1), p.lexpos(1), type=p[2], expr=None)
18031805

18041806
def p_frame_end(p):
18051807
r"""frame_end : frame_start"""
@@ -1810,12 +1812,9 @@ def p_frame_between(p):
18101812
r"""frame_between : BETWEEN frame_start AND frame_end"""
18111813
p[0] = WindowFrame(p.lineno(1), p.lexpos(1), start=p[2], end=p[4])
18121814

1813-
18141815
def p_frame_expr(p):
18151816
r"""frame_expr : figure
1816-
| QM
1817-
| time_interval
1818-
|"""
1817+
| time_interval"""
18191818
p[0] = FrameExpr(p.lineno(1), p.lexpos(1), value=p[1])
18201819

18211820

sqlgpt_parser/parser/odps_parser/parser_table.py

+1,898-1,900
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)