8
8
from redash .handlers .base import BaseResource , get_object_or_404
9
9
from redash .permissions import (has_access , not_view_only , require_access ,
10
10
require_permission , view_only )
11
- from redash .tasks import QueryTask , record_event
11
+ from redash .tasks import QueryTask
12
12
from redash .tasks .queries import enqueue_query
13
- from redash .utils import (collect_parameters_from_request , find_missing_params , gen_query_hash , json_dumps , utcnow )
14
- from redash .utils .sql_query import SQLInjectionError , SQLQuery
13
+ from redash .utils import (collect_parameters_from_request , gen_query_hash , json_dumps , utcnow )
14
+ from redash .utils .parameterized_query import ParameterizedQuery
15
15
16
16
17
17
def error_response (message ):
18
18
return {'job' : {'status' : 4 , 'error' : message }}, 400
19
19
20
20
21
- def apply_parameters (template , parameters , data_source ):
22
- query = SQLQuery (template ).apply (parameters )
23
-
24
- # for now we only log `SQLInjectionError` to detect false positives
25
- try :
26
- text = query .text
27
- except SQLInjectionError :
28
- record_event ({
29
- 'action' : 'sql_injection' ,
30
- 'object_type' : 'query' ,
31
- 'query' : template ,
32
- 'parameters' : parameters ,
33
- 'timestamp' : time .time (),
34
- 'org_id' : data_source .org_id
35
- })
36
- except Exception as e :
37
- logging .info (u"Failed applying parameters for query %s: %s" , gen_query_hash (query .query ), e .message )
38
- finally :
39
- text = query .query
40
-
41
- return text
42
-
43
-
44
21
#
45
22
# Run a parameterized query synchronously and return the result
46
23
# DISCLAIMER: Temporary solution to support parameters in queries. Should be
47
24
# removed once we refactor the query results API endpoints and handling
48
25
# on the client side. Please don't reuse in other API handlers.
49
26
#
50
27
def run_query_sync (data_source , parameter_values , query_text , max_age = 0 ):
51
- missing_params = find_missing_params (query_text , parameter_values )
52
- if missing_params :
53
- raise Exception ('Missing parameter value for: {}' .format (", " .join (missing_params )))
28
+ query = ParameterizedQuery (query_text ).apply (parameter_values )
54
29
55
- query_text = apply_parameters (query_text , parameter_values , data_source )
30
+ if query .missing_params :
31
+ raise Exception ('Missing parameter value for: {}' .format (", " .join (query .missing_params )))
56
32
57
33
if max_age <= 0 :
58
34
query_result = None
59
35
else :
60
- query_result = models .QueryResult .get_latest (data_source , query_text , max_age )
36
+ query_result = models .QueryResult .get_latest (data_source , query . text , max_age )
61
37
62
- query_hash = gen_query_hash (query_text )
38
+ query_hash = gen_query_hash (query . text )
63
39
64
40
if query_result :
65
41
logging .info ("Returning cached result for query %s" % query_hash )
66
42
return query_result
67
43
68
44
try :
69
45
started_at = time .time ()
70
- data , error = data_source .query_runner .run_query (query_text , current_user )
46
+ data , error = data_source .query_runner .run_query (query . text , current_user )
71
47
72
48
if error :
73
49
logging .info ('got bak error' )
@@ -76,9 +52,8 @@ def run_query_sync(data_source, parameter_values, query_text, max_age=0):
76
52
77
53
run_time = time .time () - started_at
78
54
query_result , updated_query_ids = models .QueryResult .store_result (data_source .org_id , data_source ,
79
- query_hash , query_text , data ,
55
+ query_hash , query . text , data ,
80
56
run_time , utcnow ())
81
-
82
57
models .db .session .commit ()
83
58
return query_result
84
59
except Exception as e :
@@ -90,10 +65,6 @@ def run_query_sync(data_source, parameter_values, query_text, max_age=0):
90
65
91
66
92
67
def run_query (data_source , parameter_values , query_text , query_id , max_age = 0 ):
93
- missing_params = find_missing_params (query_text , parameter_values )
94
- if missing_params :
95
- return error_response (u'Missing parameter value for: {}' .format (u", " .join (missing_params )))
96
-
97
68
if data_source .paused :
98
69
if data_source .pause_reason :
99
70
message = '{} is paused ({}). Please try later.' .format (data_source .name , data_source .pause_reason )
@@ -102,17 +73,20 @@ def run_query(data_source, parameter_values, query_text, query_id, max_age=0):
102
73
103
74
return error_response (message )
104
75
105
- query_text = apply_parameters (query_text , parameter_values , data_source )
76
+ query = ParameterizedQuery (query_text ).apply (parameter_values )
77
+
78
+ if query .missing_params :
79
+ return error_response (u'Missing parameter value for: {}' .format (u", " .join (query .missing_params )))
106
80
107
81
if max_age == 0 :
108
82
query_result = None
109
83
else :
110
- query_result = models .QueryResult .get_latest (data_source , query_text , max_age )
84
+ query_result = models .QueryResult .get_latest (data_source , query . text , max_age )
111
85
112
86
if query_result :
113
87
return {'query_result' : query_result .to_dict ()}
114
88
else :
115
- job = enqueue_query (query_text , data_source , current_user .id , metadata = {"Username" : current_user .email , "Query ID" : query_id })
89
+ job = enqueue_query (query . text , data_source , current_user .id , metadata = {"Username" : current_user .email , "Query ID" : query_id })
116
90
return {'job' : job .to_dict ()}
117
91
118
92
0 commit comments