Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
6addd57
refactor(db): composite PK on M2M association tables (sc-105349)
May 4, 2026
ddf426a
fix(migration): always run NULL-FK cleanup; correct RLS test parent name
May 4, 2026
6788526
docs(migration): address SQLAlchemy review follow-ups
May 4, 2026
753b331
refactor(migration): build pre-flight SQL via SQLAlchemy core (review)
May 4, 2026
128dc7b
fix(migration): drop FKs before recreate on MySQL (sc-105349)
May 4, 2026
939e652
fix(migration): MySQL downgrade FK + AUTO_INCREMENT (sc-105349)
May 5, 2026
af834bc
fix(migration): explicit NOT NULL on FK columns for SQLite (sc-105349)
May 5, 2026
45b3b00
fix(migration): rebase down_revision onto 33d7e0e21daa (sc-105349)
May 5, 2026
8fbc491
docs(UPDATING): add Postgres-targeted maintenance-window queries (sc-…
May 7, 2026
c2dc2d5
docs(UPDATING): add MySQL-targeted maintenance-window queries (sc-105…
May 7, 2026
a866b7c
build(docker): add MySQL compose override for dialect-swap evaluation
May 7, 2026
0bbaa8c
fix(docker): MySQL examples DB + EXAMPLES_PORT override (sc-105349)
May 7, 2026
5cefcc6
build(scripts): add stress-test data generator for migration timing
May 7, 2026
0111e2b
feat(scripts): add --dirty-duplicates-pct to seed_junction_load.py
May 7, 2026
b400c02
fix(migration): skip alter_column nullable=False on non-SQLite (sc-10…
May 20, 2026
0a42c39
fix(migration): address aminghadersohi review feedback (sc-105349)
May 20, 2026
da5cccc
fix(migration): allowlist guard on _downgrade_mysql_table
Jun 2, 2026
f559bdf
chore(versioning): add sqlalchemy-continuum dependency
Jun 2, 2026
57f46c6
feat(versioning): Alembic migration for versioning tables
Jun 2, 2026
76aa518
feat(versioning): UUIDMixin invariants + register entities as versioned
Jun 2, 2026
38cf576
feat(versioning): diff engine and pure helpers
Jun 2, 2026
87fdf26
feat(versioning): Continuum class factory and baseline-capture listener
Jun 2, 2026
deb3252
feat(versioning): change-record capture listener and action_kind plum…
Jun 2, 2026
2918b29
feat(versioning): app initialization, extensions, config, constants
Jun 2, 2026
a0d0ff0
feat(versioning): VersionDAO, ETag helper, and restore primitives
Jun 2, 2026
5d5a289
feat(versioning): restore-version commands for chart, dashboard, dataset
Jun 2, 2026
7c2b19a
feat(versioning): REST /versions/ endpoints and action_kind stamping
Jun 2, 2026
2e68ba0
feat(versioning): time-based retention via Celery beat
Jun 2, 2026
e442fc4
test(versioning): end-to-end integration tests
Jun 2, 2026
93266ae
docs(versioning): UPDATING.md entry for entity version history
Jun 2, 2026
72f3a9b
temp(versioning): demo version-history dropdowns + French i18n
Jun 2, 2026
2a9e04e
fix(versioning): address review (B1/H1/M1/M2/N1)
Jun 2, 2026
034896f
fix(versioning): SERIALIZABLE isolation for retention prune (TOCTOU)
Jun 3, 2026
47252fd
fix(versioning): stamp last_saved_* on chart restore audit fields
Jun 3, 2026
d7f82fc
feat(versioning): partial index on shadow live-row lookup
Jun 3, 2026
85fc93d
refactor(versioning): extract /versions/ endpoint handlers
Jun 3, 2026
7c87e21
refactor(versioning): modernize typing imports (PEP 604 / PEP 585)
Jun 3, 2026
8d02e01
refactor(versioning): extract CONTINUUM_BOOKKEEPING_COLUMNS + baselin…
Jun 3, 2026
3916b73
docs(versioning): document _coerce_uuid escape hatch (amin M1)
Jun 3, 2026
dd1ed79
refactor(versioning): split changes.py into a package
Jun 3, 2026
2dcb017
chore(versioning): v2 review easy fixes
Jun 3, 2026
f0916a9
perf(versioning): thread entity_id through set_version_etag_by_uuid
Jun 3, 2026
8c28289
refactor(versioning): split baseline.py into a package
Jun 3, 2026
a9f5e1d
refactor(versioning): RestoreEndpointSpec Parameter Object
Jun 3, 2026
a7a98be
fix(versioning): match shadow text column types to live (MySQL)
Jun 3, 2026
5e6b0c2
fix(versioning): idempotent register_baseline_listener
Jun 3, 2026
36abef4
chore(versioning): v3 review cleanup (W2, W3, W4)
Jun 3, 2026
23859d5
chore(versioning): drop sc-103157 forward-reference comment
Jun 3, 2026
5137490
refactor(versioning): drop underscore-prefixed VersionDAO members (DD…
Jun 3, 2026
b96c8c7
refactor(versioning): name action_kind values as Published Language (…
Jun 3, 2026
616fe24
docs(versioning): rewrite ACTION_KINDS comment in plain prose
Jun 3, 2026
7095f7d
fix(versioning): chunk retention DELETE IN-clauses for SQLite limit
Jun 3, 2026
f346c5c
fix(versioning): tighten force_parent_dirty + audit-pin diagnostics
Jun 3, 2026
6ca8413
docs(versioning): document polymorphic FK on version_changes.entity_id
Jun 3, 2026
fac8735
fix(versioning): bounded inline retry on SERIALIZABLE conflict (sqlal…
Jun 3, 2026
888c5db
refactor(versioning): drop underscore prefix on cross-module changes/…
Jun 3, 2026
34877a7
refactor(versioning): drop underscore prefix on cross-module baseline…
Jun 3, 2026
8605927
refactor(versioning): extract force_parent_dirty into named helpers
Jun 4, 2026
07967d8
refactor(versioning): tighten model_cls type to type[Model]
Jun 4, 2026
23b3d95
docs(versioning): UPDATING.md notes on shadow-table joins + reset_own…
Jun 4, 2026
c4416c0
chore(versioning): v4 cleanup — type[Model], naming honesty, ShadowTa…
Jun 4, 2026
ff3146a
feat(versioning): ENABLE_VERSIONING_CAPTURE operational kill-switch
Jun 4, 2026
201854c
feat(versioning): retention task emits statsd counters
Jun 4, 2026
21751e4
feat(versioning): warn at startup when retention beat entry is missing
Jun 4, 2026
cba40bc
test(versioning): round-trip migrations against populated shadow data
Jun 4, 2026
071f230
chore(versioning): v5 review cleanup (warn-log ordering, env-var, dea…
Jun 4, 2026
2bc032a
test(versioning): unit tests for kill-switch + warn-log + retention m…
Jun 4, 2026
3d81228
feat(activity-view): core module, schemas, three-dimension consumption
Jun 2, 2026
3f1677a
feat(activity-view): /activity/ endpoints for chart, dashboard, dataset
Jun 2, 2026
dbe0782
feat(activity-view): consume activity fields in version-history dropd…
Jun 2, 2026
4197b50
docs(activity-view): UPDATING.md entry for cross-entity activity view
Jun 2, 2026
193f3b5
debug(activity-view): throwaway React shell and Flask route
Jun 2, 2026
528fbd8
fix(activity-view): use raise_for_access on /activity/ + read perm
Jun 3, 2026
d2d4c32
refactor(activity-view): consolidate resolve_endpoint_path_entity
Jun 3, 2026
b2de735
perf(activity-view): batch visibility via SQL-side access filters
Jun 3, 2026
50a976c
refactor(activity-view): split activity.py into a package
Jun 3, 2026
616fdc5
docs(activity-view): align UPDATING.md auth paragraph with code
Jun 3, 2026
5bcf2d6
refactor(activity-view): v2 review easy fixes (PEP 604 + doc-notes)
Jun 3, 2026
1908789
refactor(versioning): thread entity_uuid out of resolve_endpoint_path…
Jun 3, 2026
b387326
refactor(activity-view): extract activity_endpoint helper
Jun 3, 2026
05d198a
refactor(activity-view): split scope.py windows out into windows.py
Jun 3, 2026
dcaec69
refactor(activity-view): trim activity/__init__.py to public surface
Jun 3, 2026
312909f
refactor(activity-view): promote Window to frozen-dataclass Value Obj…
Jun 3, 2026
005b915
chore(activity-view): v3 review cleanup (M2, A2, S1 consumer)
Jun 3, 2026
eec6150
docs(activity-view): rewrite Window + visibility docstrings in plain …
Jun 3, 2026
6d3068d
fix(activity-view): chunk IN-clauses, autoflush-guard reads, fail-clo…
Jun 3, 2026
48ba48f
refactor(activity-view): drop underscore prefix on cross-module activ…
Jun 3, 2026
a6789ed
refactor(activity-view): make in-place mutation explicit (CQS)
Jun 4, 2026
2fa0757
refactor(activity-view): tighten model_cls type to type[Model]
Jun 4, 2026
c29d1ed
fix(activity-view): check_entity_tombstones populates every kind (v4 …
Jun 4, 2026
63caa53
chore(activity-view): v4 cleanup — apply_record_decoration return + l…
Jun 4, 2026
0fb51a4
perf(activity-view): index child shadow tables by (table_id, transact…
Jun 5, 2026
58e8c7e
fix(activity-view): warn instead of silently skipping unwired version…
Jun 5, 2026
f63b43e
fix(activity-view): exclude path entity from related_entity_count metric
Jun 5, 2026
6abe09a
fix(activity-view): normalize tz-aware since/until to naive UTC
Jun 11, 2026
566f1c5
docs(activity-view): correct operation_type and layout-verb docstrings
Jun 11, 2026
7135588
feat(activity-view): emit capture-path error metrics + multi-flush ac…
Jun 11, 2026
bd1864b
feat(version-history): feature flag, types, api client, and activity …
kgabryje Jun 11, 2026
1a1e524
feat(version-history): redux slice, panel shell, timeline rows, and e…
kgabryje Jun 11, 2026
3e23fa6
feat(version-history): version preview for charts and dashboards with…
kgabryje Jun 11, 2026
c7ac7a1
feat(version-history): restore confirm modal, restore flow, and open-…
kgabryje Jun 11, 2026
97d63fc
feat(version-history): session log of unsaved explore edits and dashb…
kgabryje Jun 11, 2026
3812d6d
test(version-history): reducer, display, panel, and preview-banner co…
kgabryje Jun 11, 2026
931c4df
test(version-history): prettier formatting in panel test
kgabryje Jun 11, 2026
9631914
fix(version-history): review fixups for preview gating, forking, and …
kgabryje Jun 12, 2026
4827e0e
build: sync superset-ui-core lockfile entry for @braintree/sanitize-url
kgabryje Jun 12, 2026
eb612ff
fix(version-history): round-2 review fixups
kgabryje Jun 12, 2026
1009d77
fix(version-history): round-3 fixups — design fidelity, noise suppres…
kgabryje Jun 12, 2026
38a173a
fix(version-history): round-4 cosmetic fixups — search suffix, neutra…
kgabryje Jun 12, 2026
db0802b
fix(version-history): round-5 fixups — first-line icon alignment, pre…
kgabryje Jun 12, 2026
5131ba7
fix(version-history): round-5b — related rollup, current-version trea…
kgabryje Jun 12, 2026
69c46d7
fix(version-history): suppress machine-managed perm rewrites as noise
kgabryje Jun 12, 2026
b71d891
fix(version-history): isolate preview dataMask from live filter selec…
kgabryje Jun 12, 2026
711fe49
fix(version-history): refresh the timeline live when the entity is sa…
kgabryje Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
377 changes: 377 additions & 0 deletions UPDATING.md

Large diffs are not rendered by default.

117 changes: 117 additions & 0 deletions docker-compose-mysql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Compose override that swaps the default Postgres metadata DB for MySQL 8.
# Useful for evaluating dialect-specific behaviour (e.g., DDL-migration
# cost on a deployment whose production metadata DB is MySQL).
#
# Usage:
# docker compose -f docker-compose.yml -f docker-compose-mysql.yml up
# docker compose -f docker-compose.yml -f docker-compose-mysql.yml down
#
# To switch back to Postgres, just drop the second `-f` flag — the MySQL
# data lives in a separate volume (`db_home_mysql`) so neither side is
# corrupted by switching dialects.
#
# Notes:
# - Mirrors the connection settings used by CI's `test-mysql` shard:
# dialect ``mysql+mysqldb``, charset utf8mb4 with binary_prefix.
# - Host port 13306 (configurable via DATABASE_PORT_MYSQL) to avoid
# colliding with a native MySQL install on 3306.
# - The Postgres-specific init scripts under
# docker/docker-entrypoint-initdb.d/ are not mounted (they are
# postgres-only); examples / cypress fixtures still load via
# `superset-init`'s post-startup steps.

# Shared environment override applied to every Superset-side service that
# connects to the metadata DB. ``environment:`` takes precedence over the
# values inherited from the env_file in docker-compose.yml.
x-mysql-env: &mysql-env
DATABASE_DIALECT: mysql+mysqldb
DATABASE_HOST: db
DATABASE_PORT: "3306"
DATABASE_DB: superset
DATABASE_USER: superset
DATABASE_PASSWORD: superset
SQLALCHEMY_DATABASE_URI: "mysql+mysqldb://superset:superset@db:3306/superset?charset=utf8mb4&binary_prefix=true"
# Override the analytics-examples DB connection too. ``EXAMPLES_PORT``
# in docker/.env is hardcoded to 5432 (the Postgres port); without
# this override the examples connection would try MySQL on 5432 and
# fail. The examples user/DB are created by docker/mysql-init/
# examples-init.sql on first MySQL boot.
EXAMPLES_HOST: db
EXAMPLES_PORT: "3306"
EXAMPLES_DB: examples
EXAMPLES_USER: examples
EXAMPLES_PASSWORD: examples
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "mysql+mysqldb://examples:examples@db:3306/examples?charset=utf8mb4&binary_prefix=true"

services:
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: superset
MYSQL_USER: superset
MYSQL_PASSWORD: superset
MYSQL_ROOT_PASSWORD: root
# The original 5432 port mapping is harmless on a MySQL container
# (nothing listens on 5432 inside it) but we add 13306->3306 so the
# MySQL port is reachable from the host without colliding with a
# native MySQL on 3306. Compose merges port lists.
ports:
- "127.0.0.1:${DATABASE_PORT_MYSQL:-13306}:3306"
# Override the init-scripts mount by re-binding the same target path
# to a MySQL-compatible directory. Compose merges volume lists by
# target path; later definitions win on conflict, so this displaces
# the Postgres-specific ``./docker/docker-entrypoint-initdb.d`` mount
# from docker-compose.yml. Without this, MySQL would try to run
# ``cypress-init.sh`` (which invokes ``psql``, not in the MySQL
# image), abort the init phase, and never create the ``examples``
# database. Add the MySQL data volume separately.
volumes:
- db_home_mysql:/var/lib/mysql
- ./docker/mysql-init:/docker-entrypoint-initdb.d
command:
- --default-authentication-plugin=caching_sha2_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_0900_ai_ci
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -proot --silent"]
interval: 5s
timeout: 5s
retries: 20

superset:
environment: *mysql-env

superset-init:
environment: *mysql-env

superset-worker:
environment: *mysql-env

superset-worker-beat:
environment: *mysql-env

superset-node:
environment: *mysql-env

superset-tests-worker:
environment: *mysql-env

volumes:
db_home_mysql:
32 changes: 32 additions & 0 deletions docker/mysql-init/examples-init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements. See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership. The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied. See the License for the
-- specific language governing permissions and limitations
-- under the License.

-- MySQL counterpart to docker/docker-entrypoint-initdb.d/examples-init.sh.
-- Creates the analytics-examples database and user that Superset's
-- ``load-examples`` command writes to. Mounted by docker-compose-mysql.yml
-- at /docker-entrypoint-initdb.d/ so the MySQL image's first-boot
-- entrypoint runs it automatically. (The Postgres init scripts under
-- docker/docker-entrypoint-initdb.d/ are NOT mounted on the MySQL
-- service — they invoke psql, which doesn't exist in the MySQL image.)

CREATE DATABASE IF NOT EXISTS examples
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;

CREATE USER IF NOT EXISTS 'examples'@'%' IDENTIFIED BY 'examples';
GRANT ALL PRIVILEGES ON examples.* TO 'examples'@'%';
FLUSH PRIVILEGES;
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ dependencies = [
"simplejson>=3.15.0",
"slack_sdk>=3.19.0, <4",
"sqlalchemy>=1.4, <2",
"sqlalchemy-continuum>=1.6.0, <2.0.0",
"sqlalchemy-utils>=0.38.0, <0.43", # expanding lowerbound to work with pydoris
"sqlglot>=30.8.0, <31",
# newer pandas needs 0.9+
Expand Down
3 changes: 3 additions & 0 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,10 @@ sqlalchemy==1.4.54
# flask-sqlalchemy
# marshmallow-sqlalchemy
# shillelagh
# sqlalchemy-continuum
# sqlalchemy-utils
sqlalchemy-continuum==1.6.0
# via apache-superset (pyproject.toml)
sqlalchemy-utils==0.42.0
# via
# apache-superset (pyproject.toml)
Expand Down
5 changes: 5 additions & 0 deletions requirements/development.txt
Original file line number Diff line number Diff line change
Expand Up @@ -979,9 +979,14 @@ sqlalchemy==1.4.54
# marshmallow-sqlalchemy
# shillelagh
# sqlalchemy-bigquery
# sqlalchemy-continuum
# sqlalchemy-utils
sqlalchemy-bigquery==1.15.0
# via apache-superset
sqlalchemy-continuum==1.6.0
# via
# -c requirements/base-constraint.txt
# apache-superset
sqlalchemy-utils==0.42.0
# via
# -c requirements/base-constraint.txt
Expand Down
Loading
Loading