From d2d135b46ea6fff5b62976c5eac46937df89129b 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 b2e21c7d0fd7d..9e2ae2005f3ca 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -428,6 +428,7 @@ def get_from_clause(self, template_processor=None, db_engine_spec=None): 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 a026ae478d279..aa5c3617950e4 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -18,6 +18,7 @@ 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 @@ def test_dataframe_timezone(self): {'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()