Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
a7a65fa
refactor(db): composite PK on M2M association tables (sc-105349)
May 4, 2026
b3fb7ee
fix(migration): always run NULL-FK cleanup; correct RLS test parent name
May 4, 2026
2b6c23b
docs(migration): address SQLAlchemy review follow-ups
May 4, 2026
2099e28
refactor(migration): build pre-flight SQL via SQLAlchemy core (review)
May 4, 2026
f309d5f
fix(migration): drop FKs before recreate on MySQL (sc-105349)
May 4, 2026
8e6acbc
fix(migration): MySQL downgrade FK + AUTO_INCREMENT (sc-105349)
May 5, 2026
14721ed
fix(migration): explicit NOT NULL on FK columns for SQLite (sc-105349)
May 5, 2026
1caaab2
fix(migration): rebase down_revision onto 33d7e0e21daa (sc-105349)
May 5, 2026
e6b5e2d
docs(UPDATING): add Postgres-targeted maintenance-window queries (sc-…
May 7, 2026
3590a8e
docs(UPDATING): add MySQL-targeted maintenance-window queries (sc-105…
May 7, 2026
74f5ae9
build(docker): add MySQL compose override for dialect-swap evaluation
May 7, 2026
512e023
fix(docker): MySQL examples DB + EXAMPLES_PORT override (sc-105349)
May 7, 2026
d6288c1
build(scripts): add stress-test data generator for migration timing
May 7, 2026
f7ffc70
feat(scripts): add --dirty-duplicates-pct to seed_junction_load.py
May 7, 2026
a99df20
fix(migration): skip alter_column nullable=False on non-SQLite (sc-10…
May 20, 2026
01f40d5
fix(migration): address aminghadersohi review feedback (sc-105349)
May 20, 2026
b869679
fix(migration): allowlist guard on _downgrade_mysql_table
Jun 2, 2026
c8fa052
fix(versioning): re-point composite-PK migration at master's head
Jun 11, 2026
b394df8
fix(versioning): capture FK list before dropping in composite-PK upgrade
Jun 11, 2026
27a96ad
chore(versioning): add sqlalchemy-continuum dependency
Jun 2, 2026
9beaee8
feat(versioning): Alembic migration for versioning tables
Jun 2, 2026
fab31d5
feat(versioning): UUIDMixin invariants + register entities as versioned
Jun 2, 2026
b40ed2a
feat(versioning): diff engine and pure helpers
Jun 2, 2026
fd8505d
feat(versioning): Continuum class factory and baseline-capture listener
Jun 2, 2026
ef4f29e
feat(versioning): change-record capture listener and action_kind plum…
Jun 2, 2026
539cc18
feat(versioning): app initialization, extensions, config, constants
Jun 2, 2026
641614f
feat(versioning): VersionDAO, ETag helper, and restore primitives
Jun 2, 2026
1e1f63f
feat(versioning): restore-version commands for chart, dashboard, dataset
Jun 2, 2026
8654ec7
feat(versioning): REST /versions/ endpoints and action_kind stamping
Jun 2, 2026
951e027
feat(versioning): time-based retention via Celery beat
Jun 2, 2026
0175d99
test(versioning): end-to-end integration tests
Jun 2, 2026
f27bbdc
docs(versioning): UPDATING.md entry for entity version history
Jun 2, 2026
510770e
temp(versioning): demo version-history dropdowns + French i18n
Jun 2, 2026
6135cfa
fix(versioning): address review (B1/H1/M1/M2/N1)
Jun 2, 2026
68e7981
fix(versioning): SERIALIZABLE isolation for retention prune (TOCTOU)
Jun 3, 2026
d1a555a
fix(versioning): stamp last_saved_* on chart restore audit fields
Jun 3, 2026
3937f4c
feat(versioning): partial index on shadow live-row lookup
Jun 3, 2026
aab5436
refactor(versioning): extract /versions/ endpoint handlers
Jun 3, 2026
6bc74d8
refactor(versioning): modernize typing imports (PEP 604 / PEP 585)
Jun 3, 2026
1bfd68e
refactor(versioning): extract CONTINUUM_BOOKKEEPING_COLUMNS + baselin…
Jun 3, 2026
f452767
docs(versioning): document _coerce_uuid escape hatch (amin M1)
Jun 3, 2026
d600461
refactor(versioning): split changes.py into a package
Jun 3, 2026
9a2a55e
chore(versioning): v2 review easy fixes
Jun 3, 2026
2ddb1d6
perf(versioning): thread entity_id through set_version_etag_by_uuid
Jun 3, 2026
6f5b7e1
refactor(versioning): split baseline.py into a package
Jun 3, 2026
6007ead
refactor(versioning): RestoreEndpointSpec Parameter Object
Jun 3, 2026
fe7dcde
fix(versioning): match shadow text column types to live (MySQL)
Jun 3, 2026
f430024
fix(versioning): idempotent register_baseline_listener
Jun 3, 2026
354b0e7
chore(versioning): v3 review cleanup (W2, W3, W4)
Jun 3, 2026
7ebc410
chore(versioning): drop sc-103157 forward-reference comment
Jun 3, 2026
139fd92
refactor(versioning): drop underscore-prefixed VersionDAO members (DD…
Jun 3, 2026
a6746d7
refactor(versioning): name action_kind values as Published Language (…
Jun 3, 2026
286c950
docs(versioning): rewrite ACTION_KINDS comment in plain prose
Jun 3, 2026
692b347
fix(versioning): chunk retention DELETE IN-clauses for SQLite limit
Jun 3, 2026
b9ba12c
fix(versioning): tighten force_parent_dirty + audit-pin diagnostics
Jun 3, 2026
1009763
docs(versioning): document polymorphic FK on version_changes.entity_id
Jun 3, 2026
6efd1cf
fix(versioning): bounded inline retry on SERIALIZABLE conflict (sqlal…
Jun 3, 2026
d79fc20
refactor(versioning): drop underscore prefix on cross-module changes/…
Jun 3, 2026
117a8eb
refactor(versioning): drop underscore prefix on cross-module baseline…
Jun 3, 2026
d848ef7
refactor(versioning): extract force_parent_dirty into named helpers
Jun 4, 2026
fa8b641
refactor(versioning): tighten model_cls type to type[Model]
Jun 4, 2026
a4a1ff5
docs(versioning): UPDATING.md notes on shadow-table joins + reset_own…
Jun 4, 2026
386f514
chore(versioning): v4 cleanup β€” type[Model], naming honesty, ShadowTa…
Jun 4, 2026
db9d4b9
feat(versioning): ENABLE_VERSIONING_CAPTURE operational kill-switch
Jun 4, 2026
8cba379
feat(versioning): retention task emits statsd counters
Jun 4, 2026
50cab35
feat(versioning): warn at startup when retention beat entry is missing
Jun 4, 2026
acf22d9
test(versioning): round-trip migrations against populated shadow data
Jun 4, 2026
f316169
chore(versioning): v5 review cleanup (warn-log ordering, env-var, dea…
Jun 4, 2026
9f3d844
test(versioning): unit tests for kill-switch + warn-log + retention m…
Jun 4, 2026
f33308a
fix(activity-view): warn instead of silently skipping unwired version…
Jun 5, 2026
e58999a
fix(versioning): dedup VERSIONED_MODELS across repeated app inits
Jun 11, 2026
178d11f
fix(versioning): MySQL-safe shadow-index downgrade
Jun 11, 2026
df42c6b
fix(versioning): missing-table fallbacks work on PostgreSQL
Jun 11, 2026
3e62e52
fix(versioning): stamp restore audit fields with naive local time
Jun 11, 2026
f393fff
fix(versioning): never honour payload PKs in _override_columns
Jun 11, 2026
85264d6
fix(versioning): attribute dataset PUT response to the user's transac…
Jun 11, 2026
4fae984
perf(activity-view): index child shadow tables by (table_id, transact…
Jun 5, 2026
5e283f1
fix(versioning): kill-switch actually stops Continuum shadow writes
Jun 11, 2026
7e9f8ad
fix(versioning): wire response schemas into the /versions/ endpoints
Jun 11, 2026
2a92d85
docs(versioning): strip forward references to the activity-view module
Jun 11, 2026
df8097a
chore(versioning): trim dead DDL from the versioning-tables migration
Jun 11, 2026
0b6dd4a
test(versioning): make params-filter change-record test idempotent
Jun 11, 2026
250403e
fix(versioning): exclude machine-written fields from the activity stream
Jun 12, 2026
47902be
fix(versioning): dataset save with refresh is one transaction
Jun 12, 2026
9b75d39
feat(versioning): restore transactions record their target version
Jun 12, 2026
f6b8a2f
fix(versioning): restore never applies the snapshot's uuid to the liv…
Jun 12, 2026
deb11e4
test(versioning): parse issued_at as ISO-8601 in version-list orderin…
Jun 12, 2026
1acbd90
revert(versioning): dataset save back to per-command transactions
Jun 12, 2026
f154db7
fix(versioning): review hardening for the __meta__ headline convention
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
312 changes: 312 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 @@ -407,7 +407,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 @@ -975,9 +975,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