|
17 | 17 | from mindsdb.api.executor.data_types.response_type import ( |
18 | 18 | RESPONSE_TYPE as SQL_RESPONSE_TYPE, |
19 | 19 | ) |
| 20 | +from mindsdb.api.executor.sql_query.result_set import ResultSet |
20 | 21 |
|
21 | 22 | from mindsdb.integrations.utilities.query_traversal import query_traversal |
22 | 23 | from mindsdb.api.executor.exceptions import ExecutorException, UnknownError |
@@ -62,56 +63,90 @@ def post(self): |
62 | 63 | with profiler.Context("http_query_processing"): |
63 | 64 | mysql_proxy = FakeMysqlProxy() |
64 | 65 | mysql_proxy.set_context(context) |
65 | | - try: |
66 | | - result: SQLAnswer = mysql_proxy.process_query(query) |
67 | | - query_response: dict = result.dump_http_response() |
68 | | - except ExecutorException as e: |
69 | | - # classified error |
70 | | - error_type = "expected" |
71 | | - query_response = { |
72 | | - "type": SQL_RESPONSE_TYPE.ERROR, |
73 | | - "error_code": 0, |
74 | | - "error_message": str(e), |
75 | | - } |
76 | | - logger.warning(f"Error query processing: {e}") |
77 | | - except QueryError as e: |
78 | | - error_type = "expected" if e.is_expected else "unexpected" |
79 | | - query_response = { |
80 | | - "type": SQL_RESPONSE_TYPE.ERROR, |
81 | | - "error_code": 0, |
82 | | - "error_message": str(e), |
83 | | - } |
84 | | - if e.is_expected: |
85 | | - logger.warning(f"Query failed due to expected reason: {e}") |
| 66 | + |
| 67 | + if context.get("native_query"): |
| 68 | + db = context.get("db") |
| 69 | + if not db: |
| 70 | + return { |
| 71 | + "type": "error", |
| 72 | + "error_code": 0, |
| 73 | + "error_message": "native_query requires 'db' in context", |
| 74 | + }, 400 |
| 75 | + |
| 76 | + logger.debug(f"Running query natively for database {db}") |
| 77 | + |
| 78 | + try: |
| 79 | + handler = mysql_proxy.session.integration_controller.get_data_handler(db) |
| 80 | + result = handler.native_query(query) |
| 81 | + except Exception as e: |
| 82 | + query_response = {"type": "error", "error_code": 0, "error_message": str(e)} |
86 | 83 | else: |
| 84 | + if result.type == SQL_RESPONSE_TYPE.ERROR: |
| 85 | + query_response = {"type": "error", "error_code": 0, "error_message": result.error_message} |
| 86 | + elif result.type == SQL_RESPONSE_TYPE.OK: |
| 87 | + query_response = {"type": "ok"} |
| 88 | + else: |
| 89 | + df = result.data_frame |
| 90 | + result_set = ResultSet.from_df(df) |
| 91 | + query_response = { |
| 92 | + "type": "table", |
| 93 | + "column_names": result_set.get_column_names(), |
| 94 | + "data": result_set.to_lists(json_types=True), |
| 95 | + } |
| 96 | + |
| 97 | + query_response["context"] = mysql_proxy.get_context() |
| 98 | + |
| 99 | + else: |
| 100 | + try: |
| 101 | + result: SQLAnswer = mysql_proxy.process_query(query) |
| 102 | + query_response: dict = result.dump_http_response() |
| 103 | + except ExecutorException as e: |
| 104 | + # classified error |
| 105 | + error_type = "expected" |
| 106 | + query_response = { |
| 107 | + "type": SQL_RESPONSE_TYPE.ERROR, |
| 108 | + "error_code": 0, |
| 109 | + "error_message": str(e), |
| 110 | + } |
| 111 | + logger.warning(f"Error query processing: {e}") |
| 112 | + except QueryError as e: |
| 113 | + error_type = "expected" if e.is_expected else "unexpected" |
| 114 | + query_response = { |
| 115 | + "type": SQL_RESPONSE_TYPE.ERROR, |
| 116 | + "error_code": 0, |
| 117 | + "error_message": str(e), |
| 118 | + } |
| 119 | + if e.is_expected: |
| 120 | + logger.warning(f"Query failed due to expected reason: {e}") |
| 121 | + else: |
| 122 | + logger.exception("Error query processing:") |
| 123 | + except UnknownError as e: |
| 124 | + # unclassified |
| 125 | + error_type = "unexpected" |
| 126 | + query_response = { |
| 127 | + "type": SQL_RESPONSE_TYPE.ERROR, |
| 128 | + "error_code": 0, |
| 129 | + "error_message": str(e), |
| 130 | + } |
| 131 | + logger.exception("Error query processing:") |
| 132 | + |
| 133 | + except Exception as e: |
| 134 | + error_type = "unexpected" |
| 135 | + query_response = { |
| 136 | + "type": SQL_RESPONSE_TYPE.ERROR, |
| 137 | + "error_code": 0, |
| 138 | + "error_message": str(e), |
| 139 | + } |
87 | 140 | logger.exception("Error query processing:") |
88 | | - except UnknownError as e: |
89 | | - # unclassified |
90 | | - error_type = "unexpected" |
91 | | - query_response = { |
92 | | - "type": SQL_RESPONSE_TYPE.ERROR, |
93 | | - "error_code": 0, |
94 | | - "error_message": str(e), |
95 | | - } |
96 | | - logger.exception("Error query processing:") |
97 | | - |
98 | | - except Exception as e: |
99 | | - error_type = "unexpected" |
100 | | - query_response = { |
101 | | - "type": SQL_RESPONSE_TYPE.ERROR, |
102 | | - "error_code": 0, |
103 | | - "error_message": str(e), |
104 | | - } |
105 | | - logger.exception("Error query processing:") |
106 | 141 |
|
107 | | - if query_response.get("type") == SQL_RESPONSE_TYPE.ERROR: |
108 | | - error_type = "expected" |
109 | | - error_code = query_response.get("error_code") |
110 | | - error_text = query_response.get("error_message") |
| 142 | + if query_response.get("type") == SQL_RESPONSE_TYPE.ERROR: |
| 143 | + error_type = "expected" |
| 144 | + error_code = query_response.get("error_code") |
| 145 | + error_text = query_response.get("error_message") |
111 | 146 |
|
112 | | - context = mysql_proxy.get_context() |
| 147 | + context = mysql_proxy.get_context() |
113 | 148 |
|
114 | | - query_response["context"] = context |
| 149 | + query_response["context"] = context |
115 | 150 |
|
116 | 151 | hooks.after_api_query( |
117 | 152 | company_id=ctx.company_id, |
|
0 commit comments