You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by so...@apache.org on 2026/06/23 20:28:27 UTC
(superset) branch master updated: fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
This is an automated email from the ASF dual-hosted git repository.
yousoph pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new c1f4062af6c fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
c1f4062af6c is described below
commit c1f4062af6c0f0aa52074609c7ba82d393282421
Author: yousoph <so...@gmail.com>
AuthorDate: Tue Jun 23 13:28:20 2026 -0700
fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
Co-authored-by: Claude Sonnet 4.6 <no...@anthropic.com>
---
.../src/SqlLab/reducers/sqlLab.test.ts | 21 +++++++++++++++++++++
superset-frontend/src/SqlLab/reducers/sqlLab.ts | 16 ++++++++++++++--
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.test.ts b/superset-frontend/src/SqlLab/reducers/sqlLab.test.ts
index eacbe65ea83..3573405bfe0 100644
--- a/superset-frontend/src/SqlLab/reducers/sqlLab.test.ts
+++ b/superset-frontend/src/SqlLab/reducers/sqlLab.test.ts
@@ -200,6 +200,27 @@ describe('sqlLabReducer', () => {
expect(newState.unsavedQueryEditor.sql).toBe(sql);
expect(newState.unsavedQueryEditor.id).toBe(qe!.id);
});
+ test('should set Sql when dispatched with tabViewId (backend persistence)', () => {
+ // Simulate SqllabBackendPersistence: queryEditor gets a tabViewId after save
+ const tabViewId = 'tab-view-42';
+ const migrateAction = {
+ type: actions.MIGRATE_QUERY_EDITOR,
+ oldQueryEditor: qe,
+ newQueryEditor: { ...qe!, tabViewId, inLocalStorage: false },
+ };
+ newState = sqlLabReducer(newState, migrateAction as SqlLabAction);
+
+ // Restore SQL using tabViewId (as restoreSql in QueryTable does)
+ const sql = 'SELECT restored_query FROM history';
+ const restoreAction = {
+ type: actions.QUERY_EDITOR_SET_SQL,
+ queryEditor: { id: tabViewId },
+ sql,
+ };
+ newState = sqlLabReducer(newState, restoreAction);
+ expect(newState.unsavedQueryEditor.sql).toBe(sql);
+ expect(newState.unsavedQueryEditor.id).toBe(qe!.id);
+ });
test('should not fail while setting queryLimit', () => {
const queryLimit = 101;
const action = {
diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.ts b/superset-frontend/src/SqlLab/reducers/sqlLab.ts
index 34e3af847cc..4bafa1d705b 100644
--- a/superset-frontend/src/SqlLab/reducers/sqlLab.ts
+++ b/superset-frontend/src/SqlLab/reducers/sqlLab.ts
@@ -604,8 +604,20 @@ export default function sqlLabReducer(
},
[actions.QUERY_EDITOR_SET_SQL]() {
const { unsavedQueryEditor } = state;
+ const actionId = action.queryEditor!.id!;
+ // Skip the O(n) tabViewId scan on the common path (keystroke: actionId already
+ // matches the active editor's client-side id). Only scan when ids differ, which
+ // happens when restoring from history with a backend-assigned tabViewId.
+ const normalizedId =
+ unsavedQueryEditor?.id === actionId
+ ? actionId
+ : ((
+ getFromArr(state.queryEditors, actionId, 'tabViewId') as
+ | QueryEditor
+ | undefined
+ )?.id ?? actionId);
if (
- unsavedQueryEditor?.id === action.queryEditor!.id &&
+ unsavedQueryEditor?.id === normalizedId &&
unsavedQueryEditor.sql === action.sql
) {
return state;
@@ -618,7 +630,7 @@ export default function sqlLabReducer(
sql: action.sql ?? undefined,
...(action.queryId && { latestQueryId: action.queryId }),
},
- action.queryEditor!.id!,
+ normalizedId,
),
};
},