22import logging
33import typing as t
44
5+ import cratedb_sqlparse
56import sqlparse
67
78from cratedb_mcp .settings import PERMIT_ALL_STATEMENTS
@@ -39,12 +40,21 @@ class SqlStatementClassifier:
3940 expression : str
4041 permit_all : bool = False
4142
43+ _parsed_cratedb : t .Any = dataclasses .field (init = False , default = None )
4244 _parsed_sqlparse : t .Any = dataclasses .field (init = False , default = None )
4345
4446 def __post_init__ (self ) -> None :
4547 if self .expression :
4648 self .expression = self .expression .strip ()
4749
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+
4858 def parse_sqlparse (self ):
4959 """
5060 Parse expression using traditional `sqlparse` library.
@@ -66,7 +76,7 @@ def is_dql(self) -> bool:
6676 return True
6777
6878 # Parse the SQL statement using `cratedb-sqlparse`.
69- parsed = self .parse_sqlparse ()
79+ parsed = self .parse_cratedb ()
7080
7181 # Reject multiple statements to prevent potential SQL injections.
7282 if len (parsed ) > 1 :
@@ -89,7 +99,7 @@ def operation(self) -> str:
8999 """
90100 The SQL operation: SELECT, INSERT, UPDATE, DELETE, CREATE, etc.
91101 """
92- return self ._parsed_sqlparse [0 ].get_type () .upper ()
102+ return self ._parsed_cratedb [0 ].type .upper ()
93103
94104 @property
95105 def is_camouflage (self ) -> bool :
0 commit comments