From 84c83df06a1b4922e56d385db648218ff310e8f0 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Wed, 20 Jun 2018 12:16:59 -0700 Subject: [PATCH] [sql lab] Fix issue around VARBINARY type in Presto (#5121) When receiving a VARBINARY field out of Presto, it shows up as type `bytes` out of the pyhive driver. Then the pre 3.15 version of simplejson attempts to convert it to utf8 by default and it craps out. I bumped to simplejson>=3.25.0 and set `encoding=None` as documented here https://simplejson.readthedocs.io/en/latest/#basic-usage so that we can handle bytes on our own. (cherry picked from commit 409ac6824add4f5d9ec868e8fb8b2506d4602dfd) --- requirements.txt | 2 +- setup.py | 2 +- superset/utils.py | 6 +++++- superset/views/core.py | 6 +++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index fbc69c51d6243..ea12de6a824ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ python-dateutil==2.6.1 python-geohash==0.8.5 pyyaml==3.12 requests==2.18.4 -simplejson==3.13.2 +simplejson==3.15.0 six==1.11.0 sqlalchemy==1.2.2 sqlalchemy-utils==0.32.21 diff --git a/setup.py b/setup.py index e4fb35aa23367..edb434ac3dab5 100644 --- a/setup.py +++ b/setup.py @@ -81,7 +81,7 @@ def get_git_sha(): 'python-geohash', 'pyyaml>=3.11', 'requests', - 'simplejson', + 'simplejson>=3.15.0', 'six', 'sqlalchemy', 'sqlalchemy-utils', diff --git a/superset/utils.py b/superset/utils.py index f92d5fa4dd747..6248962ba7552 100644 --- a/superset/utils.py +++ b/superset/utils.py @@ -311,7 +311,6 @@ def datetime_f(dttm): def base_json_conv(obj): - if isinstance(obj, numpy.int64): return int(obj) elif isinstance(obj, numpy.bool_): @@ -324,6 +323,11 @@ def base_json_conv(obj): return str(obj) elif isinstance(obj, timedelta): return str(obj) + elif isinstance(obj, bytes): + try: + return '{}'.format(obj) + except Exception: + return '[bytes]' def json_iso_dttm_ser(obj, pessimistic=False): diff --git a/superset/views/core.py b/superset/views/core.py index 819fb9281682d..892b55e90879d 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -2522,7 +2522,11 @@ def sql_json(self): rendered_query, return_results=True) payload = json.dumps( - data, default=utils.pessimistic_json_iso_dttm_ser, ignore_nan=True) + data, + default=utils.pessimistic_json_iso_dttm_ser, + ignore_nan=True, + encoding=None, + ) except Exception as e: logging.exception(e) return json_error_response('{}'.format(e))