diff --git a/superset/sql_lab.py b/superset/sql_lab.py index 7b74ab72184af..c868ce847b59b 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -19,7 +19,6 @@ from superset import app, dataframe, db, results_backend, utils from superset.db_engine_specs import LimitMethod -from superset.jinja_context import get_template_processor from superset.models.sql_lab import Query from superset.sql_parse import SupersetQuery from superset.utils import get_celery_app, QueryStatus @@ -109,13 +108,12 @@ def convert_results_to_df(cursor_description, data): @celery_app.task(bind=True, soft_time_limit=SQLLAB_TIMEOUT) def get_sql_results( - ctask, query_id, return_results=True, store_results=False, - user_name=None, template_params=None): + ctask, query_id, rendered_query, return_results=True, store_results=False, + user_name=None): """Executes the sql query returns the results.""" try: return execute_sql( - ctask, query_id, return_results, store_results, user_name, - template_params) + ctask, query_id, rendered_query, return_results, store_results, user_name) except Exception as e: logging.exception(e) stats_logger.incr('error_sqllab_unhandled') @@ -129,8 +127,8 @@ def get_sql_results( def execute_sql( - ctask, query_id, return_results=True, store_results=False, user_name=None, - template_params=None, + ctask, query_id, rendered_query, return_results=True, store_results=False, + user_name=None, ): """Executes the sql query returns the results.""" session = get_session(not ctask.request.called_directly) diff --git a/superset/views/core.py b/superset/views/core.py index d56d5ff6f5198..b800b5e126e0e 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -39,6 +39,7 @@ from superset.connectors.connector_registry import ConnectorRegistry from superset.connectors.sqla.models import AnnotationDatasource, SqlaTable from superset.forms import CsvToDatabaseForm +from superset.jinja_context import get_template_processor from superset.legacy import cast_form_data import superset.models.core as models from superset.models.sql_lab import Query @@ -2403,16 +2404,27 @@ def sql_json(self): raise Exception(_('Query record was not created as expected.')) logging.info('Triggering query_id: {}'.format(query_id)) + try: + template_processor = get_template_processor( + database=query.database, query=query) + rendered_query = template_processor.process_template( + query.sql, + **template_params) + except Exception as e: + return json_error_response( + 'Template rendering failed: {}'.format(utils.error_msg_from_exception(e))) + # Async request. if async: logging.info('Running query on a Celery worker') # Ignore the celery future object and the request may time out. try: sql_lab.get_sql_results.delay( - query_id=query_id, return_results=False, + query_id, + rendered_query, + return_results=False, store_results=not query.select_as_cta, - user_name=g.user.username, - template_params=template_params) + user_name=g.user.username) except Exception as e: logging.exception(e) msg = ( @@ -2441,8 +2453,9 @@ def sql_json(self): error_message=timeout_msg): # pylint: disable=no-value-for-parameter data = sql_lab.get_sql_results( - query_id=query_id, return_results=True, - template_params=template_params) + query_id, + rendered_query, + return_results=True) payload = json.dumps( data, default=utils.pessimistic_json_iso_dttm_ser) except Exception as e: