From d6c197f8acfa016eccc7a624251841829a14e5f6 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Date: Mon, 19 Feb 2018 02:30:11 +0200 Subject: [PATCH] Remove comments from queries in SQL Lab that break Explore view (#4413) * Remove comments from queries in SQL Lab that break Explore view This fixes an issue where comments on the last line of the source query comment out the closing parenthesis of the subquery. * Add test case for SqlaTable with query with comment This test ensures that comments in the query are removed when calling SqlaTable.get_from_clause(). * Add missing blank line class definition (PEP8) --- superset/connectors/sqla/models.py | 1 + tests/core_tests.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index b2e21c7d0fd..9e2ae2005f3 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -428,6 +428,7 @@ class SqlaTable(Model, BaseDatasource): from_sql = template_processor.process_template(from_sql) if db_engine_spec: from_sql = db_engine_spec.escape_sql(from_sql) + from_sql = sqlparse.format(from_sql, strip_comments=True) return TextAsFrom(sa.text(from_sql), []).alias('expr_qry') return self.get_sqla_table() diff --git a/tests/core_tests.py b/tests/core_tests.py index a026ae478d2..aa5c3617950 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -18,6 +18,7 @@ import unittest from flask import escape import pandas as pd import psycopg2 +from six import text_type import sqlalchemy as sqla from superset import appbuilder, dataframe, db, jinja_context, sm, sql_lab, utils @@ -870,6 +871,13 @@ class CoreTests(SupersetTestCase): {'data': pd.Timestamp('2017-11-18 22:06:30.061810+0100', tz=tz)}, ) + def test_comments_in_sqlatable_query(self): + clean_query = "SELECT '/* val 1 */' as c1, '-- val 2' as c2 FROM tbl" + commented_query = '/* comment 1 */' + clean_query + '-- comment 2' + table = SqlaTable(sql=commented_query) + rendered_query = text_type(table.get_from_clause()) + self.assertEqual(clean_query, rendered_query) + if __name__ == '__main__': unittest.main()