You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2020/11/04 06:43:18 UTC

[incubator-superset] 02/02: fix(sqla): allow 'unknown' type queries in explore view (#11365)

This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 34bbc77cec451674ddaa546750c3c96917e969e5
Author: serenajiang <se...@airbnb.com>
AuthorDate: Wed Oct 21 10:24:52 2020 -0700

    fix(sqla): allow 'unknown' type queries in explore view (#11365)
---
 superset/connectors/sqla/models.py | 3 ++-
 superset/sql_parse.py              | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index 934da17..bf0384b 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -760,7 +760,8 @@ class SqlaTable(  # pylint: disable=too-many-public-methods,too-many-instance-at
                 raise QueryObjectValidationError(
                     _("Virtual dataset query cannot consist of multiple statements")
                 )
-            if not ParsedQuery(from_sql).is_readonly():
+            parsed_query = ParsedQuery(from_sql)
+            if not (parsed_query.is_unknown() or parsed_query.is_readonly()):
                 raise QueryObjectValidationError(
                     _("Virtual dataset query must be read-only")
                 )
diff --git a/superset/sql_parse.py b/superset/sql_parse.py
index e532a5e..0bc20c1 100644
--- a/superset/sql_parse.py
+++ b/superset/sql_parse.py
@@ -113,6 +113,9 @@ class ParsedQuery:
     def is_explain(self) -> bool:
         return self.stripped().upper().startswith("EXPLAIN")
 
+    def is_unknown(self) -> bool:
+        return self._parsed[0].get_type() == "UNKNOWN"
+
     def is_readonly(self) -> bool:
         """Pessimistic readonly, 100% sure statement won't mutate anything"""
         return self.is_select() or self.is_explain()