2
2
import logging
3
3
import typing as t
4
4
5
+ import cratedb_sqlparse
5
6
import sqlparse
6
7
7
8
from cratedb_mcp .settings import PERMIT_ALL_STATEMENTS
@@ -39,12 +40,21 @@ class SqlStatementClassifier:
39
40
expression : str
40
41
permit_all : bool = False
41
42
43
+ _parsed_cratedb : t .Any = dataclasses .field (init = False , default = None )
42
44
_parsed_sqlparse : t .Any = dataclasses .field (init = False , default = None )
43
45
44
46
def __post_init__ (self ) -> None :
45
47
if self .expression :
46
48
self .expression = self .expression .strip ()
47
49
50
+ def parse_cratedb (self ):
51
+ """
52
+ Parse expression using `cratedb-sqlparse` library.
53
+ """
54
+ if self ._parsed_cratedb is None :
55
+ self ._parsed_cratedb = cratedb_sqlparse .sqlparse (self .expression )
56
+ return self ._parsed_cratedb
57
+
48
58
def parse_sqlparse (self ):
49
59
"""
50
60
Parse expression using traditional `sqlparse` library.
@@ -66,7 +76,7 @@ def is_dql(self) -> bool:
66
76
return True
67
77
68
78
# Parse the SQL statement using `cratedb-sqlparse`.
69
- parsed = self .parse_sqlparse ()
79
+ parsed = self .parse_cratedb ()
70
80
71
81
# Reject multiple statements to prevent potential SQL injections.
72
82
if len (parsed ) > 1 :
@@ -89,7 +99,7 @@ def operation(self) -> str:
89
99
"""
90
100
The SQL operation: SELECT, INSERT, UPDATE, DELETE, CREATE, etc.
91
101
"""
92
- return self ._parsed_sqlparse [0 ].get_type () .upper ()
102
+ return self ._parsed_cratedb [0 ].type .upper ()
93
103
94
104
@property
95
105
def is_camouflage (self ) -> bool :
0 commit comments