Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
225ab07
refactor(db): composite PK on M2M association tables (sc-105349)
May 4, 2026
3987a98
fix(migration): always run NULL-FK cleanup; correct RLS test parent name
May 4, 2026
94e161e
docs(migration): address SQLAlchemy review follow-ups
May 4, 2026
6976616
refactor(migration): build pre-flight SQL via SQLAlchemy core (review)
May 4, 2026
5e144de
fix(migration): drop FKs before recreate on MySQL (sc-105349)
May 4, 2026
0cf4f1a
fix(migration): MySQL downgrade FK + AUTO_INCREMENT (sc-105349)
May 5, 2026
9dd5210
fix(migration): explicit NOT NULL on FK columns for SQLite (sc-105349)
May 5, 2026
62262f5
fix(migration): rebase down_revision onto 33d7e0e21daa (sc-105349)
May 5, 2026
8d09721
docs(UPDATING): add Postgres-targeted maintenance-window queries (sc-…
May 7, 2026
4457fdf
docs(UPDATING): add MySQL-targeted maintenance-window queries (sc-105…
May 7, 2026
0e36e58
build(docker): add MySQL compose override for dialect-swap evaluation
May 7, 2026
e131968
fix(docker): MySQL examples DB + EXAMPLES_PORT override (sc-105349)
May 7, 2026
0c8c18a
build(scripts): add stress-test data generator for migration timing
May 7, 2026
372eb04
feat(scripts): add --dirty-duplicates-pct to seed_junction_load.py
May 7, 2026
056086c
fix(migration): skip alter_column nullable=False on non-SQLite (sc-10…
May 20, 2026
650c3cc
fix(migration): address aminghadersohi review feedback (sc-105349)
May 20, 2026
00bc464
fix(migration): allowlist guard on _downgrade_mysql_table
Jun 2, 2026
6ddbd55
fix(versioning): re-point composite-PK migration at master's head
Jun 11, 2026
0c8b01f
fix(versioning): capture FK list before dropping in composite-PK upgrade
Jun 11, 2026
f467385
chore(versioning): add sqlalchemy-continuum dependency
Jun 2, 2026
99b56e3
feat(versioning): Alembic migration for versioning tables
Jun 2, 2026
ded69c6
feat(versioning): UUIDMixin invariants + register entities as versioned
Jun 2, 2026
d9c3f66
feat(versioning): diff engine and pure helpers
Jun 2, 2026
faa3e9f
feat(versioning): Continuum class factory and baseline-capture listener
Jun 2, 2026
a6e9d45
feat(versioning): change-record capture listener and action_kind plum…
Jun 2, 2026
d7dab00
feat(versioning): app initialization, extensions, config, constants
Jun 2, 2026
c0f2b97
feat(versioning): VersionDAO, ETag helper, and restore primitives
Jun 2, 2026
1b9f6d9
feat(versioning): restore-version commands for chart, dashboard, dataset
Jun 2, 2026
ec91c02
feat(versioning): REST /versions/ endpoints and action_kind stamping
Jun 2, 2026
d6eacec
feat(versioning): time-based retention via Celery beat
Jun 2, 2026
4baab00
test(versioning): end-to-end integration tests
Jun 2, 2026
a87d150
docs(versioning): UPDATING.md entry for entity version history
Jun 2, 2026
7c88880
temp(versioning): demo version-history dropdowns + French i18n
Jun 2, 2026
5f55db7
fix(versioning): address review (B1/H1/M1/M2/N1)
Jun 2, 2026
11539e5
fix(versioning): SERIALIZABLE isolation for retention prune (TOCTOU)
Jun 3, 2026
3308ecd
fix(versioning): stamp last_saved_* on chart restore audit fields
Jun 3, 2026
b1e8621
feat(versioning): partial index on shadow live-row lookup
Jun 3, 2026
eabdf38
refactor(versioning): extract /versions/ endpoint handlers
Jun 3, 2026
c7265ce
refactor(versioning): modernize typing imports (PEP 604 / PEP 585)
Jun 3, 2026
d29c1a9
refactor(versioning): extract CONTINUUM_BOOKKEEPING_COLUMNS + baselin…
Jun 3, 2026
957fd69
docs(versioning): document _coerce_uuid escape hatch (amin M1)
Jun 3, 2026
2841f66
refactor(versioning): split changes.py into a package
Jun 3, 2026
aedd839
chore(versioning): v2 review easy fixes
Jun 3, 2026
ae89e3e
perf(versioning): thread entity_id through set_version_etag_by_uuid
Jun 3, 2026
ab6ddf5
refactor(versioning): split baseline.py into a package
Jun 3, 2026
08248da
refactor(versioning): RestoreEndpointSpec Parameter Object
Jun 3, 2026
491813d
fix(versioning): match shadow text column types to live (MySQL)
Jun 3, 2026
68a6c9c
fix(versioning): idempotent register_baseline_listener
Jun 3, 2026
bbed670
chore(versioning): v3 review cleanup (W2, W3, W4)
Jun 3, 2026
9a7ea7e
chore(versioning): drop sc-103157 forward-reference comment
Jun 3, 2026
c4b8e36
refactor(versioning): drop underscore-prefixed VersionDAO members (DD…
Jun 3, 2026
14844f0
refactor(versioning): name action_kind values as Published Language (…
Jun 3, 2026
814ad1d
docs(versioning): rewrite ACTION_KINDS comment in plain prose
Jun 3, 2026
6c67f50
fix(versioning): chunk retention DELETE IN-clauses for SQLite limit
Jun 3, 2026
fd848c1
fix(versioning): tighten force_parent_dirty + audit-pin diagnostics
Jun 3, 2026
f9e346b
docs(versioning): document polymorphic FK on version_changes.entity_id
Jun 3, 2026
022d702
fix(versioning): bounded inline retry on SERIALIZABLE conflict (sqlal…
Jun 3, 2026
6d366f1
refactor(versioning): drop underscore prefix on cross-module changes/…
Jun 3, 2026
8bbb774
refactor(versioning): drop underscore prefix on cross-module baseline…
Jun 3, 2026
53a7990
refactor(versioning): extract force_parent_dirty into named helpers
Jun 4, 2026
21795eb
refactor(versioning): tighten model_cls type to type[Model]
Jun 4, 2026
3e8acb5
docs(versioning): UPDATING.md notes on shadow-table joins + reset_own…
Jun 4, 2026
400092e
chore(versioning): v4 cleanup β€” type[Model], naming honesty, ShadowTa…
Jun 4, 2026
075e821
feat(versioning): ENABLE_VERSIONING_CAPTURE operational kill-switch
Jun 4, 2026
7325c9b
feat(versioning): retention task emits statsd counters
Jun 4, 2026
8e30782
feat(versioning): warn at startup when retention beat entry is missing
Jun 4, 2026
65a842b
test(versioning): round-trip migrations against populated shadow data
Jun 4, 2026
b561b10
chore(versioning): v5 review cleanup (warn-log ordering, env-var, dea…
Jun 4, 2026
878cc48
test(versioning): unit tests for kill-switch + warn-log + retention m…
Jun 4, 2026
b9c3d7c
fix(activity-view): warn instead of silently skipping unwired version…
Jun 5, 2026
dfa513d
fix(versioning): dedup VERSIONED_MODELS across repeated app inits
Jun 11, 2026
7bf68b3
fix(versioning): MySQL-safe shadow-index downgrade
Jun 11, 2026
9af8557
fix(versioning): missing-table fallbacks work on PostgreSQL
Jun 11, 2026
73b2b7d
fix(versioning): stamp restore audit fields with naive local time
Jun 11, 2026
be97978
fix(versioning): never honour payload PKs in _override_columns
Jun 11, 2026
b99ed74
fix(versioning): attribute dataset PUT response to the user's transac…
Jun 11, 2026
e859f84
perf(activity-view): index child shadow tables by (table_id, transact…
Jun 5, 2026
1f4eed4
fix(versioning): kill-switch actually stops Continuum shadow writes
Jun 11, 2026
290454a
fix(versioning): wire response schemas into the /versions/ endpoints
Jun 11, 2026
9510e17
docs(versioning): strip forward references to the activity-view module
Jun 11, 2026
6397efd
chore(versioning): trim dead DDL from the versioning-tables migration
Jun 11, 2026
e2a4651
test(versioning): make params-filter change-record test idempotent
Jun 11, 2026
61c69cf
fix(versioning): exclude machine-written fields from the activity stream
Jun 12, 2026
003387d
fix(versioning): dataset save with refresh is one transaction
Jun 12, 2026
7741a78
feat(versioning): restore transactions record their target version
Jun 12, 2026
99c7143
fix(versioning): restore never applies the snapshot's uuid to the liv…
Jun 12, 2026
22ab37c
test(versioning): parse issued_at as ISO-8601 in version-list orderin…
Jun 12, 2026
ad0377a
revert(versioning): dataset save back to per-command transactions
Jun 12, 2026
6062944
fix(versioning): review hardening for the __meta__ headline convention
Jun 12, 2026
a30de18
refactor(versioning): extract retention cleanup job to sc-111099
Jun 15, 2026
7d621cd
fix(versioning): re-point migration chain onto current master head
Jun 15, 2026
ba51f26
fix(versioning): satisfy mypy/ruff after master rebase (pre-commit)
Jun 16, 2026
a655e0c
fix(versioning): robust user_id capture + correct denies-non-owner tests
Jun 16, 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
313 changes: 313 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.17.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