You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by jl...@apache.org on 2026/08/27 20:02:37 UTC

(superset) branch fix-bar-chart-label-placement updated (8ca0bbf54b7 -> 7f0f2c1faab)

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

sadpandajoe pushed a change to branch fix-bar-chart-label-placement
in repository https://gitbox.apache.org/repos/asf/superset.git


    from 8ca0bbf54b7 fix(echarts): suppress Auto bar value labels for illegibly small segments
     add b5fe00b407d test(frontend): shrink flaky/misplaced recently-archived e2e coverage to Jest unit tests (#43264)
     add bcfb4346f6b fix(mcp): honor use_cache and cache_timeout in get_chart_data (#43349)
     add 271564cb0da feat(config): add EXTRA_PANDAS_POSTPROCESSING_OPS extension point (#43337)
     add 42ba2a4433f fix(reports): humanize day-of-month + day-of-week crontabs as OR (#43307)
     add 7441ce90aea fix(charts): align grain-less time comparisons safely (#43315)
     add 01b1d58ac97 fix(plugin-chart-echarts): restore tooltips for metrics labelled like… (#43369)
     add 18a36d04c72 fix(mcp): preserve user-authored result values (#43202)
     add 18fc2c62286 fix(sqllab): stop copying a permalink when opening a saved query (#43147)
     add 27ea5de44a0 fix(i18n-es): correct case/number collapse in the semantic-layer labels (#43311)
     add 22396d504a5 fix(ux): use title case for button labels (#40048)
     add f7d505e1fd0 fix(listview): stop card clicks creating a duplicate history entry (#43310)
     add fb53761ec8a chore(deps-dev): bump baseline-browser-mapping from 2.11.13 to 2.11.14 in /superset-frontend (#43381)
     add 87743ef3f83 chore(deps): bump dompurify from 3.4.12 to 3.4.13 in /superset-frontend (#43380)
     add 14408eb3db9 chore(deps-dev): bump the storybook group in /superset-frontend with 5 updates (#43379)
     add 132340b6529 chore(deps): bump astral-sh/setup-uv from 10.0.0 to 10.0.1 (#43378)
     add 6e22050b509 chore(deps): bump the storybook group in /docs with 2 updates (#43377)
     add 65910abf21f fix(sqllab): disable Save dataset until the query runs successfully (#43330)
     add e45dd2d3f16 ci: pull CI service images from GHCR mirror (fork-safe) [depends on #40880] (#40882)
     add 05842a6350f feat(metrics): add MEDIAN/STDDEV_SAMP/VAR_SAMP as system-wide aggregates (#42895)
     add a05a0999877 fix(embedded): block custom SQL injection in guest user chart payloads (#43111)
     add d422f5b4b68 fix: last date label hidden on time series x-axis (#39899) (#42299)
     add fd7095df9a5 fix(explore): align viz type gallery thumbnails and Featured tag (#43373)
     add 03eac279e5f fix(explore): exclude permalink_key from chart URL params (#43354)
     add edda9d1bbbc fix(frontend): tighten SQL Lab autorun scoping and HTML-rendering defaults (#43398)
     add aee98b527d1 fix(charts): escape untrusted strings before rendering into chart tooltips and popups (#43397)
     add 2b6044b624a fix: tighten SSRF validation, executor resolution, and cache scoping across reports/thumbnails (#43395)
     add 04017f39568 fix(sqllab): re-validate access against rendered SQL and tighten cache/permalink scoping (#43394)
     add 65893113fed fix(import): tighten ownership and validation checks across asset importers (#43393)
     add 9781254363f fix(export): escape formula-triggering values consistently and bound post-processing inputs (#43396)
     add 5f3e34908cc fix(charts): surface blocking alerts/reports when archiving a chart (#43402)
     add 5812c0eab56 fix(mcp): fail closed when MCP_AUTH_FACTORY raises (#43329)
     add 09bd8c98de2 feat(chart): enable cross-filter on temporal x-axis (bar/label click) (#42792)
     add f2610e9dca0 fix(sqllab): default PostgreSQL port to 5432 in the dynamic connection form (#43351)
     add 9f505eb0cbb fix(examples): replace deprecated timeseries_limit_metric with series_limit_metric (#43422)
     add c3ed8b312d5 fix(security): surface extra_editors in dashboard/chart lists (#43392)
     add 5ffb72151e8 chore(deps): bump react-error-boundary from 6.1.2 to 6.1.3 in /superset-frontend (#43451)
     add 90a3d930022 chore(deps): bump dayjs from 1.11.21 to 1.11.22 in /superset-frontend (#43450)
     add 8fa48d73f69 chore(deps-dev): bump concurrently from 10.0.4 to 10.0.5 in /superset-frontend (#43449)
     add af859717a73 chore: remove two stale codecov ignore paths (#43438)
     add e7756aeef94 chore(deps): bump immer from 11.1.16 to 11.1.17 in /superset-frontend (#43448)
     add 7196ce8a0c8 chore(deps): bump docker/setup-buildx-action from 4.2.0 to 4.3.0 (#43445)
     add dcac129b514 chore(deps): bump js-yaml from 5.2.3 to 5.3.0 in /docs (#43442)
     add 4623d9219af fix: update in the wild link on community page (#43403)
     add 8a323241846 fix: add missing ownership checks to tag, report-log, and dataset-schema endpoints (#43390)
     add 7f1b41444c8 fix: add missing access checks to semantic-layer and theme endpoints (#43389)
     add 15b98aa6da0 fix(plugin-chart-echarts): apply contribution before rename with time comparison (#43384)
     add 3f10d8b1ccb fix(versioning): suppress automatic chart normalization changes (#43350)
     add 649c062825a chore(deps): bump baseline-browser-mapping from 2.11.13 to 2.11.15 in /docs (#43444)
     add f3142e7b15b fix(tags): fix broken import in daos/tag.py (#43466)
     add 2c02965f2bf chore(deps): bump @swc/core from 1.15.47 to 1.16.0 in /docs (#43443)
     add e450acf1c70 chore(deps): bump sqlglot from 30.16.0 to 30.17.0 (#43418)
     add a392e8b1024 chore(deps): bump marshmallow from 4.3.0 to 4.3.1 (#43417)
     add db539288acb chore(deps-dev): update teradatasql requirement from >=20.0.0.64 to >=20.0.0.65 (#43416)
     add ceb75b93503 chore(deps): bump sqlalchemy from 2.0.51 to 2.0.52 (#43415)
     add 8591f52cedf chore(deps): bump pyarrow from 25.0.0 to 25.0.1 (#43414)
     add f1f63478852 chore(deps-dev): bump prophet from 1.3.0 to 1.4.0 (#43412)
     add 1bde62f9973 chore(deps-dev): bump gevent from 26.7.0 to 26.8.0 (#43411)
     add 6eced8e9191 fix(roles): let the permissions dropdown size to its content (#43196)
     add dc436c76f7a fix(datasets): keep a metric's warning text when editing from Explore (#43177)
     add c980b3a3615 fix(mcp): tighten auth and request validation edge cases (#43388)
     add bf5f3a9e6be test(dashboard): migrate drill-to-detail E2E from Cypress to Playwright (#41437)
     add b0962ba5edb fix(plugin/chart/parallel-coordinate): prevent frontend crash with empty/undefined metrics when moving between pages quickly (#42392)
     add 6ab21b381a6 fix(mysql): resolve wire-protocol column types and mutate rows from immutable results (#42821)
     add a8a8b51afb8 fix(plugin-chart-table): guard row-indexed comparison-color lookups against undefined entries (#43139)
     add 27ec80c07b0 fix(explore): clear stale custom time-shift date error (#43146)
     add 31f06c0ee6d fix(dataset): correct Hours Offset filter bounds and grain-truncation order (#43173)
     add c635d0754fc fix(explore): honor column Label in filter search and pill (#43404)
     add 24b95f9ca7e fix(gsheets): correctly format Date-column filter literals (#43355)
     add 7dbf71a3791 fix(query-object): reject malformed ad-hoc metrics (#43353)
     add 94855e96262 fix(frontend): ignore stale list responses (#43306)
     add ca3d7670b77 fix(ci): restore scheduled CI checks (#43266)
     add 52571a5b8b1 chore(deps): bump the rjsf group in /superset-frontend with 3 updates (#43440)
     add dfd057b9201 chore(deps-dev): update clickhouse-connect requirement from <2.0,>=1.6.0 to >=1.7.1,<2.0 (#43419)
     add 7e3d092ac40 fix(soft-delete): name the recovery location in the archive confirmation (#43401)
     add 107204a1fc6 fix(sqllab): allow SQL Lab query owners to create charts without all_datasource_access (#42479)
     add 8b792ab6603 chore(deps-dev): bump @swc/core from 1.15.47 to 1.16.0 in /superset-frontend (#43446)
     add a9d54a00379 fix(soft-delete): card-view chart delete shows the archive dialog (#43469)
     add f83fb7c0e07 fix(archived-list): use the semantic-layers-aware label for the dataset type (#43465)
     add bd7b7392122 chore: remove obsolete pandas/SQLAlchemy version compat shim (#43497)
     add 6c2fef29cb7 feat(snowflake): Add support for OAuth 2.0 authentication (#36856)
     add 9dd8c42f3d4 chore(deps): bump dompurify from 3.4.12 to 3.4.13 in /superset-frontend (#43511)
     add 7bad69f523c chore(deps): bump dayjs from 1.11.22 to 1.11.23 in /superset-frontend (#43510)
     add d2aeb29223f chore(deps-dev): bump baseline-browser-mapping from 2.11.14 to 2.11.15 in /superset-frontend (#43508)
     add cbfa94c4dd6 chore(deps): bump antd from 6.6.0 to 6.6.1 in /docs (#43506)
     add d480152735e chore(deps): bump the storybook group in /docs with 2 updates (#43505)
     add ef0ad01aa56 chore(deps-dev): bump the storybook group across 1 directory with 5 updates (#43507)
     add fd3849cef1b chore(deps): bump antd from 6.6.0 to 6.6.1 in /superset-frontend (#43509)
     add f9530f31abb fix(table): keep each metric's own aggregate in the summary row by default (#43421)
     add 02b3e43b66b fix(number-format): preserve custom smart formatter id (#43439)
     add 34ffa37aaa4 chore(ci): drop inert SQLALCHEMY_WARN_20 flag from unit-test CI (#43495)
     add 3585e8235a7 fix(i18n): review Traditional Chinese count labels (#43063)
     add fc4d7221ecb fix(explore): skip re-fetch when navigating away from /explore (#39506)
     add f903e02d910 chore(deps): restore permissive marshmallow lower bound (>=3.0, <5) (#43521)
     add 88d2c2954e5 feat(deletion-retention): persist purge block reason codes on the audit log (#43485)
     add b89da3e9fca docs(versioning): fix post-flip doc and comment drift (#43493)
     add 68386a53ee2 chore(database): remove dead extra validation exception classes (#42411)
     add 90dab7cf61b fix(mcp): accept common chart input variants (#43130)
     add 649d6f1b41f fix(mcp): defer unknown numeric types to compile (#43131)
     add 0dcb2ca53a4 feat(maps): Add Italy regions and autonomous provinces country map (#42309)
     add e6b9205821b fix(country-map): give Alborz its own ISO code instead of reusing Tehran's (#42429)
     add 61ab0cdb5dd fix(ocient): update GIS test fixtures for pyocient's relocated geo types (#43496)
     add 473c318335b chore(superset-core): add __init__.py to semantic_layers (#43528)
     add 62d74be0afe fix(metadb): apply SUPERSET_META_DB_LIMIT after join instead of per-table (#36304) (#42598)
     add 2dfe8a5bd98 fix(OAuth2): Support creating OAuth2 connections via SQLAlchemy URI (#43489)
     add b4f7114a091 fix(semantic-layer): warn that deleting a layer cascade-deletes its dependent views (#42845)
     add 1fd763bd29b fix(mcp): honor and validate chart filters (#43478)
     add 19eca6523fb chore(deps): bump uuid from 14.0.1 to 14.0.2 in /superset-frontend (#43545)
     add 6194c852f1d chore(deps-dev): bump oxfmt from 0.63.0 to 0.64.0 in /docs (#43544)
     add e97db01482b chore(deps-dev): bump oxfmt from 0.63.0 to 0.64.0 in /superset-frontend (#43542)
     add 622bc45c9ec chore(deps-dev): bump @swc/core from 1.16.0 to 1.16.1 in /superset-frontend (#43541)
     add 2bc96a47a45 chore(deps): bump swagger-ui-react from 5.32.13 to 5.32.14 in /docs (#43540)
     add 450e2edc2b0 chore(deps): bump @swc/core from 1.16.0 to 1.16.1 in /docs (#43539)
     add 5a4900abb1a chore(deps-dev): bump vitest from 4.1.10 to 4.1.11 in /superset-websocket (#43538)
     add 686245a905a chore(deps-dev): bump oxfmt from 0.63.0 to 0.64.0 in /superset-websocket (#43537)
     add e7ca8b8a571 fix(chart): render ECharts charts at full resolution in download-as-image (#43456)
     add 0597f36bb62 chore(deps-dev): bump oxlint from 1.78.0 to 1.79.0 in /superset-frontend (#43543)
     add 455e6603c10 feat(reports): gate retry functionality behind ALERT_REPORTS_RETRY flag (#43553)
     add 70c9203aa9c fix(sqllab): release DB connection before fetching query results from backend (#43371)
     add 434511cb376 fix(mcp): reject unsafe dashboard layout replacements (#43476)
     add 13927f27e2b fix(mcp): raise SDK floor (#43530)
     add b8308a44a30 fix(pivot-table): exclude rollup totals from conditional formatting scale (#43481)
     add a140e74f5f5 fix(excel): handle duplicate column labels in xlsx export (#43561)
     add 371e5e25e83 fix(trino): honor the verify arg for the user impersonation flow (#43534)
     add 6b0aa8714d1 chore(deps): raise Pillow/PyJWT floors to match resolved pins (#43519)
     add 1c66b71e232 feat(plugin-chart-echarts): allow decal patterns in custom ECharts options (#43427)
     add 0e172a6ff3c feat(waterfall): add show/hide toggles for X and Y axes (#42371)
     add b71293acde0 fix(sqllab): stop a database with no extra from breaking SET_DATABASES (#43216)
     add ca63bb532d1 fix(plugin-chart-table): preserve comparison arrow when a column-specific formatter entry is missing (#43494)
     add 7d355a254ea fix(Modal): stop the draggable modal from hijacking text selection (#43498)
     add 0ab64e305c0 chore(deps-dev): bump lerna from 10.0.0 to 10.0.1 in /superset-frontend (#43580)
     add 5ea7d05d985 chore(deps): bump immer from 11.1.17 to 11.1.18 in /superset-frontend (#43581)
     add d1b7a4fdb41 chore(deps): bump dompurify from 3.4.13 to 3.4.14 in /superset-frontend (#43579)
     add 5879994e683 fix(charts): resolve export filenames from the chart, not the form data (#43280)
     add fde0fbd315b fix(ci): unblock lint-frontend after the oxlint 1.79.0 bump (#43587)
     add 905a35d05f7 fix(mcp): resolve dashboard permalinks (#43482)
     add 76151beade2 fix(export): truncate exported filenames to prevent Windows path extraction errors (#42531) (#42541)
     add ff1d9f9e095 chore(deps): bump dawidd6/action-download-artifact from 21 to 24 (#43441)
     add bde1c483b06 chore(deps): group Dependabot security-update PRs per directory (#43604)
     add e8aea6b6dfe fix: remove redundant 'tooltip' tooltip in scoping modal (#43455)
     add c2266f860cb chore(deps-dev): update clickhouse-connect requirement from <2.0,>=1.7.1 to >=1.7.2,<2.0 (#43608)
     add 87c48cc473d feat(echarts): make bar chart label position user-configurable (#38695)
     add d013bc7a21f chore(deps): bump baseline-browser-mapping from 2.11.15 to 2.11.16 in /docs (#43613)
     add 926e0e6a920 fix(chart-data): validate select()'s exclude option instead of raising 500s (#42410)
     add 6d8cbbfe8d9 fix(api): stop export downloads inheriting the one-year Cache-Control (#43185)
     add a3072c0bf68 fix(deckgl): give handlebars tooltips an opaque background (#43195)
     add 22027ec24ce fix(explore): require a value for adhoc filters before save (#43317)
     add 7f0f2c1faab Merge remote-tracking branch 'origin/master' into fix-bar-chart-label-placement

No new revisions were added by this update.

Summary of changes:
 .codecov.yml                                       |   2 -
 .github/dependabot.yml                             |  26 +
 .github/workflows/bump-python-package.yml          |   2 +-
 .github/workflows/frontend-bundle-size-nightly.yml |   1 +
 .github/workflows/mirror-service-images.yml        |   2 +-
 .github/workflows/superset-docs-deploy.yml         |   4 +-
 .github/workflows/superset-docs-verify.yml         |   2 +-
 .github/workflows/superset-e2e.yml                 |   8 +-
 .../workflows/superset-python-integrationtest.yml  |  12 +-
 .github/workflows/superset-python-presto-hive.yml  |  10 +-
 .github/workflows/superset-python-unittest.yml     |  15 +-
 UPDATING.md                                        |  71 +-
 docs/admin_docs/configuration/mcp-server.mdx       |  43 +-
 docs/data/countries.json                           |   1 +
 docs/docs/using-superset/recently-archived.mdx     |   8 +-
 docs/docs/using-superset/version-history.mdx       |  24 +-
 docs/package.json                                  |  16 +-
 docs/sip/median-stddev-variance-aggregates.md      | 236 ++++++
 docs/src/pages/community.tsx                       |   2 +-
 docs/static/feature-flags.json                     |  30 +-
 docs/yarn.lock                                     | 500 +++++------
 pyproject.toml                                     |  29 +-
 requirements/base.in                               |   2 +-
 requirements/base.txt                              |   8 +-
 requirements/development.txt                       |  20 +-
 scripts/change_detector.py                         |   1 +
 .../src/superset_core/semantic_layers}/__init__.py |   2 +-
 superset-frontend/oxlint.json                      |   2 +-
 superset-frontend/package-lock.json                | 942 ++++++++-------------
 superset-frontend/package.json                     |  38 +-
 .../src/components/MetricOption.tsx                |  16 +-
 .../src/sections/timeComparison.tsx                |   6 +
 .../src/utils/getTotalsMetrics.test.ts             |  29 +-
 .../src/utils/getTotalsMetrics.ts                  |  42 +-
 .../test/components/MetricOption.test.tsx          |  23 +
 .../packages/superset-ui-core/package.json         |   6 +-
 .../src/components/Modal/Modal.test.tsx            | 153 ++++
 .../src/components/Modal/Modal.tsx                 |  25 +-
 .../src/components/Select/types.ts                 |   3 +
 .../factories/createSmartNumberFormatter.ts        |   5 +-
 .../superset-ui-core/src/query/types/Metric.ts     |   5 +-
 .../superset-ui-core/src/time-format/index.ts      |   1 +
 .../superset-ui-core/src/utils/featureFlags.ts     |   1 +
 .../superset-ui-core/src/utils/html.test.tsx       |  37 +
 .../packages/superset-ui-core/src/utils/html.tsx   |  27 +-
 .../factories/createSmartNumberFormatter.test.ts   |   6 +
 .../playwright/components/core/Menu.ts             |  71 +-
 .../playwright/components/modals/ConfirmDialog.ts  |   6 +-
 .../components/modals/DrillDetailModal.ts          | 133 +++
 .../playwright/components/modals/index.ts          |   1 +
 .../playwright/pages/DashboardPage.ts              | 121 +++
 .../dashboard/dashboard-drill-to-detail.spec.ts    | 747 ++++++++++++++++
 .../tests/recently-archived/delete-modal.spec.ts   |  58 --
 .../recently-archived/recently-archived.spec.ts    |  57 +-
 .../tests/version-history/activity-log.spec.ts     | 127 ++-
 .../plugin-chart-ag-grid-table/src/buildQuery.ts   |  11 +-
 .../src/controlPanel.tsx                           |  14 +-
 .../src/renderers/NumericCellRenderer.tsx          |  12 +-
 .../test/NumericCellRenderer.test.tsx              |  59 ++
 .../test/buildQuery.test.ts                        |  28 +-
 .../plugins/plugin-chart-calendar/src/utils.ts     |   8 +
 .../src/vendor/cal-heatmap.ts                      |   9 +-
 .../plugin-chart-calendar/test/cal-heatmap.test.ts |  30 +
 .../plugin-chart-calendar/test/utils.test.ts       |  25 +-
 .../src/util/layerUtil.tsx                         |  27 +-
 .../test/util/layerUtil.test.ts                    |  47 +-
 .../scripts/Country Map GeoJSON Generator.ipynb    | Bin 11004185 -> 11010873 bytes
 .../plugin-chart-country-map/src/countries.ts      |   5 +
 .../src/countries/iran.geojson                     | Bin 134537 -> 134537 bytes
 ...italy_regions_and_autonomous_provinces.geojson} | Bin 107344 -> 108915 bytes
 .../test/countries.test.ts                         |  58 ++
 .../test/iran.geojson.test.ts                      |  69 ++
 .../src/MixedTimeseries/controlPanel.tsx           |  25 +
 .../src/MixedTimeseries/transformProps.ts          |  23 +-
 .../src/MixedTimeseries/types.ts                   |  15 +
 .../plugin-chart-echarts/src/Radar/utils.ts        |  16 +-
 .../src/Timeseries/EchartsTimeseries.test.tsx      | 736 ++++++++++++++--
 .../src/Timeseries/EchartsTimeseries.tsx           | 205 ++++-
 .../src/Timeseries/buildQuery.ts                   |   7 +-
 .../src/Timeseries/constants.ts                    |   1 +
 .../src/Timeseries/transformProps.ts               |  28 +-
 .../src/Timeseries/transformers.ts                 |  31 +-
 .../plugin-chart-echarts/src/Timeseries/types.ts   |  12 +
 .../src/Waterfall/controlPanel.tsx                 |  38 +
 .../src/Waterfall/transformProps.ts                |  10 +-
 .../plugin-chart-echarts/src/Waterfall/types.ts    |   4 +
 .../plugins/plugin-chart-echarts/src/controls.tsx  |  30 +
 .../src/utils/eChartOptionsSchema.ts               |  62 +-
 .../plugin-chart-echarts/src/utils/forecast.ts     |  15 +
 .../src/utils/safeEChartOptionsParser.test.ts      | 161 ++++
 .../test/MixedTimeseries/controlPanel.test.ts      | 109 +++
 .../test/MixedTimeseries/transformProps.test.ts    | 160 +++-
 .../plugin-chart-echarts/test/Radar/utils.test.ts  |  38 +
 .../test/Timeseries/EchartsTimeseries.test.tsx     | 426 +++++++++-
 .../test/Timeseries/buildQuery.test.ts             |  22 +
 .../test/Timeseries/transformProps.test.ts         | 237 ++++++
 .../test/Timeseries/transformers.test.ts           |   8 +-
 .../test/Waterfall/transformProps.test.ts          |  53 ++
 .../test/utils/forecast.test.ts                    |  33 +
 .../src/transformProps.ts                          |   2 +-
 .../test/transformProps.test.ts}                   |  31 +-
 .../src/plugin/transformProps.ts                   |  19 +-
 .../test/plugin/transformProps.test.ts             | 149 ++++
 .../test/plugin/utilities.test.ts                  |  19 +
 .../plugins/plugin-chart-table/src/TableChart.tsx  |  49 +-
 .../plugins/plugin-chart-table/src/buildQuery.ts   |   5 +-
 .../plugin-chart-table/src/controlPanel.tsx        |  14 +-
 .../plugin-chart-table/test/TableChart.test.tsx    |  77 ++
 .../plugin-chart-table/test/buildQuery.test.ts     |  27 +-
 .../plugins/plugin-chart-world-map/src/WorldMap.ts |  25 +-
 .../plugin-chart-world-map/test/WorldMap.test.ts   |  27 +
 .../src/components/Tooltip.test.tsx                |  64 ++
 .../preset-chart-deckgl/src/components/Tooltip.tsx |  26 +-
 superset-frontend/src/SqlLab/actions/sqlLab.ts     |  12 +-
 .../src/SqlLab/components/ResultSet/index.tsx      |   4 +-
 .../SaveDatasetActionButton.test.tsx               |  26 +-
 .../components/SaveDatasetActionButton/index.tsx   |   9 +-
 .../SqlLab/components/SaveQuery/SaveQuery.test.tsx |   1 +
 .../src/SqlLab/components/SaveQuery/index.tsx      |   3 +
 .../SqlLab/components/SqlEditor/SqlEditor.test.tsx |  42 +
 .../src/SqlLab/components/SqlEditor/index.tsx      |  10 +-
 .../src/SqlLab/reducers/sqlLab.test.ts             |  47 +
 superset-frontend/src/SqlLab/reducers/sqlLab.ts    |  23 +-
 .../DatasourceModal/DatasourceModal.test.tsx       |   8 +-
 .../Datasource/DatasourceModal/index.tsx           |   2 +-
 .../DatasourceEditor/DatasourceEditor.tsx          |  69 +-
 .../tests/hydrateMetricExtra.test.ts               |  96 +++
 .../src/components/FilterableTable/index.tsx       |   2 +-
 .../src/components/FilterableTable/utils.test.tsx  |  29 +
 .../src/components/FilterableTable/utils.tsx       |   6 +-
 .../test/testHelpers.tsx => src/constants.test.ts} |  26 +-
 superset-frontend/src/constants.ts                 |   1 +
 .../CrossFilters/ScopingModal/ScopingTreePanel.tsx |  13 +-
 .../src/dashboard/util/permissionUtils.test.ts     |  15 +
 .../src/dashboard/util/permissionUtils.ts          |   7 +-
 .../src/explore/actions/hydrateExplore.test.ts     |  76 +-
 .../src/explore/actions/hydrateExplore.ts          |  34 +-
 .../src/explore/actions/saveModalActions.test.ts   | 248 +++++-
 .../src/explore/actions/saveModalActions.ts        |  97 ++-
 .../components/useGridResultTable.tsx              |   6 +-
 .../AnnotationLayer.test.tsx                       |   8 +-
 .../AnnotationLayerControl/AnnotationLayer.tsx     |   2 +-
 .../ColorBreakpointOption.test.tsx                 |  25 +
 .../ColorBreakpointOption.tsx                      |  17 +-
 .../DatasourceControl/DatasourceControl.test.tsx   |   6 +-
 .../DndAdhocFilterOption.tsx                       |   2 +-
 .../DndFilterSelect.test.tsx                       |  31 +-
 .../FilterControl/AdhocFilter/AdhocFilter.test.ts  |  60 ++
 .../controls/FilterControl/AdhocFilter/index.ts    |  16 +-
 .../AdhocFilterEditPopover.test.tsx                |  23 +
 ...AdhocFilterEditPopoverSimpleTabContent.test.tsx |  37 +
 .../index.tsx                                      |   4 +
 .../AdhocFilterOption/AdhocFilterOption.test.tsx   |  18 +
 .../FilterControl/AdhocFilterOption/index.tsx      |   2 +-
 .../controls/FilterControl/utils/translateToSQL.ts |  34 +-
 .../FixedOrMetricControl.test.tsx                  |   9 +-
 .../controls/MetricControl/AdhocMetric.test.ts     |  39 +
 .../controls/MetricControl/AdhocMetric.ts          |  13 +
 .../MetricControl/AdhocMetricEditPopover/index.tsx |   3 +-
 .../VizTypeControl/VizTypeControl.test.tsx         |  18 +
 .../controls/VizTypeControl/VizTypeGallery.tsx     |  60 +-
 .../useExploreAdditionalActionsMenu/index.tsx      |  43 +-
 .../useExploreAdditionalActionsMenu.test.tsx       |  40 +
 superset-frontend/src/explore/constants.ts         |  13 +-
 .../src/explore/reducers/exploreReducer.test.ts    |  75 +-
 .../src/features/alerts/AlertReportModal.tsx       |  14 +-
 .../src/features/charts/ChartCard.test.tsx         | 167 ++++
 .../src/features/charts/ChartCard.tsx              |  48 +-
 .../src/features/dashboards/DashboardCard.test.tsx |  51 +-
 .../src/features/dashboards/DashboardCard.tsx      |  12 +-
 .../databases/DatabaseModal/ExtraOptions.tsx       |   7 +-
 .../databases/DatabaseModal/index.test.tsx         |   3 +-
 .../UploadDataModel/UploadDataModal.test.tsx       |  12 +-
 .../AddDataset/DatasetPanel/DatasetPanel.test.tsx  |   9 +-
 .../DatasetPanel/DatasetPanelWrapper.test.tsx      |   9 +-
 .../reports/ReportModal/ReportModal.test.tsx       |  21 +-
 .../src/features/reports/ReportModal/index.tsx     |  22 +-
 .../src/features/roles/RoleFormItems.tsx           |   6 +
 .../features/versionHistory/normalization.test.ts  | 158 ++++
 .../src/features/versionHistory/normalization.ts   | 197 +++++
 .../src/features/versionHistory/reducer.test.ts    |  56 ++
 .../src/features/versionHistory/reducer.ts         | 133 ++-
 .../versionHistory/sessionLogMiddleware.test.ts    |  46 +-
 .../versionHistory/sessionLogMiddleware.ts         |  85 +-
 .../src/features/versionHistory/types.ts           |  41 +
 .../src/pages/ArchivedList/ArchivedList.test.tsx   | 137 +++
 superset-frontend/src/pages/ArchivedList/index.tsx |  19 +-
 superset-frontend/src/pages/Chart/Chart.test.tsx   |  48 +-
 superset-frontend/src/pages/Chart/index.tsx        |  10 +
 .../src/pages/ChartList/ChartList.test.tsx         | 254 ++++++
 superset-frontend/src/pages/ChartList/index.tsx    | 224 +++--
 .../src/pages/DashboardList/index.tsx              |   8 +-
 .../DatabaseList.semanticLayerDelete.test.tsx      | 425 ++++++++++
 superset-frontend/src/pages/DatabaseList/index.tsx | 173 +++-
 superset-frontend/src/pages/Home/Home.test.tsx     |   2 +-
 .../pages/SavedQueryList/SavedQueryList.test.tsx   | 141 ++-
 .../src/pages/SavedQueryList/index.tsx             |  22 +-
 .../src/pages/SqlLab/LocationContext.test.tsx      |  66 ++
 .../src/pages/SqlLab/LocationContext.tsx           |   6 +-
 superset-frontend/src/types/Chart.ts               |   2 +
 .../src/utils/downloadAsImage.test.ts              | 234 +++++
 superset-frontend/src/utils/downloadAsImage.tsx    |  90 +-
 superset-frontend/src/utils/softDeleteCopy.test.ts |  18 +-
 superset-frontend/src/utils/softDeleteCopy.ts      |  21 +-
 superset-frontend/src/views/CRUD/hooks.test.tsx    | 156 ++++
 superset-frontend/src/views/CRUD/hooks.ts          |  31 +-
 superset-frontend/src/views/CRUD/types.ts          |   2 +
 superset-frontend/src/views/CRUD/utils.test.tsx    |  60 ++
 superset-frontend/src/views/CRUD/utils.tsx         |  18 +-
 .../components/LeftCell/LeftCell.test.tsx          |  55 ++
 .../TimeTable/components/LeftCell/LeftCell.tsx     |  19 +-
 superset-websocket/package-lock.json               | 626 ++++++--------
 superset-websocket/package.json                    |   4 +-
 superset-websocket/spec/index.test.ts              |  36 +
 superset-websocket/src/index.ts                    |  14 +-
 superset/__init__.py                               |  10 -
 superset/charts/api.py                             |  44 +-
 superset/charts/data/api.py                        |  60 +-
 superset/charts/schemas.py                         |  78 +-
 superset/commands/chart/delete.py                  |  60 +-
 superset/commands/chart/update.py                  |  25 +-
 .../commands/dashboard/importers/dispatcher.py     |  12 +-
 superset/commands/database/exceptions.py           |  36 -
 superset/commands/database/importers/v1/utils.py   |  82 +-
 superset/commands/dataset/importers/dispatcher.py  |  12 +-
 superset/commands/dataset/importers/v1/utils.py    |  34 +-
 superset/commands/deletion_retention/audit.py      | 122 ++-
 .../commands/deletion_retention/force_purge.py     |   2 +-
 .../commands/deletion_retention/purge_cascade.py   |  36 +-
 .../commands/deletion_retention/purge_policy.py    |  94 +-
 superset/commands/importers/v1/utils.py            |  85 +-
 superset/commands/query/importers/v1/utils.py      |  42 +-
 superset/commands/report/create.py                 |   2 +-
 superset/commands/report/execute.py                |  11 +-
 superset/commands/report/update.py                 |  37 +-
 superset/commands/semantic_layer/create.py         |   8 +-
 superset/commands/semantic_layer/delete.py         |  19 +-
 superset/commands/semantic_layer/update.py         |  13 +-
 superset/commands/sql_lab/execute.py               |  26 +
 superset/commands/sql_lab/permalink/get.py         |  23 +-
 superset/commands/sql_lab/results.py               |  12 +
 superset/commands/streaming_export/base.py         |  34 +-
 superset/commands/tag/create.py                    |   7 +-
 superset/commands/tag/delete.py                    |  49 +-
 superset/commands/tag/exceptions.py                |  13 +
 superset/commands/tag/update.py                    |   7 +-
 superset/commands/tag/utils.py                     |  21 -
 superset/commands/theme/import_themes.py           |  12 +
 superset/commands/theme/update.py                  |  10 +
 superset/commands/utils.py                         |  25 +
 superset/commands/version_restore.py               |   4 +-
 superset/common/form_data_query_context.py         |   4 +-
 superset/common/query_object.py                    |  64 +-
 superset/config.py                                 |  36 +-
 superset/connectors/sqla/models.py                 |  92 +-
 superset/daos/report.py                            |  16 +-
 superset/daos/tag.py                               |  18 +-
 superset/dashboards/api.py                         |  99 ++-
 superset/databases/api.py                          |  17 +-
 superset/datasets/api.py                           |  14 +-
 superset/datasets/schemas.py                       |  21 +-
 superset/db_engine_specs/base.py                   |  66 +-
 superset/db_engine_specs/cockroachdb.py            |   9 +-
 superset/db_engine_specs/doris.py                  |   8 +-
 superset/db_engine_specs/duckdb.py                 |  16 +-
 superset/db_engine_specs/greenplum.py              |  10 +
 superset/db_engine_specs/gsheets.py                |  24 +-
 superset/db_engine_specs/hana.py                   |   8 +-
 superset/db_engine_specs/hologres.py               |  10 +
 superset/db_engine_specs/mysql.py                  |  88 +-
 superset/db_engine_specs/netezza.py                |   9 +
 superset/db_engine_specs/oceanbase.py              |   9 +-
 superset/db_engine_specs/postgres.py               |  87 ++
 superset/db_engine_specs/redshift.py               |  22 +-
 superset/db_engine_specs/risingwave.py             |  10 +
 superset/db_engine_specs/snowflake.py              | 195 ++++-
 superset/db_engine_specs/sqlite.py                 |  22 +-
 superset/db_engine_specs/starrocks.py              |   9 +-
 superset/db_engine_specs/trino.py                  |   3 +
 superset/db_engine_specs/vertica.py                |   9 +
 superset/db_engine_specs/yugabytedb.py             |  10 +
 superset/examples/birth_names.py                   |   8 +-
 .../examples/usa_births_names/charts/Boys.yaml     |   2 +-
 .../examples/usa_births_names/charts/Girls.yaml    |   2 +-
 superset/examples/utils.py                         |   2 +-
 superset/extensions/metadb.py                      |  86 +-
 superset/importexport/api.py                       |  12 +-
 superset/initialization/__init__.py                |  30 +-
 superset/jinja_context.py                          |  68 +-
 superset/mcp_service/README.md                     |  21 +-
 superset/mcp_service/__main__.py                   |  27 +-
 superset/mcp_service/annotation_layer/schemas.py   |  78 +-
 superset/mcp_service/app.py                        |  11 +-
 superset/mcp_service/auth.py                       |  12 +-
 superset/mcp_service/caching.py                    |  48 +-
 superset/mcp_service/chart/chart_helpers.py        |   7 +
 superset/mcp_service/chart/chart_utils.py          |  17 +-
 superset/mcp_service/chart/plugins/histogram.py    |  28 +-
 .../chart/prompts/create_chart_guided.py           |   4 +-
 superset/mcp_service/chart/schemas.py              | 215 ++---
 superset/mcp_service/chart/tool/delete_chart.py    |  12 +-
 superset/mcp_service/chart/tool/generate_chart.py  |  36 +-
 superset/mcp_service/chart/tool/get_chart_data.py  | 330 ++++----
 superset/mcp_service/chart/tool/get_chart_info.py  |  44 +-
 .../mcp_service/chart/tool/get_chart_preview.py    |  82 +-
 superset/mcp_service/chart/tool/get_chart_sql.py   | 131 ++-
 superset/mcp_service/chart/tool/restore_chart.py   |  60 +-
 superset/mcp_service/chart/tool/update_chart.py    |   9 +-
 .../chart/validation/dataset_validator.py          |  30 +-
 .../chart/validation/runtime/format_validator.py   |   9 +-
 .../mcp_service/dashboard/layout_validation.py     | 312 +++++++
 superset/mcp_service/dashboard/permalink.py        | 184 ++++
 superset/mcp_service/dashboard/schemas.py          | 609 +++++--------
 .../mcp_service/dashboard/tool/delete_dashboard.py |  14 +-
 .../dashboard/tool/duplicate_dashboard.py          |  13 +-
 .../dashboard/tool/get_dashboard_info.py           | 157 ++--
 .../dashboard/tool/get_dashboard_layout.py         |  43 +-
 .../dashboard/tool/manage_native_filters.py        |  26 +-
 .../dashboard/tool/remove_chart_from_dashboard.py  |   5 +-
 .../dashboard/tool/restore_dashboard.py            |  65 +-
 .../mcp_service/dashboard/tool/update_dashboard.py |  14 +-
 superset/mcp_service/dataset/schemas.py            | 198 ++---
 .../dataset/tool/update_dataset_metric.py          |  49 +-
 superset/mcp_service/mcp_config.py                 | 149 +++-
 superset/mcp_service/middleware.py                 |  27 +-
 superset/mcp_service/report/schemas.py             |  18 +-
 superset/mcp_service/role/schemas.py               |  19 +-
 superset/mcp_service/server.py                     |  56 +-
 superset/mcp_service/sql_lab/tool/execute_sql.py   |   7 +-
 .../sql_lab/tool/open_sql_lab_with_context.py      |  85 +-
 superset/mcp_service/system/schemas.py             |  28 +-
 superset/mcp_service/system/tool/find_users.py     |  12 +-
 superset/mcp_service/tag/schemas.py                |  32 +-
 superset/mcp_service/task/schemas.py               |  11 +-
 superset/mcp_service/theme/schemas.py              |  50 +-
 superset/mcp_service/theme/tool/create_theme.py    |  10 +-
 superset/mcp_service/user/schemas.py               |  30 +-
 superset/mcp_service/utils/__init__.py             |   2 -
 superset/mcp_service/utils/sanitization.py         | 146 ----
 ...0_39097d124752_add_reason_to_purge_audit_log.py |  60 ++
 superset/models/helpers.py                         | 427 ++++++++--
 superset/models/purge_audit_log.py                 |   6 +
 superset/models/sql_lab.py                         |   2 +
 superset/queries/saved_queries/api.py              |  14 +-
 superset/reports/filters.py                        |  30 +-
 superset/reports/logs/api.py                       |   8 +
 superset/reports/models.py                         |   4 +-
 superset/reports/notifications/webhook.py          | 140 ++-
 superset/reports/schemas.py                        |  44 +-
 superset/security/api.py                           |  15 +
 superset/security/manager.py                       | 337 ++++++++
 superset/semantic_layers/api.py                    |  37 +
 superset/semantic_layers/models.py                 |  20 +
 superset/sql/execution/executor.py                 |  42 +-
 superset/sql/parse.py                              | 178 +++-
 superset/sql_lab.py                                |  10 +-
 superset/tags/api.py                               |  58 ++
 superset/tasks/cron_util.py                        |  45 +
 superset/tasks/deletion_retention.py               |  29 +-
 superset/tasks/thumbnails.py                       |   3 +
 superset/tasks/types.py                            |   7 +-
 superset/tasks/utils.py                            |  95 +--
 superset/themes/api.py                             |  16 +-
 superset/thumbnails/digest.py                      |  13 +-
 superset/translations/es/LC_MESSAGES/messages.po   |  39 +-
 superset/translations/messages.pot                 |  28 +-
 .../translations/zh_TW/LC_MESSAGES/messages.po     |  89 +-
 superset/utils/core.py                             |  67 +-
 superset/utils/database.py                         |  36 +
 superset/utils/date_parser.py                      |  24 +-
 superset/utils/excel.py                            |  71 +-
 superset/utils/file.py                             |  71 +-
 superset/utils/pandas_postprocessing/__init__.py   |  17 +
 superset/utils/pandas_postprocessing/histogram.py  |  21 +
 superset/utils/pandas_postprocessing/prophet.py    |  15 +
 superset/utils/pandas_postprocessing/resample.py   |  32 +
 superset/utils/pandas_postprocessing/rolling.py    |  15 +
 superset/utils/pandas_postprocessing/select.py     |  29 +-
 superset/utils/pandas_sqlalchemy_compat.py         |  80 --
 superset/utils/screenshots.py                      |  51 +-
 superset/versioning/changes/listener.py            |   2 +
 superset/versioning/changes/normalization.py       | 300 +++++++
 superset/versioning/changes/state.py               |  14 +
 tests/integration_tests/charts/api_tests.py        |  10 +-
 .../integration_tests/charts/soft_delete_tests.py  |   5 +-
 tests/integration_tests/dashboards/api_tests.py    | 207 ++++-
 tests/integration_tests/databases/api_tests.py     |  54 +-
 .../integration_tests/databases/commands_tests.py  |   8 +-
 tests/integration_tests/datasets/api_tests.py      | 102 ++-
 .../db_engine_specs/postgres_tests.py              |   5 +-
 .../deletion_retention/audit_tests.py              | 248 +++++-
 .../deletion_retention/force_purge_tests.py        |   1 +
 .../deletion_retention/purge_tests.py              | 118 ++-
 .../queries/saved_queries/api_tests.py             |   3 -
 tests/integration_tests/query_context_tests.py     |  52 ++
 tests/integration_tests/reports/alert_tests.py     |   6 +-
 tests/integration_tests/reports/commands_tests.py  |   8 +
 tests/integration_tests/reports/utils.py           |  11 +-
 tests/integration_tests/sql_lab/commands_tests.py  | 141 ++-
 tests/integration_tests/tags/api_tests.py          |  43 +
 tests/integration_tests/tags/commands_tests.py     |  50 +-
 .../themes/test_theme_api_permissions.py           |  34 +-
 .../versioning/change_records_tests.py             | 137 +++
 .../charts/data/malformed_adhoc_metric_test.py     | 217 +++++
 tests/unit_tests/charts/test_chart_data_api.py     | 251 ++++++
 tests/unit_tests/charts/test_schemas.py            |  81 ++
 .../commands/chart/delete_message_test.py          |  63 ++
 .../chart/streaming_export_command_test.py         |  36 +
 .../deletion_retention/test_reason_codes.py        | 182 ++++
 .../importers/v1/import_saved_query_test.py        | 126 +++
 .../unit_tests/commands/importers/v1/utils_test.py | 151 ++++
 tests/unit_tests/commands/report/update_test.py    |   6 +
 .../commands/semantic_layer/create_test.py         | 184 ++++
 .../commands/semantic_layer/delete_test.py         | 199 ++++-
 .../commands/semantic_layer/update_test.py         | 155 +++-
 .../commands/sql_lab/permalink_get_test.py         |  87 ++
 tests/unit_tests/commands/sql_lab/test_execute.py  | 161 ++++
 tests/unit_tests/commands/test_utils.py            |  59 ++
 .../commands/theme/test_import_themes.py           | 193 +++++
 .../common/test_form_data_query_context.py         |  25 +
 .../common/test_query_context_processor.py         |   6 +-
 tests/unit_tests/common/test_time_shifts.py        | 354 +++++++-
 tests/unit_tests/daos/test_report_dao.py           |  57 +-
 .../commands/importers/dispatcher_test.py          |  25 +-
 .../commands/importers/v1/import_command_test.py   |   9 +-
 .../databases/commands/importers/v1/import_test.py | 240 ++++++
 tests/unit_tests/databases/schema_tests.py         |  38 +
 .../datasets/commands/importers/dispatcher_test.py |  18 +-
 .../datasets/commands/importers/v1/import_test.py  |  64 ++
 tests/unit_tests/datasets/schema_tests.py          |  45 +
 tests/unit_tests/db_engine_specs/test_aurora.py    |  37 +
 tests/unit_tests/db_engine_specs/test_base.py      |  19 +
 tests/unit_tests/db_engine_specs/test_bigquery.py  |  25 +-
 tests/unit_tests/db_engine_specs/test_duckdb.py    |  59 ++
 .../test_extended_aggregations_unverified.py       |  68 ++
 tests/unit_tests/db_engine_specs/test_gsheets.py   |  35 +
 .../unit_tests/db_engine_specs/test_mariadb.py     |  32 +-
 tests/unit_tests/db_engine_specs/test_mysql.py     | 131 ++-
 tests/unit_tests/db_engine_specs/test_ocient.py    |  15 +-
 tests/unit_tests/db_engine_specs/test_postgres.py  | 323 +++++++
 tests/unit_tests/db_engine_specs/test_redshift.py  |  30 +
 tests/unit_tests/db_engine_specs/test_snowflake.py | 303 ++++++-
 .../unit_tests/db_engine_specs/test_timescaledb.py |  37 +
 tests/unit_tests/db_engine_specs/test_trino.py     | 101 +++
 tests/unit_tests/examples/utils_test.py            |  20 +
 tests/unit_tests/extensions/test_sqlalchemy.py     | 405 +++++++++
 ...st.py => frontend_bundle_size_workflow_test.py} |  36 +-
 tests/unit_tests/jinja_context_test.py             |  84 ++
 .../tool/test_annotation_layer_tools.py            |  55 +-
 .../mcp_service/chart/test_chart_helpers.py        |  13 +
 .../mcp_service/chart/test_chart_schemas.py        |  42 +-
 .../mcp_service/chart/test_chart_utils.py          |  54 ++
 .../mcp_service/chart/tool/test_generate_chart.py  | 120 ++-
 .../mcp_service/chart/tool/test_get_chart_data.py  | 414 ++++++++-
 .../mcp_service/chart/tool/test_get_chart_info.py  |  70 +-
 .../chart/tool/test_get_chart_preview.py           |  64 +-
 .../mcp_service/chart/tool/test_get_chart_sql.py   | 396 ++++++++-
 .../mcp_service/chart/tool/test_restore_chart.py   | 120 ++-
 .../mcp_service/chart/tool/test_update_chart.py    |  14 +-
 .../chart/validation/test_dataset_validator.py     |  74 ++
 .../dashboard/test_dashboard_schemas.py            |  89 +-
 .../dashboard/test_layout_validation.py            | 401 +++++++++
 .../mcp_service/dashboard/test_permalink.py        | 374 ++++++++
 .../tool/test_add_chart_to_existing_dashboard.py   |  21 +-
 .../dashboard/tool/test_dashboard_tools.py         | 261 +++---
 .../dashboard/tool/test_duplicate_dashboard.py     |  15 +-
 .../dashboard/tool/test_get_dashboard_datasets.py  |   6 +-
 .../dashboard/tool/test_get_dashboard_layout.py    | 143 +++-
 .../tool/test_manage_dashboard_certification.py    |   5 +-
 .../dashboard/tool/test_manage_dashboard_owners.py |  18 +-
 .../dashboard/tool/test_manage_native_filters.py   |  33 +-
 .../dashboard/tool/test_restore_dashboard.py       | 121 ++-
 .../dashboard/tool/test_update_dashboard.py        | 135 ++-
 .../mcp_service/dataset/tool/test_dataset_tools.py |  36 +-
 .../dataset/tool/test_update_dataset_metric.py     | 167 +++-
 .../mcp_service/report/tool/test_report_tools.py   |  38 +-
 .../mcp_service/role/tool/test_role_tools.py       |  30 +-
 .../mcp_service/sql_lab/tool/test_execute_sql.py   |  46 +
 .../sql_lab/tool/test_open_sql_lab_with_context.py |  77 +-
 .../sql_lab/tool/test_save_sql_query.py            |  19 +-
 .../mcp_service/system/tool/test_find_users.py     |  65 +-
 .../mcp_service/tag/tool/test_tag_tools.py         |  13 +-
 .../mcp_service/task/tool/test_task_tools.py       |  15 +-
 .../mcp_service/test_auth_user_resolution.py       |  30 +
 .../mcp_service/test_guest_token_auth.py           |  21 +-
 .../unit_tests/mcp_service/test_main_entrypoint.py | 123 +++
 tests/unit_tests/mcp_service/test_mcp_caching.py   |  98 ++-
 tests/unit_tests/mcp_service/test_mcp_config.py    |  78 +-
 .../mcp_service/test_mcp_config_hs256_guard.py     | 150 ++++
 tests/unit_tests/mcp_service/test_mcp_server.py    | 112 +++
 tests/unit_tests/mcp_service/test_middleware.py    | 101 +++
 .../mcp_service/test_result_value_contract.py      | 211 +++++
 .../mcp_service/theme/tool/test_create_theme.py    |  16 +-
 .../mcp_service/theme/tool/test_get_theme_info.py  |  10 +-
 tests/unit_tests/mcp_service/user/test_schemas.py  |  12 +-
 .../mcp_service/user/tool/test_user_tools.py       |  42 +-
 .../mcp_service/utils/test_sanitization.py         | 335 +-------
 tests/unit_tests/models/helpers_test.py            |  70 ++
 .../models/test_hours_offset_bound_truncation.py   | 702 +++++++++++++++
 .../pandas_postprocessing/test_histogram.py        |  25 +
 .../pandas_postprocessing/test_prophet.py          |  18 +
 .../pandas_postprocessing/test_resample.py         |  39 +
 .../pandas_postprocessing/test_rolling.py          |  17 +
 .../pandas_postprocessing/test_select.py           |  29 +
 tests/unit_tests/queries/query_object_test.py      | 147 +++-
 tests/unit_tests/reports/filters_test.py           |  66 ++
 tests/unit_tests/reports/logs_api_test.py          |  37 +
 .../reports/notifications/webhook_tests.py         | 199 +++++
 tests/unit_tests/reports/schemas_test.py           |  10 +
 tests/unit_tests/security/api_test.py              |  33 +-
 tests/unit_tests/security/manager_test.py          | 120 +++
 tests/unit_tests/semantic_layers/api_test.py       | 161 ++++
 tests/unit_tests/semantic_layers/models_test.py    |  84 ++
 tests/unit_tests/sql/execution/test_executor.py    | 177 ++++
 tests/unit_tests/sql/parse_tests.py                | 166 ++++
 tests/unit_tests/sql_lab_test.py                   | 157 ++--
 tests/unit_tests/tags/api_test.py                  | 164 ++++
 tests/unit_tests/tags/commands/delete_test.py      | 198 +++++
 tests/unit_tests/tags/commands/update_test.py      | 152 ++++
 tests/unit_tests/tasks/test_cron_util.py           |  56 +-
 tests/unit_tests/tasks/test_utils.py               |  97 ++-
 tests/unit_tests/themes/commands_test.py           |  51 ++
 tests/unit_tests/thumbnails/test_digest.py         |  88 +-
 tests/unit_tests/utils/date_parser_tests.py        |   5 +
 tests/unit_tests/utils/excel_tests.py              | 107 +++
 tests/unit_tests/utils/map_type_tests.py           |  15 +
 .../utils/pandas_sqlalchemy_compat_test.py         |  67 --
 tests/unit_tests/utils/screenshot_test.py          | 107 +++
 tests/unit_tests/utils/send_export_zip_tests.py    |  69 ++
 tests/unit_tests/utils/test_core.py                |  18 +-
 tests/unit_tests/utils/test_file.py                | 188 +++-
 tests/unit_tests/versioning/test_listener.py       |   1 +
 .../versioning/test_normalization_changes.py       | 186 ++++
 533 files changed, 29979 insertions(+), 6124 deletions(-)
 create mode 100644 docs/sip/median-stddev-variance-aggregates.md
 copy {superset/mcp_service/screenshot => superset-core/src/superset_core/semantic_layers}/__init__.py (93%)
 create mode 100644 superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.test.tsx
 create mode 100644 superset-frontend/playwright/components/modals/DrillDetailModal.ts
 create mode 100644 superset-frontend/playwright/tests/dashboard/dashboard-drill-to-detail.spec.ts
 delete mode 100644 superset-frontend/playwright/tests/recently-archived/delete-modal.spec.ts
 create mode 100644 superset-frontend/plugins/plugin-chart-ag-grid-table/test/NumericCellRenderer.test.tsx
 copy superset-frontend/plugins/plugin-chart-country-map/src/countries/{italy_regions.geojson => italy_regions_and_autonomous_provinces.geojson} (68%)
 create mode 100644 superset-frontend/plugins/plugin-chart-country-map/test/countries.test.ts
 create mode 100644 superset-frontend/plugins/plugin-chart-country-map/test/iran.geojson.test.ts
 create mode 100644 superset-frontend/plugins/plugin-chart-echarts/test/MixedTimeseries/controlPanel.test.ts
 copy superset-frontend/{src/chartCustomizations/components/DeckglLayerVisibility/transformProps.ts => plugins/plugin-chart-parallel-coordinates/test/transformProps.test.ts} (60%)
 create mode 100644 superset-frontend/plugins/preset-chart-deckgl/src/components/Tooltip.test.tsx
 create mode 100644 superset-frontend/src/components/Datasource/components/DatasourceEditor/tests/hydrateMetricExtra.test.ts
 copy superset-frontend/{plugins/plugin-chart-pivot-table/test/testHelpers.tsx => src/constants.test.ts} (60%)
 create mode 100644 superset-frontend/src/features/charts/ChartCard.test.tsx
 create mode 100644 superset-frontend/src/features/versionHistory/normalization.test.ts
 create mode 100644 superset-frontend/src/features/versionHistory/normalization.ts
 create mode 100644 superset-frontend/src/pages/DatabaseList/DatabaseList.semanticLayerDelete.test.tsx
 create mode 100644 superset-frontend/src/pages/SqlLab/LocationContext.test.tsx
 create mode 100644 superset/mcp_service/dashboard/layout_validation.py
 create mode 100644 superset/mcp_service/dashboard/permalink.py
 create mode 100644 superset/migrations/versions/2026-08-24_12-00_39097d124752_add_reason_to_purge_audit_log.py
 delete mode 100644 superset/utils/pandas_sqlalchemy_compat.py
 create mode 100644 superset/versioning/changes/normalization.py
 create mode 100644 tests/unit_tests/charts/data/malformed_adhoc_metric_test.py
 create mode 100644 tests/unit_tests/commands/chart/delete_message_test.py
 create mode 100644 tests/unit_tests/commands/deletion_retention/test_reason_codes.py
 create mode 100644 tests/unit_tests/commands/importers/v1/import_saved_query_test.py
 create mode 100644 tests/unit_tests/commands/sql_lab/permalink_get_test.py
 create mode 100644 tests/unit_tests/commands/sql_lab/test_execute.py
 create mode 100644 tests/unit_tests/commands/theme/test_import_themes.py
 copy superset-core/src/superset_core/extensions/constants.py => tests/unit_tests/dashboards/commands/importers/dispatcher_test.py (52%)
 copy superset/mcp_service/common/__init__.py => tests/unit_tests/datasets/commands/importers/dispatcher_test.py (54%)
 create mode 100644 tests/unit_tests/db_engine_specs/test_extended_aggregations_unverified.py
 copy superset/db_engine_specs/mariadb.py => tests/unit_tests/db_engine_specs/test_mariadb.py (52%)
 create mode 100644 tests/unit_tests/db_engine_specs/test_timescaledb.py
 copy tests/unit_tests/{scheduled_docker_image_refresh_test.py => frontend_bundle_size_workflow_test.py} (50%)
 create mode 100644 tests/unit_tests/mcp_service/chart/validation/test_dataset_validator.py
 create mode 100644 tests/unit_tests/mcp_service/dashboard/test_layout_validation.py
 create mode 100644 tests/unit_tests/mcp_service/dashboard/test_permalink.py
 create mode 100644 tests/unit_tests/mcp_service/test_main_entrypoint.py
 create mode 100644 tests/unit_tests/mcp_service/test_mcp_config_hs256_guard.py
 create mode 100644 tests/unit_tests/mcp_service/test_result_value_contract.py
 create mode 100644 tests/unit_tests/models/test_hours_offset_bound_truncation.py
 create mode 100644 tests/unit_tests/reports/logs_api_test.py
 create mode 100644 tests/unit_tests/tags/api_test.py
 create mode 100644 tests/unit_tests/tags/commands/delete_test.py
 delete mode 100644 tests/unit_tests/utils/pandas_sqlalchemy_compat_test.py
 create mode 100644 tests/unit_tests/utils/send_export_zip_tests.py
 create mode 100644 tests/unit_tests/versioning/test_normalization_changes.py