Skip to content

Commit e722736

Browse files
authored
fix: avoid 500 errors with SQLLAB_BACKEND_PERSISTENCE (apache#25553)
1 parent 1ab8442 commit e722736

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

superset/views/sql_lab/views.py

+4
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ def put(self, tab_state_id: int) -> FlaskResponse:
161161
return Response(status=403)
162162

163163
fields = {k: json.loads(v) for k, v in request.form.to_dict().items()}
164+
if client_id := fields.get("latest_query_id"):
165+
query = db.session.query(Query).filter_by(client_id=client_id).one_or_none()
166+
if not query:
167+
return self.json_response({"error": "Bad request"}, status=400)
164168
db.session.query(TabState).filter_by(id=tab_state_id).update(fields)
165169
db.session.commit()
166170
return json_success(json.dumps(tab_state_id))

tests/integration_tests/core_tests.py

+35
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,41 @@ def test_tabstate_with_name(self):
996996

997997
self.assertEqual(payload["label"], "Untitled Query foo")
998998

999+
def test_tabstate_update(self):
1000+
username = "admin"
1001+
self.login(username)
1002+
# create a tab
1003+
data = {
1004+
"queryEditor": json.dumps(
1005+
{
1006+
"name": "Untitled Query foo",
1007+
"dbId": 1,
1008+
"schema": None,
1009+
"autorun": False,
1010+
"sql": "SELECT ...",
1011+
"queryLimit": 1000,
1012+
}
1013+
)
1014+
}
1015+
resp = self.get_json_resp("/tabstateview/", data=data)
1016+
tab_state_id = resp["id"]
1017+
# update tab state with non-existing client_id
1018+
client_id = "asdfasdf"
1019+
data = {"sql": json.dumps("select 1"), "latest_query_id": json.dumps(client_id)}
1020+
response = self.client.put(f"/tabstateview/{tab_state_id}", data=data)
1021+
self.assertEqual(response.status_code, 400)
1022+
self.assertEqual(response.json["error"], "Bad request")
1023+
# generate query
1024+
db.session.add(Query(client_id=client_id, database_id=1))
1025+
db.session.commit()
1026+
# update tab state with a valid client_id
1027+
response = self.client.put(f"/tabstateview/{tab_state_id}", data=data)
1028+
self.assertEqual(response.status_code, 200)
1029+
# nulls should be ok too
1030+
data["latest_query_id"] = "null"
1031+
response = self.client.put(f"/tabstateview/{tab_state_id}", data=data)
1032+
self.assertEqual(response.status_code, 200)
1033+
9991034
def test_virtual_table_explore_visibility(self):
10001035
# test that default visibility it set to True
10011036
database = superset.utils.database.get_example_database()

0 commit comments

Comments
 (0)