4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# File 'lib/rails/nl2sql/query_validator.rb', line 4
def self.validate(query)
return false unless query && !query.strip.empty?
query = query.strip
if query.include?('```') || query.include?('```sql')
raise Rails::Nl2sql::Error, "Query contains markdown formatting and could not be cleaned properly"
end
disallowed_keywords = %w(DROP DELETE UPDATE INSERT TRUNCATE ALTER CREATE EXEC EXECUTE MERGE REPLACE)
query_upper = query.upcase
if disallowed_keywords.any? { |keyword| query_upper.include?(keyword) }
raise Rails::Nl2sql::Error, "Query contains disallowed keywords."
end
cleaned_query = query.rstrip
cleaned_query = cleaned_query.chomp(';')
if cleaned_query.include?(';')
raise Rails::Nl2sql::Error, "Query contains multiple statements."
end
unless query_upper.strip.start_with?('SELECT', 'WITH')
raise Rails::Nl2sql::Error, "Only SELECT queries are allowed."
end
begin
explain_query = query.gsub(/;\s*$/, '')
ActiveRecord::Base.connection.execute("EXPLAIN #{explain_query}")
rescue ActiveRecord::StatementInvalid => e
raise Rails::Nl2sql::Error, "Invalid SQL query: #{e.message}"
end
true
end
|