Compare commits

...

560 Commits

Author SHA1 Message Date
Nemanja
8500d40793 Add cross-version e2e test scenarios 2026-03-19 11:51:09 +01:00
github-automation-metabase
1d0a9828c6 🤖 backported "Fix pivot text overlapping when next header column is collapsed" (#71118)
Fix pivot text overlapping when next header column is collapsed (#71104)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-18 20:46:53 +00:00
github-automation-metabase
f21779defa 🤖 backported "Correctly hide/show card filters based on permissions" (#71085)
Correctly hide/show card filters based on permissions (#70980)

Backend (query_processor/dashboard.clj): Added an explicit view-data permission check using most-permissive-database-permission-for-user. This returns 403 when a user has no view-data access, taking precedence over parameter validation errors (400).

Frontend (DashCardVisualization.tsx): Decoupled the three concerns:

* Inline parameters render when inlineParameters.length > 0 AND the user has view access (no 403 on the card result)
* DashCardMenu (download button) renders when DashCardMenu.shouldRender() is true (requires canEditQuestion or canDownloadResults)
* 403 from backend hides both inline params and menu — no point showing UI for data the user can't access

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-18 20:17:42 +00:00
github-automation-metabase
bbe3913842 🤖 backported "Docs: improve embedding appearance theming section" (#71110)
Docs: improve embedding appearance theming section (#70967)

* Docs: improve embedding appearance theming section

Rewrite the basic theming section for clarity: rename to "Dark mode and
light mode", simplify the explanation, and preserve the old
#basic-theming anchor for existing links.



* Update docs/embedding/appearance.md



---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-18 18:44:03 +00:00
github-automation-metabase
d96e513272 🤖 backported "chore: upgrade underscore" (#71040)
chore: upgrade underscore (#70778)

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-03-18 14:29:59 +03:00
Phoomparin Mano
e0659459d4 Manual Backport: Fix SSO docs link in embedding hub (#70918)
update embedding hub authentication path
2026-03-18 18:28:57 +07:00
Nathan Voxland
6139e40aa5 Clear transform permissions (#71016) 2026-03-17 13:02:03 -05:00
github-automation-metabase
1e651cafbd 🤖 backported "fix self-heal openapi job and update openapi.json" (#70579)
* fix self-heal openapi job and update openapi.json (#70499)

# Conflicts:
#	.github/actions/prepare-frontend/action.yml
#	resources/openapi/openapi.json

* Update OpenAPI schema (bc138d5...77b323f)

---------

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-17 15:14:35 +01:00
Nemanja Glumac
71f4f2d1f1 [Backported v58] Add retry loop to fetch-artifact action's download step (#70513) (#71006)
Add retry loop to fetch-artifact action's download step (#70513)

Add retry loop to fetch-artifact download step

Wrap the downloadArtifact API call with a retry loop (3 attempts,
exponential backoff at 15s/30s) to handle transient GitHub API 500
errors that have been causing e2e and health-check job failures.

Co-authored-by: mendral-app[bot] <233154221+mendral-app[bot]@users.noreply.github.com>
2026-03-17 13:58:52 +00:00
github-automation-metabase
bc138d50f6 🤖 backported "Fix 500 error in check-card endpoint for cards with broken dependents" (#70947)
* Fix 500 error in check-card endpoint for cards with broken dependents (#70828)

Fix unhandled exception in POST /api/ee/dependencies/check-card that causes a 500 when a transitive dependent card fails to compile

 When check-query-soundness iterates over all dependents, if any card's query throws during compilation (e.g. alias resolution errors), the exception propagated uncaught and crashed the entire endpoint

Added try/catch around check-entity calls in check-query-soundness, returning a validation-exception-error instead of crashing — consistent with the pattern already used in `/dependencies/findings.clj`

On the stats instance, card 4523 has 2,557 transitive card dependents. One of those dependents (a native query referencing card 34523 via a template tag) fails during query compilation with `Missing ::desired-alias->escaped for "email_domain"`. This compilation error is unrelated to the proposed edit but was bringing down the whole endpoint.

Test plan

  - Verify POST /api/ee/dependencies/check-card returns 200 with {success: false, bad_cards: [...]} instead of 500 when a dependent card has a query compilation error
  - Verify that cards with compilation errors appear in the response as validation-exception-error findings
  - Existing dependency check tests still pass

* Don't throw when checking deps

---------

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-16 13:40:10 -05:00
github-automation-metabase
db03762557 🤖 backported "untgz: use resolveIn to prevent zip slip" (#70933)
untgz: use resolveIn to prevent zip slip (#70921)

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 13:48:55 +00:00
github-automation-metabase
4b2499407f 🤖 backported "Disable blocking dependency checks on save" (#70872)
Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-13 14:09:20 -06:00
github-automation-metabase
48f88cef56 🤖 backported "Use virtualized table for data perms" (#70749) 2026-03-13 11:06:49 -04:00
github-automation-metabase
ce8a91b935 🤖 backported "add missing tags to enterprise settings" (#70859)
add missing tags to enterprise settings (#70846)

fix: add missing tags to enterprise settings

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-13 14:17:23 +00:00
github-automation-metabase
d02755f3e3 🤖 backported "Fixed issue when hiding SDK banner" (#70855)
Fixed issue when hiding SDK banner (#70727)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-13 13:41:06 +00:00
github-automation-metabase
a8829c874b 🤖 backported "Fix cloud driver tests skipped when deps.edn changes [DEV-1672]" (#70837)
Fix cloud driver tests skipped when deps.edn changes [DEV-1672] (#70833)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-12 22:35:02 +00:00
github-automation-metabase
3d463a5af0 🤖 backported "Fix SDK subscription not working under StrictMode" (#70803)
* Fix SDK subscription not working under StrictMode (#70663)

* Fix can't click on the time dropdown on subscription sidebar in StrictMode

* Add tests

* update e2e test

* Fix unit tests

* improve code clarity

* Fix E2E tests

* Simplify code

* Make default value consistent

* Make the new Select button have dynamic size

* Fix unit tests

* Fix E2E tests

* Fix file change outside conflicts

---------

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-12 16:08:56 +00:00
github-automation-metabase
d83702d8fc 🤖 backported "bump c3p0 to 0.12.0" (#70810)
bump c3p0 to 0.12.0 (#70494)

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-03-12 15:46:07 +00:00
github-automation-metabase
e76e9a4b3f 🤖 backported "Upgrade toucan2 to 1.0.571" (#70795)
Upgrade toucan2 to 1.0.571 (#70771)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-12 13:57:01 +00:00
github-automation-metabase
5c92fc1925 🤖 backported "Fix flakes because we used JS instead of CSS" (#70783)
Fix flakes because we used JS instead of CSS (#70718)

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-12 12:48:47 +00:00
github-automation-metabase
04055a8dc9 🤖 backported "Support MB_MONITOR_PERFORMANCE to write as files to a directory" (#70747)
Support MB_MONITOR_PERFORMANCE to write as files to a directory (#69582)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-11 21:37:20 +00:00
github-automation-metabase
df158f6bf4 🤖 backported "Upgrade Jetty to 12.1.7" (#70739)
Upgrade Jetty to 12.1.7 (#70731)

CVE fix

Co-authored-by: da <paoliniluis@gmail.com>
2026-03-11 19:51:03 +00:00
github-automation-metabase
64fe7ab62c 🤖 backported " Add configurable CSV field separator setting " (#70644)
Add configurable CSV field separator setting  (#69827)

* Add configurable CSV field separator setting

- Adds csv-field-separator setting for configuring CSV export delimiter
- Supports comma (default), semicolon, tab, and other delimiters
- Useful for European locales where semicolon is standard
- Configurable via MB_CSV_FIELD_SEPARATOR environment variable
- Includes tests for different separator types and quoting behavior

Fixes #10256

* Split CSV separator tests into smaller deftests and clean up comments

Break the monolithic csv-field-separator-test into four focused tests:
- csv-field-separator-default-test
- csv-field-separator-semicolon-test
- csv-field-separator-tab-test
- csv-separator-quoting-test (already separate, just removed extra nesting)

Remove the "Changed from hardcoded" comment in csv.clj and the unused
metabase.test.util require.

* fixup! eastwood and serialization baseline

* fixup! whitespace

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: kevin raymond <kevray39@gmail.com>
2026-03-11 18:35:08 +00:00
github-automation-metabase
0678ce7b4a 🤖 backported "Fix broken Metabase icon in SDK banner when using EE with license" (#70721)
Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
Fix broken Metabase icon in SDK banner when using EE with license (#69215)
2026-03-11 18:14:55 +01:00
github-automation-metabase
64ad18df75 🤖 backported "Prefer SQL DML for insert-from-source! to fix bigquery metadata consistency" (#70198)
Prefer SQL DML for insert-from-source! to fix bigquery metadata consistency (#69753)

The legacy .insertAll API (and newer Storage API) do not work well with
tables that are created/dropped frequently. This is because their
metadata caches can take a long time to up date.

Python transforms use the drop-recreate fallback strategy for bigquery
so we observe this inconsistency for every run after the first, even
with absurd multi minute timeouts.

The SQL API does not have a problem, so we'll use that. We expect a
performance regression but its better to work slowly than not work at
all.

Other changes:

- Removed now redundant bigquery retry loop

- Dropped dictionary support, we cannot support it easily and it cannot be
considered higher prio than bigquery working at all.

- Added correct parameter typing for JSON.

- Fixed ordering issues in tests (assumed row order when it is
non-deterministic)

Co-authored-by: Dan Stone <wotbrew@gmail.com>
Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-11 17:14:23 +00:00
github-automation-metabase
4a954de0d7 🤖 backported "fix: allow dashboard caching in read-only mode" (#70588)
fix: allow dashboard caching in read-only mode (#70511)

* fix: allow dashboard caching in read-only mode

* fix: split out cache permissions from can-write?

We were denying changing caching policy for dashboards on read-only
remote-synced instances because we set can-write? to false for
dashboards when we are in read-only mode.

we also need to create a new boolean flag we can return to the frontend
to indicate that caching is still allowed even when editing a dashboard
is otherwise disabled.

* fixup! PR feedback

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-11 17:06:59 +00:00
github-automation-metabase
6cf167a0b7 🤖 backported "Log the migrations blocking the downgrade" (#70706)
Log the migrations blocking the downgrade (#70701)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-11 14:17:56 +00:00
github-automation-metabase
22b309b5cf 🤖 backported "Pivot Table shows a blank card when rendered on a dashboard" (#70584)
Pivot Table shows a blank card when rendered on a dashboard (#70385)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-10 23:18:25 +00:00
github-automation-metabase
db0f4772b5 🤖 backported "[MBQL lib] Ignore inherited-temporal-unit on bucketed columns" (#70607)
[MBQL lib] Ignore `inherited-temporal-unit` on bucketed columns (#70512)

Fixes QUE2-394.

This issue was caused by losing the thread of a column between stages in
the case where it has a different `:inherited-temporal-unit` than its
proper `:temporal-unit`.

`lib.equality/=` was checking the `:temporal-unit`s, which match, and
then returning `false` because only one column had
`:inherited-temporal-unit` for a different, finer unit. That shouldn't
fail the match, since the `:inherited-temporal-unit` is obsolete when
the column has just been bucketed differently.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-10 21:35:16 +00:00
github-automation-metabase
b3b41e6e78 🤖 backported "Preserve expression names when fixing bad field refs" (#70600)
* Preserve expression names when fixing bad field refs (#70530)

Closes QUE2-397

* Fix merge

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
Co-authored-by: Tamás Benkő <tamas@metabase.com>
2026-03-10 21:18:09 +00:00
github-automation-metabase
96c3eef65e 🤖 backported "Data migration to fix clickhouse upload dbs with missing schema" (#70467)
* Data migration to fix clickhouse upload dbs with missing schema (#70363)

* testing

* add migration

* add test

* reorder test

* improve migration

* improve test

* add comment explanation

* fmt

* move migration to 58

* fix order

* fix test

---------

Co-authored-by: Riley Thompson <riley@metabase.com>
Co-authored-by: Riley Thompson <rileythompson99@gmail.com>
2026-03-10 21:14:30 +00:00
Alexander Polyankin
3694add7a5 Delete transform tests in v58 (#70669) 2026-03-10 20:10:22 +00:00
github-automation-metabase
de81cf1e69 🤖 backported "fix: new SQL questions automatically open DataReference sidebar" (#70174)
Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
fix: new SQL questions automatically open DataReference sidebar (#70120)
2026-03-10 08:08:57 -05:00
github-automation-metabase
821225a1a1 🤖 backported "Fix broken e2e test for #68998" (#70621)
Fix broken e2e test for #68998 (#70585)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-10 00:40:28 +00:00
github-automation-metabase
b92ea28d8b 🤖 backported "docs - remote sync limitations" (#70604)
docs - remote sync limitations (#70598)

* branch limitations

* edits

* link

* Apply suggestions from code review



---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-09 20:54:05 +00:00
github-automation-metabase
4c1c35019d 🤖 backported "EMB-1329: update embed wizard terms copy and add link" (#70422)
* EMB-1329: update embed wizard terms copy and add link (#69856)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Nicolò Pretto <info@npretto.com>

closes #69302
Closes linear.app/metabase/issue/EMB-1329/embedding-tooltip-directs-you-to-read-license-text-linked-above-no

* update eslint rule name since this is on the older version of eslint

---------

Co-authored-by: Alberto Perdomo <alberto.perdomo@gmail.com>
Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-09 11:39:38 +01:00
github-automation-metabase
3c52cee848 🤖 backported "Fix typo in self-dependency removal GHY-3198" (#70555)
Fix typo in self-dependency removal GHY-3198 (#70535)

There was a typo in a transducer where the cat and remove were swapped. The cat was meant to combine collections (`#{x})` and the remove was looking for `x`, but since it happened in the wrong order, it never removed them. This led to self-dependent entities, and therefore cycles which caused infinite loops.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-08 03:06:17 +00:00
github-automation-metabase
09e0b94174 🤖 backported "fix: metabot returns null for pasted question references" (#70456)
fix: metabot returns null for pasted question references (#70388)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-03-06 17:33:42 +00:00
github-automation-metabase
23da6ce33e 🤖 backported "Fix duplicate alerts/subscriptions firing in multi-pod clusters" (#70491)
Fix duplicate alerts/subscriptions firing in multi-pod clusters (#70474)

* Fix duplicate alerts/subscriptions firing in multi-pod clusters

Set acquireTriggersWithinLock=true to force pessimistic locking during
trigger acquisition. Without this, Quartz uses an optimistic UPDATE that
is vulnerable to an ABA race condition where multiple cluster nodes can
acquire and fire the same trigger simultaneously.

* Add *warn-on-reflection* to custom_migrations/util

Fixes clj-kondo warning triggered by Java interop (System/setProperty,
System/clearProperty) added in the acquireTriggersWithinLock fix.

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-06 14:36:47 +00:00
Nicola Mometto
1a927ef93e Make 58 resilient to 59 data_layer values, to avoid mid-upgrade crashes (#70485)
* reverse of #69158, to make 58 resilient to 59 breaking changes mid upgrade

* add test
2026-03-06 13:17:42 +00:00
github-automation-metabase
86e64f550d 🤖 backported "Don't show hosting upsell to pro users" (#69681)
don't show upsell on pro

Co-authored-by: Ryan Laurie <iethree@gmail.com>
2026-03-05 08:43:49 -05:00
github-automation-metabase
cb32c606ae 🤖 backported "Restrict notification schema and allowed template values" (#70382)
Restrict notification schema and allowed template values (#70261)

* fix: restrict channel renderer to hbs files in the template path

* restricted api schemas

* explicit validation

* chore: tests

* fix: test

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-05 13:41:00 +00:00
bryan
9e6776f004 Backport mage -driver-decisions to release-x.58.x (#70346) 2026-03-04 13:17:42 -07:00
github-automation-metabase
be2c84c7a7 🤖 backported "Conceal JWT signing secret by default" (#70377)
* Conceal JWT signing secret by default (#70329)

* Backport PasswordInput component

---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-04 17:42:06 +00:00
github-automation-metabase
1c1c32ccf9 🤖 backported "fix: cancelling remote sync tasks dismisses modal" (#69820)
* fix: cancelling remote sync tasks dismisses modal (#67613)

* fix: cancelling remote sync tasks dismisses modal

Previously we didn't close this modal until the task reached a
'cancelled' state which could take several seconds.

* fixup! PR feedback

* fixup! actionbutton import

---------

Co-authored-by: Edward Paget <ed.paget@gmail.com>
2026-03-04 10:28:46 -06:00
Mahatthana (Kelvin) Nomsawadi
cf6856f0fb Stop releasing older major versions as latest (#70353) 2026-03-04 07:22:26 +00:00
github-automation-metabase
1990beb409 🤖 backported "Don't fail on unknown settings when calling set-many" (#70345)
Don't fail on unknown settings when calling set-many (#70282)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-03 22:41:13 +00:00
Rodrigo López Dato
b609770fd6 🤖 backported "record group membership removals in activity log" (#70084)
record group membership removals in activity log (#69316)

* record group membership removals in activity log

Previously the `PUT /api/membership/:group-id/clear` and
`DELETE /api/membership/:id` endpoints did not emit group membership
deletion events.

In the long run it would be better if `t2` were the interface for
PermissionsGroupMembership, so users didn't need to call these "blessed"
functions. But for now, let's go along with the existing pattern here,
have some blessed functions for doing things, and throw exceptions if
someone does a direct `t2/delete!` on a `:model/PermissionsGroupMembership`.

* use macro for more obvious workaround

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-03 17:39:31 -03:00
github-automation-metabase
44a932b788 Auto-update documentation for release-x.58.x (#70293)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-03 09:04:16 -05:00
github-automation-metabase
758a1da37b 🤖 backported "Use the search cluster lock for both init indexing and re-indexing" (#70286)
Use the search cluster lock for both init indexing and re-indexing (#70272)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-03 00:57:02 +00:00
github-automation-metabase
f0c4ed2503 🤖 backported "Improve remote sync errors with missing objects" (#69847) 2026-03-02 09:17:08 -06:00
github-automation-metabase
1ce579459f 🤖 backported "Move pulse preview endpoints to dev-only" (#70104)
Move pulse preview endpoints to dev-only (#70068)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-02 15:01:54 +00:00
github-automation-metabase
fa9301038f 🤖 backported "Interrupt threads stuck after query cancellation" (#69376)
Interrupt threads stuck after query cancellation (#69254)

* interruot stuck threads

* small changes

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-02 14:44:03 +00:00
github-automation-metabase
fe176795c2 🤖 backported "Increase viewport to reduce "extract column" flakes" (#70234)
Increase viewport to reduce "extract column" flakes (#70206)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-28 12:49:59 +00:00
github-automation-metabase
c2b1490c71 🤖 backported "Improve logging around notifications" (#70203)
Improve logging around notifications (#70099)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-27 17:49:58 +00:00
github-automation-metabase
03e232ef84 🤖 backported "Add position field to dashboard parameters for stable serialization" (#70201)
Add position field to dashboard parameters for stable serialization (#70107)

* revert sorting by id on parameters serialization, parameters ordering is significant and must be preserved

* revert, we're storing position

* feat: add :position to parameters, backfill

* feat: backfill position on imported parameters

* chore: tests

* FE: update position

* chore: gitignore python-sources.lock

* chore: ensure we get position

* restrict to dashboard params

* tests

* simpler approach: just sort by position on serialization export/import

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-02-27 16:55:32 +00:00
github-automation-metabase
3be69e496c 🤖 backported "Simplify notification result data flow" (#70195)
Simplify notification result data flow (#70115)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-27 16:04:33 +00:00
github-automation-metabase
6f4182906c 🤖 backported "Fix bigquery routing test" (#70185)
Fix bigquery routing test (#70154)

- Was using wrong project / creds
- Using two different sha names only worked when shas were not used as
qualifiers in the query (they are for bigquery)

Added the ability to override the hash-key used for tx/hash-dataset to
support forcing a hash collision (as is required by routing).

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-02-27 11:23:43 +00:00
github-automation-metabase
cb09342f8c 🤖 backported "Ring middleware for public sharing endpoints" (#70164)
Ring middleware for public sharing endpoints (#70153)

* Ring middleware for public sharing endpoints

* Refactor test

* move +public-sharing-enabled to address module lint

* Fix documents test

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-26 18:56:35 +00:00
github-automation-metabase
2e5e1d3c65 🤖 backported "fix content translations break visualization settings" (#70156)
fix content translations break visualization settings (#70054)

* fix content translation produces unstable translated keys in viz settings

Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2026-02-26 13:25:14 -05:00
Noah Moss
7b69b2642e 58 backport of "Always run Metabot-triggered refingerprinting in admin context to match sync behavior" (#70127)
🤖 backported "Always run Metabot-triggered refingerprinting in admin context to match sync behavior" (#70091)

Always run Metabot-triggered refingerprinting in admin context to match sync behavior (#70087)

* always run fingerprinting in admin perms context

* address comment

Co-authored-by: github-automation-metabase <166700802+github-automation-metabase@users.noreply.github.com>
2026-02-25 17:51:54 -05:00
github-automation-metabase
ccf8e80c65 🤖 backported "Add diagnostic logging for duplicate alert investigation" (#70073)
Add diagnostic logging for duplicate alert investigation (#70020)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-24 18:26:10 +00:00
github-automation-metabase
93cd8a0c3a 🤖 backported "Ensure we can resolve map lookups" (#70065)
Ensure we can resolve map lookups (#70060)

* feat: explicit handlebars context

* chore: unit tests

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-02-24 14:51:01 +00:00
github-automation-metabase
2c124ee7ee 🤖 backported "[QP] Move logging-only work inside the log/* call" (#70043)
[QP] Move logging-only work inside the `log/*` call (#68362)

Move some logging-only computations into the `(log/* ...)` call so it won't be executed
unless the log level is sufficiently verbose for the log to actually be output.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-02-23 22:15:09 +00:00
github-automation-metabase
06cb748753 🤖 backported "Support all kinds of identity types on sqlserver" (#70038)
Support all kinds of identity types on sqlserver (#69871)

Closes QUE2-251

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-02-23 21:20:34 +00:00
github-automation-metabase
35889aaa84 🤖 backported "Map Snowflake big integers to :type/BigInteger " (#69776)
* Map Snowflake big integers to :type/BigInteger  (#67609)

* Map Snowflake big integers to :type/BigInteger (fix #63600)

* Test fixes 🔧

* Test fixes 🔧

* Test fix 🔧

* More test fixes 🔧

* Another round of test fixes 🔧

* (Hopefully) final test fix 🔧

* Code cleanup

* Revert changes that broke Clickhouse test

* Test fix 🔧

* Backport fix 🔧

---------

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
Co-authored-by: Cam Saul <github@camsaul.com>
2026-02-23 19:18:55 +00:00
github-automation-metabase
95d079b8c7 🤖 backported "fix(EmbedJS): Downloads fail on guest embedded questions" (#69978)
* fix(EmbedJS): Downloads fail on guest embedded questions (#69972)

* Add aria-label

---------

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-02-20 21:00:09 +00:00
github-automation-metabase
41c14269eb 🤖 backported "fix: better check for dirty collection state" (#69980)
fix: better check for dirty collection state (#69974)

Our frontend code that prevents sending unchanged collections missed
tenant collections being added to the payload. This fixes both the
frontend to make sure we don't send when there are no changed
collections and it updates the backend actually check if collections are
being changed rather than just checking if the collections map exists.

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-20 14:18:13 -06:00
github-automation-metabase
465943a93b Auto-update documentation for release-x.58.x (#69957)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-02-20 09:54:09 -05:00
Ryan Laurie
740ab6d8c9 [58] Security Fix (#69920)
* security fixes

* Use actions dataset

Symptom:
We started having tests failing

like:

```
expected: {:has_more_values false,
           :values [["African"] ["American"] ["Artisan"]]}
  actual: {:has_more_values false, :values (("American") ("Artisan") ("Asian"))}
    diff: - {:values [["African"] ["American"] ["Artisan"]]}
          + {:values [["American"] ["Artisan"] ["Asian"]]}
```

and

```
expected: {:has_more_values true,
           :values [["African"] ["American"] ["Artisan"] ["Asian"] ["BBQ"]]}
  actual: {:has_more_values true,
           :values (("American")
                    ("Artisan")
                    ("Asian")
                    ("BBQ")
                    ("European Shop"))}
    diff: - {:values [["African"] ["American"] ["Artisan"] ["Asian"] ["BBQ"]]}
          + {:values [["American"]
                      ["Artisan"]
                      ["Asian"]
                      ["BBQ"]
                      ["European Shop"]]}
```

Identify:
```
modified   src/metabase/actions/execution.clj
@@ -35,6 +35,10 @@
                                                               [:model_id      ::lib.schema.id/card]
                                                               [:dataset_query ::lib.schema/native-only-query]]
    request-parameters]
+  (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+    (when-not (.startsWith db-name "actions-test-data")
+      (println clojure.test/*testing-vars*)
+      #_(clojure.repl/pst (Exception. "how here?") 500)))
   (log/tracef "Executing action\n\n%s" (u/pprint-to-str action))
   (try
     (let [parameters (for [parameter (:parameters action)]
@@ -61,6 +65,10 @@
 (defn- execute-custom-action! [action request-parameters]
   (let [{action-type :type} action]
     (actions/check-actions-enabled! action)
+    (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+      (when-not (.startsWith db-name "actions-test-data")
+        (println clojure.test/*testing-vars*)
+        #_(clojure.repl/pst (Exception. "how here?") 500)))
     (let [model (t2/select-one :model/Card :id (:model_id action))]
       (when (and (= action-type :query) (not= (:database_id model) (:database_id action)))
         ;; the above check checks the db of the model. We check the db of the query action here
@@ -165,8 +173,14 @@
   (let [k (keyword (:kind action-instance))]
     (legacy->current k k)))

+(require 'clojure.repl)
+
 (defn- execute-implicit-action!
   [action request-parameters]
+  (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+    (when-not (.startsWith db-name "actions-test-data")
+      (println clojure.test/*testing-vars*)
+      #_(clojure.repl/pst (Exception. "how here?") 500)))
   (let [model-id        (:model_id action)
         implicit-action (parse-implicit-action action)
         {:keys [query row-parameters]} (build-implicit-query action implicit-action request-parameters)
```

I modified the action execution to print out test vars that weren't
using the correct dataset. A few need cross datasets to ensure can't run
on different dbs, and a few don't matter because they assert that
permissions fail or data is missing. But this
execute-action-permission-test didn't, and it's last branch asserts
"Admin can still execute actions" and that seems to have been the cause
of our troubles

---------

Co-authored-by: dan sutton <dan@dpsutton.com>
2026-02-20 04:14:57 +00:00
github-automation-metabase
2e09de18f1 🤖 backported "Mention that the appdb schema must always be public" (#69939)
Mention that the appdb schema must always be public (#69905)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 22:05:17 +00:00
github-automation-metabase
0c57f8124c 🤖 backported "docs: Fix step numbering + add details on how to confirm if using H2" (#69941)
docs: Fix step numbering + add details on how to confirm if using H2 (#69581)

* Fix step numbering + add details on how to confirm if using H2

* fix anchor links

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 21:22:04 +00:00
github-automation-metabase
4a92471b97 🤖 backported "Update model index limit in docs" (#69936)
Update model index limit in docs (#69933)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 21:10:46 +00:00
github-automation-metabase
c52b657556 🤖 backported "Remove unused HTTP action code paths" (#69930)
Remove unused HTTP action code paths (#69764)

* Remove dead code for actions

* Disable HTTP action type at API level

* clarify thrown exceptions

* Remove HTTP action tests

HTTP actions are now blocked at the API level; these tests cover
functionality that's no longer accessible.

* Remove remaining HTTP action references from api_test

The previous commit missed several HTTP action usages:
- all-actions-default helper function
- list-actions-test action-1 binding
- action-parameters-test (now uses query action)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-02-19 20:59:18 +00:00
Kevin Kelleher
dc6dad7234 Backport #69296 Visualizer trend lines and bug fixes: colors, settings, legends, axes (#69841) 2026-02-19 11:10:00 -05:00
github-automation-metabase
d02df13cd9 🤖 backported "Scalar viz ensure field to select has a section" (#69251)
* Scalar viz ensure field to select has a section (#69179)

* update unit test

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-02-19 14:46:44 +00:00
github-automation-metabase
5d64170063 🤖 backported "Capitalize Jar -> JAR" (#69909)
Capitalize Jar -> JAR (#69900)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 14:29:09 +00:00
github-automation-metabase
56a7c4a8cd 🤖 backported "Prevent expression editor from forcing literal types" (#69470)
Prevent expression editor from forcing literal types (#67647)

* Prevent expression editor from forcing literal types
2026-02-19 17:06:38 +03:00
github-automation-metabase
3e6b72d1c9 🤖 backported "More robust visualization settings normalization" (#69885)
More robust visualization settings normalization (#69860)

* More robust visualization settings normalization

* Remove stray `println`

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-02-19 01:15:37 +00:00
github-automation-metabase
dbd3235414 🤖 backported "fix: log parameter not nil value" (#69870)
fix: log parameter not nil value (#68200)

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-18 21:24:56 +00:00
github-automation-metabase
950838c07d 🤖 backported "Explain how DB routing and query caching work together" (#69863)
Explain how DB routing and query caching work together (#69855)

* Explain how DB routing and query caching work together

* Update docs/configuring-metabase/caching.md



---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-18 19:41:00 +00:00
github-automation-metabase
23ca6062df 🤖 backported "fix: allow uploads when schema is unrestricted" (#69814)
fix: allow uploads when schema is unrestricted (#69657)

* fix: allow uploads when schema is unrestricted

* fixup! add upload enabled flag

* Update impl.clj

* fixup! where upload flag is set

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-17 20:04:34 +00:00
github-automation-metabase
8a2635be18 🤖 backported "Fix navigate_to not doing anything in full-app embedding" (#69772)
Fix navigate_to not doing anything in full-app embedding (#69761)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-17 10:09:51 -03:00
github-automation-metabase
d875b2d2d7 🤖 backported "Fix missing availableHeight on model native editor" (#69770)
Fix missing availableHeight on model native editor (#69723)

* Fix missing availableHeight on model native editor

* Add repro for metabase#69722

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-17 04:15:16 +00:00
github-automation-metabase
d93dbe34aa 🤖 backported "Dashboard category filter not correctly populated when using multiple datasources in one graph" (#69661)
Dashboard category filter not correctly populated when using multiple datasources in one graph (#69318)

* Add repro e2e test

* Dashboard filter values when connected to card with multiple datasets

* Fix kondo

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-02-16 23:54:40 +00:00
github-automation-metabase
435255a0ff 🤖 backported "feat: add @ mention to metabot placeholders" (#69763)
feat: add @ mention to metabot placeholders (#69374)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-16 22:09:46 +00:00
github-automation-metabase
7f1c26999e 🤖 backported "Include the relevant step outcome in Trunk inputs" (#69551)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-16 22:44:42 +01:00
github-automation-metabase
07cdf70b69 🤖 backported "Revert "Do a rollback before discard all (#69026)"" (#69641)
Revert "Do a rollback before discard all (#69026)" (#69633)

This reverts commit 42d0d35dbd.

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-13 18:00:23 +00:00
github-automation-metabase
5faa0e05b4 🤖 backported "Correct the modular embedding preview usage count" (#69614)
Correct the modular embedding preview usage count (#69473)

* Correct the modular embedding preview count as :internal

* Add tests

* Fix the modular embedding preview count while not breaking alerts emails

* Fix E2E tests

* Fix wrong e2e syntax

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-02-13 16:22:02 +00:00
github-automation-metabase
c4e95ce68c 🤖 backported "docs - remove auth" (#69629)
docs - remove auth (#69594)

remove auth

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-13 14:39:37 +00:00
Nemanja Glumac
a59cd05bc4 TEMP: Skip BigQuery (#69620) 2026-02-13 12:37:26 +01:00
dpsutton
979a1f4d08 hit the airports database (#69609)
was swapped to this in https://github.com/metabase/metabase/pull/68844,
backported in https://github.com/metabase/metabase/pull/68949. But the
faster snowflake tests in
https://github.com/metabase/metabase/pull/68760 got the merge conflict
wrong and dropped the table.
2026-02-12 22:36:41 -05:00
Noah Moss
f1f4ee6cba Metabot field values fix 58 backport (#69593)
* switch function for metabot fetching field values

* refactor tests

* fix lint

* fix tests - keep existing behavior of auto-creating field values if needed
2026-02-12 16:50:32 -05:00
github-automation-metabase
896099c10d 🤖 backported "feat: add a stable sort for card parameters serdes" (#69506)
feat: add a stable sort for card parameters serdes (#69478)

Sorts parameters by their uuid to ensure that we maintain an order for
parameters across exports no matter the order they are serialized to the
database in.

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-12 21:50:23 +00:00
github-automation-metabase
f07ce113be 🤖 backported "Audit DB should exclude databasechangeloglock" (#69587)
Audit DB should exclude databasechangeloglock (#69487)

auditdb should exclude databasechangeloglock as well

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-12 20:00:06 +00:00
github-automation-metabase
9b65b3ff60 🤖 backported "Set bigquery transport options with read timeout" (#69465)
Set bigquery transport options with read timeout (#69306)

* set read timeout

* add tests

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-02-12 16:59:24 +01:00
github-automation-metabase
0e9ccd4b35 🤖 backported v58 "Fix the release-log workflow" (#69549)
Fix the release-log workflow (#69547)

Use prepare-release-scripts action in release-log workflow

Simplify the workflow by using the shared action instead of
manually setting up bun and building release scripts.

This works because the workflow always checks out master,
so the action from master (which uses bun) is always used.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:09:38 +01:00
github-automation-metabase
61fcfa12b4 🤖 backported "Enable fake-sync for Snowflake driver tests" (#68760)
Co-authored-by: bryan <bryan.maass@gmail.com>
2026-02-11 14:53:15 -07:00
Nick Fitzpatrick
a8e6298eb6 update check milestone github action (#69507) 2026-02-11 17:50:10 -04:00
github-automation-metabase
54144ee009 🤖 backported "ci: add H2 OSS driver tests to catch OSS-only failures" (#68811)
Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-11 13:20:04 -07:00
github-automation-metabase
b74eba7337 🤖 backported "Remove old llms.txt superseded by Jekyll plugin on docs site" (#69133)
Remove old llms.txt superseded by Jekyll plugin on docs site (#69132)

remove llms.txt and llms-embedding-full.txt superseded by Jekyll build plugin

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-02-11 15:40:34 -04:00
github-automation-metabase
009b507dae 🤖 backported "fix: logo in email is not centered" (#69235)
fix: logo in email is not centered (#68806)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-11 17:50:51 +00:00
github-automation-metabase
9f23db4b88 Auto-update documentation for release-x.58.x (#69399)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-02-10 19:20:55 -08:00
github-automation-metabase
d993e3256e 🤖 backported "Added MB_MONITOR_PERFORMANCE option" (#69361)
Added MB_MONITOR_PERFORMANCE option (#69298)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-10 22:31:39 +00:00
github-automation-metabase
eb7328f8e6 🤖 backported "Allow syncing timestamp_ntz columns in databricks" (#69252)
Allow syncing timestamp_ntz columns in databricks (#67140)

dont exclude timestamp_ntz

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-02-10 20:51:34 +00:00
github-automation-metabase
3fac084240 🤖 backported "fix: grid Map Pins Offset in PDF Export" (#69368)
fix: grid Map Pins Offset in PDF Export (#68751)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-10 18:33:10 +00:00
github-automation-metabase
5a8ca2ac12 🤖 backported "ease how we generate nano-ids" (#69364)
ease how we generate nano-ids (#69317)

* ease how we generate nano-ids

Fixes https://github.com/metabase/metabase/issues/68130

nano-ids are not needed to be secure, they just need to be
distinct. They hide no secrets but assign identity.

In https://github.com/metabase/metabase/pull/66413 we replaced our usage
of https://github.com/zelark/nano-id with encore. These are almost the
same except that encore uses `secure?` to be true by default. In
practice this is:

```clojure
(if secure?
  (com.taoensso.encore.Ids/genNanoId (.get com.taoensso.encore.Ids/SRNG_STRONG) len)
  (com.taoensso.encore.Ids/genNanoId                                            len))
```

And that `com.taoensso.encore.Ids/SRNG_STRONG` is

```java
public static final ThreadLocal<SecureRandom> SRNG        = ThreadLocal.withInitial(SecureRandom::new);
public static final ThreadLocal<SecureRandom> SRNG_STRONG = ThreadLocal.withInitial(() -> {
        try { return SecureRandom.getInstanceStrong(); }
        catch (java.security.NoSuchAlgorithmException e) {
            throw new RuntimeException("Failed to initialize strong SecureRandom", e);
        }});
```

the implmentation in the old library was

```clojure
(defonce *secure-random (delay (SecureRandom.)))
```

So passing `false` for the encore version of the nanoid restores the
previous behavior.

CALLOUT:
One thing to call out is that this did slightly change how we generate
nano-ids based on a seed. We used this behavior to backfill
nano-ids. That let us try to ensure that the same thing in multiple
systems would have the same nano-id, thus identifying them across
systems.

We are now generating different nanoids for the same inputs.

```clojure
❯ java -cp $JARS/1.45.4.jar clojure.main
Clojure 1.11.1
user=> (doto 'metabase.util require in-ns)
metabase.util
metabase.util=> (generate-nano-id "cafebabe")
"VlXdQMzunVywNw_SArkKX"
metabase.util=>
```
This is a consistent nanoid all the way up to 57:
```clojure
❯ java -cp $JARS/1.57.10.jar clojure.main
Clojure 1.12.2
user=> (doto 'metabase.util require in-ns)
metabase.util
metabase.util=> (generate-nano-id "cafebabe")
"VlXdQMzunVywNw_SArkKX"
metabase.util=>
```

And now is different in 58:

```clojure
❯ java -cp $JARS/1.58.3.jar clojure.main
Clojure 1.12.3
user=> (doto 'metabase.util require in-ns)
metabase.util
metabase.util=> (generate-nano-id "cafebabe")
"xNzFsobWPxaYpY0ucTMmz"
```

This is not a problem because we backfilled these nanoids in ~41 or so
and no longer allow anyone to save a model without one. But is worth a
callout that 58 changed this.

* fix drivers team attribution (#69323)

causes module config tests to fail

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-10 17:47:01 +00:00
github-automation-metabase
2eb39b00e3 🤖 backported "Don't use the deprecated enable-query-caching value" (#69311)
Don't use the deprecated enable-query-caching value (#69256)

Don't use the deprecated enable-query-caching value which may have been stored as "false" in the database.

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-10 16:21:38 +00:00
github-automation-metabase
62f1388273 🤖 backported "Fix infinite hang caused by selecting drop down in conditional formatting settings" (#69294)
Fix infinite hang caused by selecting drop down in conditional formatting settings (#69141)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-02-10 12:33:34 +00:00
github-automation-metabase
075b93621b 🤖 backported "fix(SDK): fixed bugged scrolling in embedded metabot (second version)" (#69336)
fix(SDK): fixed bugged scrolling in embedded metabot (second version) (#69265)

* fixed bugged scrolling in embedded metabot

* focus

* .

* e2e test

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-02-10 11:32:31 +00:00
github-automation-metabase
fae8f9d907 🤖 backported "fix: dark Theme Hides values in Gauge Chart" (#69246)
fix: dark Theme Hides values in Gauge Chart (#69237)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-07 02:19:48 +00:00
github-automation-metabase
8663f47407 🤖 backported "Fix "View as table" in visualizer" (#69249)
Fix "View as table" in visualizer (#69204)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-02-06 21:37:36 +00:00
github-automation-metabase
b875048d1e 🤖 backported "fix: the timing of the shimmer loading indicator effect should be 2x as fast" (#69247)
fix: the timing of the shimmer loading indicator effect should be 2x as fast (#69239)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-06 21:30:42 +00:00
github-automation-metabase
bf2696c956 🤖 backported "fix: prompt suggestions should left-align with the input box" (#69248)
fix: prompt suggestions should left-align with the input box (#69227)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-06 21:23:55 +00:00
github-automation-metabase
edc089b69e 🤖 backported "fix: dashboard card becomes uneditable after reordering funnel steps" (#69245)
fix: dashboard card becomes uneditable after reordering funnel steps (#69242)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-06 21:10:43 +00:00
github-automation-metabase
030c0c7c09 🤖 backported "docs - note on turning off downloads" (#69238)
docs - note on turning off downloads (#69231)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-06 18:39:42 +00:00
github-automation-metabase
4696261888 🤖 backported "Fix nested if statements" (#69195)
Fix nested if statements (#69144)

If you have an expression with an if statement inside an if statement, the outer if would get desugared to a case
statement, but the inner if would be left untouched.  This makes desugaring also desugar the inner if.

Co-authored-by: William <william@metabase.com>
2026-02-05 20:51:51 +00:00
github-automation-metabase
80ba029cb3 🤖 backported "Do a rollback before discard all" (#69190)
Do a rollback before discard all (#69026)

Do a rollback before discard all, since discard all can't be ran in a transaction.

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-05 20:23:13 +00:00
github-automation-metabase
f7fafc175d 🤖 backported "Upgrade jspdf" (#69161)
Upgrade `jspdf` (#69113)

Co-authored-by: da <paoliniluis@gmail.com>
2026-02-05 13:13:01 +00:00
github-automation-metabase
5527f64c45 🤖 backported "feat(modular): support relative paths for jwtProviderUri" (#69153)
feat(modular): support relative paths for jwtProviderUri (#69119)

feat(modular): support relative paths for jwtPRoviderUri

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-02-05 10:09:38 +00:00
github-automation-metabase
0a7b562b13 🤖 backported "fix: mini picker loader style" (#69143)
fix: mini picker loader style (#69027)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-05 00:05:38 +00:00
github-automation-metabase
b1fc7de58b 🤖 backported "module test runner" (#69136)
module test runner (#69124)

* module test runner

support for `:module` and `:modules` syntax for our test runner

When using multiple with `:modules` need to put them in a vector, and
for shell reasons need to quote it. So there's a convenience method
where you just pass an individual:

```shell
clj -X:dev:ee:ee-dev:test :modules '[tiles enterprise/agent-api]'
clj -X:dev:ee:ee-dev:test :module enterprise/agent-api
```

REPL
===

```clojure
test-runner=> (metabase.test-runner/find-and-run-tests-repl
                {:modules '[tiles enterprise/agent-api]})
Running tests with options {:mode :repl, :namespace-pattern #"^(?:(?:metabase.*)|(?:hooks\..*))", :exclude-directories [".clj-kondo/src" "classes" "dev" "enterprise/backend/src" "local" "resources" "resources-ee" "src" "target" "test_config" "test_resources"], :test-warn-time 3000, :only ("test/metabase/tiles" "enterprise/backend/test/metabase_enterprise/agent_api")}
Running tests in ("test/metabase/tiles" "enterprise/backend/test/metabase_enterprise/agent_api")
Looking for test namespaces in directory test/metabase/tiles
Looking for test namespaces in directory enterprise/backend/test/metabase_enterprise/agent_api
Finding tests took 159.0 ms.
Running 32 tests
Running before-run hooks...

LONG TEST in metabase-enterprise.agent-api.api-test/get-metric-details-test
Test took 3.447 seconds seconds to run
Ran 32 tests in 6.506 seconds
129 assertions, 0 failures, 0 errors.
{:test 32, :pass 129, :fail 0, :error 0, :type :summary, :duration 6505.825875, :single-threaded 20, :parallel 12}
Ran 12 tests in parallel, 20 single-threaded.
Finding and running tests took 6.7 s.
All tests passed.
Running after-run hooks...
Running QP tests against these drivers: #{:h2}
{:test 32,
 :pass 129,
 :fail 0,
 :error 0,
 :type :summary,
 :duration 6505.825875,
 :single-threaded 20,
 :parallel 12}
```

CLI
===

multiple:
```shell
❯ clj -X:dev:ee:ee-dev:test :modules '[tiles enterprise/agent-api]'
Warning: environ value /Users/dan/.sdkman/candidates/java/current for key :java-home has been overwritten with /Users/dan/.sdkman/candidates/java/21.0.2-tem
Reflection warning, clojurewerkz/quartzite/triggers.clj:85:6 - call to method forJob on org.quartz.TriggerBuilder can't be resolved (argument types: unknown).
Reflection warning, clojurewerkz/quartzite/scheduler.clj:254:3 - call to method checkExists on org.quartz.Scheduler can't be resolved (argument types: unknown).
Reflection warning, macaw/walk.clj:47:5 - call to method walk on com.metabase.macaw.AstWalker can't be resolved (argument types: unknown).
Running tests with options {:mode :cli/local, :namespace-pattern #"^(?:(?:metabase.*)|(?:hooks\..*))", :exclude-directories [".clj-kondo/src" "classes" "dev" "enterprise/backend/src" "local" "resources" "resources-ee" "src" "target" "test_config" "test_resources"], :test-warn-time 3000, :exclude-tags [:metabot-v3/e2e], :only ("test/metabase/tiles" "enterprise/backend/test/metabase_enterprise/agent_api")}
Running tests in ("test/metabase/tiles" "enterprise/backend/test/metabase_enterprise/agent_api")
Looking for test namespaces in directory test/metabase/tiles
Looking for test namespaces in directory enterprise/backend/test/metabase_enterprise/agent_api
Finding tests took 11.8 s.
Running 32 tests
Running before-run hooks...

 0/32     0% [                                                  ]  ETA: --:--Placeholder until other changesets
LONG TEST in metabase-enterprise.agent-api.api-test/get-metric-details-test
Test took 10.536 seconds seconds to run

32/32   100% [==================================================]  ETA: 00:00

Ran 32 tests in 18.556 seconds
129 assertions, 0 failures, 0 errors.
{:test 32, :pass 129, :fail 0, :error 0, :type :summary, :duration 18555.859333, :single-threaded 20, :parallel 12}
Ran 12 tests in parallel, 20 single-threaded.
Finding and running tests took 30.4 s.
All tests passed.
Running after-run hooks...
Running QP tests against these drivers: #{:h2}
```

individual:

```
❯ clj -X:dev:ee:ee-dev:test :module enterprise/agent-api
Warning: environ value /Users/dan/.sdkman/candidates/java/current for key :java-home has been overwritten with /Users/dan/.sdkman/candidates/java/21.0.2-tem
Reflection warning, clojurewerkz/quartzite/triggers.clj:85:6 - call to method forJob on org.quartz.TriggerBuilder can't be resolved (argument types: unknown).
Reflection warning, clojurewerkz/quartzite/scheduler.clj:254:3 - call to method checkExists on org.quartz.Scheduler can't be resolved (argument types: unknown).
Reflection warning, macaw/walk.clj:47:5 - call to method walk on com.metabase.macaw.AstWalker can't be resolved (argument types: unknown).
Running tests with options {:mode :cli/local, :namespace-pattern #"^(?:(?:metabase.*)|(?:hooks\..*))", :exclude-directories [".clj-kondo/src" "classes" "dev" "enterprise/backend/src" "local" "resources" "resources-ee" "src" "target" "test_config" "test_resources"], :test-warn-time 3000, :exclude-tags [:metabot-v3/e2e], :module enterprise/agent-api, :only ("enterprise/backend/test/metabase_enterprise/agent_api")}
Running tests in ("enterprise/backend/test/metabase_enterprise/agent_api")
Looking for test namespaces in directory enterprise/backend/test/metabase_enterprise/agent_api
Finding tests took 12.6 s.
Running 19 tests
Running before-run hooks...

 0/19     0% [                                                  ]  ETA: --:--Placeholder until other changesets
LONG TEST in metabase-enterprise.agent-api.api-test/get-metric-details-test
Test took 11.252 seconds seconds to run

19/19   100% [==================================================]  ETA: 00:00

Ran 19 tests in 19.122 seconds
105 assertions, 0 failures, 0 errors.
{:test 19, :pass 105, :fail 0, :error 0, :type :summary, :duration 19122.404791, :single-threaded 19}
Ran 0 tests in parallel, 19 single-threaded.
Finding and running tests took 31.8 s.
All tests passed.
Running after-run hooks...
Running QP tests against these drivers: #{:h2}
```

* very opinionated

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-04 21:55:10 +00:00
github-automation-metabase
125e144c55 🤖 backported "Fix formatting and spacing in quartz.properties. Add check in intervals to clusters" (#69126)
Fix formatting and spacing in quartz.properties. Add check in intervals to clusters (#68983)

Fix formatting and spacing in quartz.properties

Adding a new line for Quartz to check in on clusters

Co-authored-by: da <paoliniluis@gmail.com>
2026-02-04 20:09:40 +00:00
github-automation-metabase
8739d47821 🤖 backported "[Athena] Correctly recognize :base_type when db type is uppercase" (#69111)
[Athena] Correctly recognize `:base_type` when db type is uppercase (#68369)

Athena's JDBC driver returns type names with the same capitalization as
the user types into the admin interface, but the
`sql-jdbc.sync/database-type->base-type` implementation for Athena only
recognized lower-case names (which are the defaults, I gather).

I think most databases don't have this problem, since they ignore the
case you typed in e.g. `CREATE TABLE` statements and have the JDBC
driver always return the canonical spelling of the type names.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-02-04 15:38:01 +00:00
github-automation-metabase
1708df6fe9 🤖 backported "updating color for .SecondaryCTALink" (#69110)
updating color for .SecondaryCTALink (#68001)

* updating color for .SecondaryCTALink

* light and dark upsell themes

* faster storybook build maybe?

* fix types, undo storybook changes

* Update Loki Snapshots

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-02-04 15:17:07 +00:00
github-automation-metabase
109161bcd7 🤖 backported "Snowflake: fix flaky test" (#68949)
Snowflake: fix flaky test (#68844)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-04 16:40:02 +07:00
github-automation-metabase
157485655b 🤖 backported "Fix throw-if-last-admin!" (#68810)
Fix `throw-if-last-admin!` (#68198)

[UXW-341: Reactive old admin account is not possible](https://linear.app/metabase/issue/UXW-341/reactive-old-admin-account-is-not-possible)

Co-authored-by: John Swanson <john.swanson@metabase.com>
Co-authored-by: Ed Paget <edpaget@users.noreply.github.com>
Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-04 01:00:36 +00:00
github-automation-metabase
4bb9956fbb 🤖 backported "fix kerberos tests" (#69042)
fix kerberos tests (#69028)

* fix kerberos tests

in CI we're running:

```
[2/3] RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash )   && export DEBIAN_FRONTEND=noninteractive   && apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig

...

3.579 Hit:1 http://deb.debian.org/debian trixie InRelease
(#6 3.579 Hit:2 http://deb.debian.org/debian trixie-updates InRelease
(#6 3.588 Hit:3 http://deb.debian.org/debian-security trixie-security InRelease
(#6 3.651 Hit:4 https://deb.nodesource.com/node_22.x nodistro InRelease
(#6 3.661 Reading package lists...
(#6 4.185 Reading package lists...
(#6 4.691 Building dependency tree...
(#6 4.834 Reading state information...
Dockerfile:5

--------------------

   4 |

   5 | >>> RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash ) \

   6 | >>>   && export DEBIAN_FRONTEND=noninteractive \

   7 | >>>   && apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig

   8 |

--------------------

failed to solve: process "/bin/sh -c ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash )   && export DEBIAN_FRONTEND=noninteractive   && apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig" did not complete successfully: exit code: 100

(#6 4.850 E: Unable to locate package yarn
(#6 ERROR: process "/bin/sh -c ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash )   && export DEBIAN_FRONTEND=noninteractive   && apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig" did not complete successfully: exit code: 100
------
 > [2/3] RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash )   && export DEBIAN_FRONTEND=noninteractive   && apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig:
3.517 2026-02-03 18:01:51 - To install N|solid Runtime, run: apt install nsolid -y
3.517
3.579 Hit:1 http://deb.debian.org/debian trixie InRelease
3.579 Hit:2 http://deb.debian.org/debian trixie-updates InRelease
3.588 Hit:3 http://deb.debian.org/debian-security trixie-security InRelease
3.651 Hit:4 https://deb.nodesource.com/node_22.x nodistro InRelease

4.850 E: Unable to locate package yarn

```

and it seems like debian doesn't host yarn (anymore?) which is
understandable. So we just do:

```
&& npm install --global yarn
```

And we should be good.

LLM diagnosed this. The setup here is a bit strange to me but it cats
it's resulting dockerfile:

```yaml
      - name: Print compose config
        run: cat mba-compose.yml
```

which was helpful. That dockerfile references:

```yaml
  metabase:
    build:
      context: /home/runner/work/metabase/metabase/.devcontainer/
      dockerfile: Dockerfile
```

And it's that devcontainer we are fixing here

* trigger kerberos tests

it needs files to be changed:

```yaml
  run-presto-kerberos-test:
    needs: files-changed
    if: needs.files-changed.outputs.backend_presto_kerberos == 'true'
```

which is configured in `.github/file-paths.yaml`

```yaml
backend_presto_kerberos:
  - "**/presto_jdbc/**"
  - "**/presto_jdbc.clj"
  - ".github/workflows/presto-kerberos-integration-test.yml"
```

so i add a `^:synchronized` teset to a file that should trigger this
files changed check and we get CI

* fix how we detect presto changes

usually hyphens are underscores, so it was looking for
`"**/presto_jdbc/**"` but the driver module is not a classpath root and
it uses a hyphen. Also it excluded the test file. so just manually add
that in, although it would be hit by the hyphen rule that i added

* correct typo in test filename

* touch test file

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-04 00:40:33 +00:00
github-automation-metabase
e45d72b6fc 🤖 backported "log attribution" (#69044)
log attribution (#68906)

* log attribution

```
2026-01-30 16:00:53,351 INFO audit-app.audit :: Copying complete. {mb-team=UX West}
2026-01-30 16:00:53,451 INFO notification.seed :: Seeding default notifications {mb-team=Gadget}
2026-01-30 16:00:53,647 INFO notification.seed :: Seeded notifications: {:skip 6} {mb-team=Gadget}
2026-01-30 16:00:53,658 INFO startup.core :: Running setup logic SearchIndexInit ☑️ {mb-team=DevEx}
2026-01-30 16:00:53,658 INFO startup.core :: Running setup logic analytics-dev-mode-setup ☑️ {mb-team=DevEx}
2026-01-30 16:00:53,668 INFO jdbcjobstore.JobStoreTX :: ClusterManager: detected 1 failed or restarted instances.
2026-01-30 16:00:53,668 INFO jdbcjobstore.JobStoreTX :: ClusterManager: Scanning for instance "mbp-m1.lan1769787254192"'s failed in-progress jobs.
2026-01-30 16:00:53,671 INFO search.core :: Initializing search indexes {mb-team=UX West}
2026-01-30 16:00:53,671 INFO core.QuartzScheduler :: Scheduler MetabaseScheduler_$_mbp-m1.lan1769788852529 started.
2026-01-30 16:00:53,671 INFO task.impl :: Task scheduler started {mb-team=UX West}
2026-01-30 16:00:53,678 INFO util.queue :: Starting listener field-value-invalidate with 1 threads 🎧 {mb-team=DevEx}
2026-01-30 16:00:53,688 INFO util.queue :: Starting listener search-index-update with 1 threads 🎧 {mb-team=DevEx}
2026-01-30 16:00:53,688 INFO core.core :: Metabase Initialization COMPLETE {mb-team=UX West}
2026-01-30 16:00:53,697 INFO core.core :: Metabase Initialization COMPLETE in 3.2 s (JVM uptime: 53.0 s) {mb-team=UX West}
2026-01-30 16:00:53,735 INFO search.core :: Found existing search index, and using it. {mb-team=UX West}
```

* include env variable

```shell
MB_LOG_TEAM_ATTRIBUTION=true clj -J-Xmx6g ...
...
2026-02-02 14:51:26,653 INFO core.core :: Setting up prometheus metrics {mb-team=UX West}
2026-02-02 14:51:26,655 INFO analytics.prometheus :: Starting prometheus metrics collector {mb-team=UX West}
2026-02-02 14:51:26,695 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191 {mb-team=UX West}
...
```

* copy module config file over for log attribution

* comment indentation

* restore module config location

* proper "from jar" detection

* correct logic for which env has a file and which a resource

* missed one

* ns cleanup

* trigger CI

* don't check config each time, only once

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-04 00:21:14 +00:00
github-automation-metabase
9063854840 🤖 backported "Search Indexing: Cache card schema upgrades" (#69034)
Search Indexing: Cache card schema upgrades (#68912)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-03 22:43:05 +00:00
github-automation-metabase
d9c49e3894 🤖 backported "docs - revise Enterprise edition installation recommendations" (#69039)
docs - revise Enterprise edition installation recommendations (#69029)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-03 21:35:56 +00:00
github-automation-metabase
20318ff15e 🤖 backported "Fix #66446 - Disambiguate errors when moving content to remote synced collections" (#69020) 2026-02-03 15:40:54 -05:00
github-automation-metabase
5407ec6316 🤖 backported "Reenable deactivated tenants when autoprovisioning" (#68542)
Reenable deactivated tenants when autoprovisioning (#67947)

Previously even when autoprovisioning was on, you could not log into a
deactivated tenant (either as a new user or an existing user with that
tenant).

This changes the behavior to be more consistent. Just as a deactivated
user can log in when provisioning is on (and their user gets
reactivated), a deactivated tenant's users can still log in, but doing
so reactivates the tenant.

Co-authored-by: John Swanson <john.swanson@metabase.com>
Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-03 19:05:18 +00:00
github-automation-metabase
a02c58b444 🤖 backported "Fix reindex connection management" (#69006)
Fix reindex connection management (#68973)

Move reindex connection management to use a connection only around the writes, not try to use a connection across all writes, which may commit and therefore close server-side cursors still being used to read the next batch.

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-03 18:09:35 +00:00
github-automation-metabase
524e10902e 🤖 backported "fix: stacked bar chart crashes when card has multiple same-type aggregations" (#69018)
fix: stacked bar chart crashes when card has multiple same-type aggregations (#68903)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-03 17:59:10 +00:00
github-automation-metabase
b82083a20b 🤖 backported "Change log level from info to debug for ignored params on qp" (#68831)
Change log level from info to debug for ignored params on qp (#68748)

reducing a bit more the verbosity of our logs, this time on cards with old metadata

Co-authored-by: da <paoliniluis@gmail.com>
Co-authored-by: dpsutton <dan@dpsutton.com>
2026-02-03 17:54:20 +00:00
github-automation-metabase
234cd8650b 🤖 backported "Bigquery and snowflake failing test QUE-3013" (#69015)
Bigquery and snowflake failing test QUE-3013 (#68916)

BigQuery can't do case statements with different types in each branch. Other dbs can. This fixes a test that ran a case statement with different types to skip BigQuery, but it adds a new assertion to check correct behavior without it.

This also corrects a fault in the SnowFlake driver that incorrectly assumed that convertTimezone() returned a timestamp_ntz but it returns a timestamp_tz. This wraps it in a cast back to timestamp_ntz.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-02-03 17:36:57 +00:00
github-automation-metabase
94a7db3a20 🤖 backported "Custom test on connection checkout for clickhouse" (#68870)
Custom test on connection checkout for clickhouse (#68808)

* work around clickhouse bug

* driver change log

* use c3p0 test

* Add todo comment

* kondo

* more kondo

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-02-03 17:03:59 +00:00
github-automation-metabase
1c5813a3d4 🤖 backported "fix: gauge chart breaks when sent via email/slack" (#69003)
fix: gauge chart breaks when sent via email/slack (#68730)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-03 13:29:17 -03:00
github-automation-metabase
79b253981e 🤖 backported "Better error handling in queue listeners" (#69011)
Better error handling in queue listeners (#68924)

Better error catching in queue listeners, with auto-restart

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-03 16:21:28 +00:00
github-automation-metabase
aa0fb62488 🤖 backported "fix: cannot save dashboard when dashboard was reverted to one with deleted filter" (#69004)
fix: cannot save dashboard when dashboard was reverted to one with deleted filter (#68871)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-03 15:21:45 +00:00
github-automation-metabase
8a6e6c98d3 🤖 backported "Fix empty tooltips" (#68997)
Fix empty tooltips (#68925)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-02-03 12:51:13 +00:00
github-automation-metabase
ab1a990400 🤖 backported "Fix flake in native test " (#68989)
Fix flake in native test  (#68972)

* Add metaKey to test helpers

* Fix flake by using realPress helper

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-03 08:08:16 +00:00
github-automation-metabase
a137bc3b78 🤖 backported "Case statements with/without defaults" (#68849)
Don't double-convert expressions with convertTimezone() (#68740)

In the case statement, the default case did not TIMEZONE() to alter the timezone. The cases with TIMEZONE() returned a timestamp. The default case without TIMEZONE() returned timestamptz. Postgres reconciled the different types by converting all of them to timestamptz. So the timestamp was altered (by TIMEZONE()), but a new UTC timestamp was added (by the cast).

When the post-processor formats the rows, it checks that the metadata for the column has :converted_timezone. If it has that, it is formatted in the converted timezone, and since it's UTC, it will convert it again, a second time, which is incorrect.

The fix here is to check if the returned column is a timestamptz and strip it before formatting. We assume the database has already done the conversion. This avoids the second conversion.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-02-03 00:20:35 +00:00
github-automation-metabase
f2ddea054c 🤖 backported "Run transforms with a temp table + rename to avoid blocking queries" (#68907)
* Run transforms with a temp table + rename to avoid blocking queries (#68756)

* add fix and test

* dont drop bigquery tables and add test

* use atomic renames when possible

* use helper functions

* use existing wait-for-table

* use shared temp-table-name

* small change

* remove bigquery hack, make more similar to python impl

* address comments

* use random suffix and table name for temp tables

* use table hash

* update temp-table-name

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* mocked test to verify strategy selection

* fix test

* test description

* remove test

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* add driver.u

---------

Co-authored-by: Riley Thompson <riley@metabase.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Riley Thompson <rileythompson99@gmail.com>
2026-02-02 15:57:18 -05:00
github-automation-metabase
0d17572350 Auto-update documentation for release-x.58.x (#68942)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-02-02 09:11:07 -05:00
github-automation-metabase
97ddbf8241 🤖 backported "[match-lite] Make match-lite recursive by default" (#68743)
Manual backport - "[match-lite] Make match-lite recursive by default" (#68658)

Make match-lite recursive by default

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-02-02 04:17:29 +00:00
github-automation-metabase
1884cea5c5 🤖 backported "Paginate caching dashboard" (#68799) 2026-01-30 16:11:01 -06:00
github-automation-metabase
b375f47020 🤖 backported "Show Cloud region IDs next to names" (#68921)
Show Cloud region IDs next to names (#68918)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-01-30 21:57:58 +00:00
github-automation-metabase
d45ed12d09 🤖 backported "Keep field-values for detail-only fields" (#68816)
Keep field-values for detail-only fields (#67540)

* Keep field-values for detail-only fields

Closes #10851

* Make sure old-preview-display is set

* Fix test

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-01-30 20:33:04 +00:00
github-automation-metabase
bd22efcd81 🤖 backported "implicit joins get implicit fields added" (#68746)
Say you are doing an implicit join from orders to products in order to summarize by products.category. Previously, with implicit joins, we join with the actual products table instead of a select blah from products wrapper, and so the various fields returned by the join were returned under their original name. However, the code would abbreviate excessively long column names from the joined table and break the query.

That difference was due to add-implicit-fields running before add-implicit-joins. Explicit joins got implicit fields added, while implicit joins didn't get those fields. This pr runs add-implicit-fields a second time after add-implicit-joins, which makes implicit and explicit joins compile to the same (correct) sql.

---------

Co-authored-by: William <william@metabase.com>
2026-01-30 18:09:51 +00:00
github-automation-metabase
bf0b950a6e 🤖 backported "fix: documents charts rendering when resizing is sluggish" (#68905)
fix: documents charts rendering when resizing is sluggish (#68204)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-30 16:04:41 +00:00
github-automation-metabase
a5812b0a74 🤖 backported "Remove brand-light and brand-lighter" (#68881)
* Remove `brand-light` and `brand-lighter` (#68290)

* brand key adjustments

* loki tests

* handle the forgotten brand-dark

* Update Loki Snapshots

* removing brand-hover from dynamic-css-vars

* Adjustments to calendar picker colors

* small adjustments on the permissions pages

* sdk: remove background-hover tests from sdk as dynamic css derives are replaced with color-mix

* stupid spelling

* building shared resources

* Adjusting unit test, loki images

* rebasing adjustments

* Update Loki Snapshots

* small color fixes while I wait for loki

* re-adding highlighted class

---------

Co-authored-by: Metabase Automation <github-automation@metabase.com>
Co-authored-by: Phoomparin Mano <phoomparin@gmail.com>

* fixing css vars

* loki update

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
Co-authored-by: Phoomparin Mano <phoomparin@gmail.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-01-30 10:57:17 -04:00
github-automation-metabase
7d25281104 Auto-update documentation for release-x.58.x (#68893)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-01-30 09:29:41 -05:00
github-automation-metabase
b625cebc20 🤖 backported "fix(sdk): fix failing tests for white-labeled colors" (#68891)
fix(sdk): fix failing tests for white-labeled colors (#68790)

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-30 03:44:46 +00:00
github-automation-metabase
aa3519f63e 🤖 backported "Delete fuzzing workflow" (#68887)
Delete fuzzing workflow (#68880)

Co-authored-by: Fraser <fraser@metabase.com>
2026-01-30 02:53:09 +00:00
github-automation-metabase
597eef8401 🤖 backported "fix: y axis not shown even if it would fit" (#68879)
fix: y axis not shown even if it would fit (#68861)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-29 23:44:50 +00:00
github-automation-metabase
9539d33d39 🤖 backported "Remove Security and Appearance from embedding settings related links on OSS" (#68873)
Remove Security and Appearance from embedding settings related links on OSS (#68151)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-29 21:37:17 +00:00
github-automation-metabase
6369ea3615 🤖 backported "fix: documents ignore base path when linking to dashboards" (#68791) 2026-01-29 14:24:40 -05:00
github-automation-metabase
ef0b741edf 🤖 backported "docs - embedding edits" (#68864)
docs - embedding edits (#68567)

* embedding edits

* edits

* Apply suggestion from @jeff-bruemmer

* edits

* Apply suggestion from @jeff-bruemmer

* update

* sso

* edits

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-29 19:04:14 +00:00
github-automation-metabase
7a1388d2b3 🤖 backported "UXW-2862 Fix test flake" (#68858)
UXW-2862 Fix test flake (#68784)

Co-authored-by: Brad Anderson <brad@metabase.com>
2026-01-29 16:59:14 +00:00
Brad Anderson
427c9739de Manual backport - Fix: Keyboard navigation annoyance in command palette (#67317) (#68794) 2026-01-29 11:35:17 -05:00
github-automation-metabase
c0c12b45a7 🤖 backported "Hide Guest embedding status bar when guest embedding is disabled" (#68840)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-29 20:30:59 +04:00
github-automation-metabase
74cd4a75bd 🤖 backported "Improved message for job failure due to routing" (#68851)
Improved message for job failure due to routing (#68804)

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-01-29 16:03:14 +00:00
github-automation-metabase
72b83990e7 🤖 backported "Added link to doc for full app embedding" (#68846)
Added link to doc for full app embedding (#68773)

* added link to doc for full app embedding

* Apply suggestions from code review



---------

Co-authored-by: Sébastien <sebastien@metabase.com>
Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-01-29 14:37:19 +00:00
github-automation-metabase
3374dbbade 🤖 backported "Fix redshift sync failing with duplicate key error" (#68750)
resolve imports conflicts in tests

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-29 16:50:13 +03:00
github-automation-metabase
b17128b3f4 🤖 backported "Throw db-routing error on anonymous transform call" (#68839)
Throw db-routing error on anonymous transform call (#68788)

Fixes GDGT-1588

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-01-29 12:17:13 +00:00
github-automation-metabase
b5ca53f2ae 🤖 backported "GDGT-1356: Alert Notification Cron Syntax is misleading" (#68838)
GDGT-1356: Alert Notification Cron Syntax is misleading (#68834)

* GDGT-1356: Adjust day of week parsing in cron string

* GDGT-1356: Add unit test

Co-authored-by: Stas Gavrylov <stas@metabase.com>
2026-01-29 12:16:44 +00:00
Stas Gavrylov
a6c08f22de OpenAPI->TS: Compile all changes from master to backport (#68732)
* OpenAPI->TS: Compile all changes from master to backport

* Update yarn.lock file

* OpenAPI->TS: Bring OpenAPI Check CI workflow

* Fix missing comma

* Remove unused field from openapi-ts config

* Bring docstring changes from api/common.clj

* Remove unrelated changes from open_api.clj

* Remove unrelated changes from open_api_test.clj
2026-01-29 11:01:48 +02:00
github-automation-metabase
17a3c2fa4b 🤖 backported "fix: search in mini data picker only shows loading on the first load" (#68815)
fix: search in mini data picker only shows loading on the first load (#68365)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-28 23:45:40 +00:00
github-automation-metabase
f9fdb487a0 🤖 backported "flake: fix temporal pollution" (#68812)
flake: fix temporal pollution (#68745)

flake: frozen clock

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-28 22:05:42 +00:00
github-automation-metabase
cb2bf685ce 🤖 backported "ClickHouse to always support schemas " (#68800)
ClickHouse to always support schemas  (#68517)

* set schemas to true and add migration

* just enable schemas

* remove migration

* add test

* fix schema test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-28 20:34:37 +00:00
github-automation-metabase
17e3e282ad 🤖 backported "flake: wait for card query after revert" (#68805)
flake: wait for card query after revert (#68796)

The revert operation triggers a chain: revert API -> reload card page.

Test was only waiting for the revert API, then sometimes it would manage
to click the History tab *before* the page reload. Then the page reloads
and we're not on the History tab anymore.

Waiting for the card query request to finish means that we've reloaded
the page and ready to roll.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-28 20:08:59 +00:00
github-automation-metabase
10d4c63540 🤖 backported "Make sunburst charts reflect colors set in the appearance tab" (#68795)
Make sunburst charts reflect colors set in the appearance tab (#68641)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-28 19:08:33 +00:00
github-automation-metabase
b315fa36aa 🤖 backported "Ensure we catch semantic search errors with failover and prometheus metrics" (#68786)
Ensure we catch semantic search errors with failover and prometheus metrics (#68639)

* Ensure we catch semantic search errors before RRF + add a new prometheus metric

* Revert "Ensure we catch semantic search errors before RRF + add a new prometheus metric"

This reverts commit d972fdf6df.

* Move fallback logic to semantic-search.core to not be metabot-specific, add test

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-01-28 16:29:22 +00:00
github-automation-metabase
c529dc414e 🤖 backported "Uxw 2696 handle charts where manual y axis hides all data" (#68783)
Uxw 2696 handle charts where manual y axis hides all data (#68156)

* off grid detection

* woof

* fixing bad counts

* adjusting no data points check

* expose initalUiState in visualizer

* cleaning up dashcard functions

* adjust broken behavior for existing tests

* e2e tests

* PR feedback

* remove buttons to open settings and auto adjust. Adding tests for pinned cards and documents

* removing unneeded code, pr feedback, and adding loki screenshots

* fix silly thing

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-01-28 16:02:51 +00:00
github-automation-metabase
e4db7c7aa7 🤖 backported "Fixed date range parameter widget can overflow in embed flows" (#68775)
Fixed date range parameter widget can overflow in embed flows (#68724)

* fixed date param ovrflowing in embed

* added loki test

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-28 11:40:50 +00:00
github-automation-metabase
712da34206 🤖 backported "Fix NativeQueryEditor's action buttons" (#68655) 2026-01-27 14:00:09 -06:00
github-automation-metabase
a6510769be 🤖 backported "Refactor match-lite and introduce :or clause" (#68741)
Refactor match-lite and introduce :or clause (#67345)

* Refactor match-lite

* Add support for :or syntax

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-01-27 18:47:03 +00:00
github-automation-metabase
d96a373dd2 🤖 backported "prometheus metrics for jvm startup" (#68734)
prometheus metrics for jvm startup (#68728)

logs:
```
2026-01-27 15:02:23,442 INFO util.queue :: Starting listener field-value-invalidate with 1 threads 🎧
2026-01-27 15:02:23,448 INFO util.queue :: Starting listener search-index-update with 1 threads 🎧
2026-01-27 15:02:23,448 INFO core.core :: Metabase Initialization COMPLETE
2026-01-27 15:02:23,453 INFO core.core :: Metabase Initialization COMPLETE in 4.8 s (JVM uptime: 57.8 s)
```

metrics:

```
❯ http get :9191/metrics | grep startup
metabase_startup_jvm_to_complete_millis 57764.0
metabase_startup_init_duration_millis 4816.0
```

Note that there two different notions of startup time: from jvm
instantiation, and from before init! was called. This maintains the two
separately so we can diagnose if class load time gets longer
independently of amount of work we do during startup itself

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-27 16:40:57 +00:00
dpsutton
ec62ca97ca more defensive checking (#68711)
I have a suspicion that the token check query is taking a long time. Timestamps in some logs are

2026-01-27 00:06:11.561 {"m":"Checking with the MetaStore to see whether token... 2026-01-27 00:06:28.951 {"lvl":"INFO","lgr":"metabase.premium-features.token-check","cluster":"metabase-1","m":"Reporting Metabase stats: 2026-01-27 00:06:28.951
{"lvl":"INFO","lgr":"metabase.premium-features.token-check","cluster":"metabase-1","m":"Reporting Metabase stats: Cannot throw exception because the return value of "java.lang.Throwable.getCause()" is null"

So:
I'm memoizing the token request stats for 2 minutes. This is not long enough to affect reported numbers, just to make sure that we successively checking we don't need to hit the db again

and don't rethrow an empty (.getCause e). I don't understand why it would be empty at all but I'm defensive here and logging

Master has these moved into metering-stats which is sent periodically
and not with tokens.

see https://github.com/metabase/metabase/pull/68709
and https://github.com/metabase/metabase/pull/67584
2026-01-27 10:30:10 -06:00
github-automation-metabase
d2df2f7a85 🤖 backported "Allow [::1] and 127.0.0.1 origins by default for cross-origin requests + support IPv6 origins" (#68726)
Allow [::1] and 127.0.0.1 origins by default for cross-origin requests + support IPv6 origins (#68697)

Allow [::1] origin by default for cross-origin requests

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-01-27 14:43:07 +00:00
github-automation-metabase
3785cd96b3 🤖 backported "Set max height to native editor and some other refactors" (#68450)
* Set max height to native editor and some other refactors (#67896)

* Desrtucture all this.props

* Convert to function component

* Remove the wrapper

* Forward ref in topbar

* Limit resize height

* Pass availableHeight to native query editor

* Move var to constants

* Add more padding

* Rename viewHeight to availableHeight

* Handle unset availableHeight

* Add availableHeight to QueryEditor

* Calculate availble height above the fold

* Resize editor when available size shrinks

* Remove layer of nesting

* Rename calc to get

* Pass availableHeight to sql editor in modal

* Remove resizableBoxProps prop

* Do not resize when closing editor

* Use runQuery from props when availabe

* Sort props and remove unused props

* Clean up setIsNativeEditorOpen

* Remove dispatch from NativeQueryEditor completely

* Move state change out of useEffect

* Pull out resizable box into separate component

* Simplify availableHeight prop

* Move resizable logic into separate component

* Clean up code

* Handle availableHeight being 0 initially

* Make minHeight take preference

* Avoid setting height to Infinity

* Add repro for metabase#59075

* Fix e2e test

* Do not use default export

* Add type to NativeQueryEditor

* Remove unused databases loader

* Remove unused ExplicitSize wrapper

* Remove enity loader wrappers

* Flatten props

* Fix setDatabaseQuery type

* Fix types

* Add className to NativeQueryEditor

* Fix types

* Pull out handler

* Manually update metadata when updating snippet

* Preserve sidebar state if need be

* Fix e2e test

* Fix mock exports

* Fix e2e test

* Do not overwrite availableHeight

* Remove viewHeight prop

* Increase limit

* Fix broken test

* Remove unneeded useHeightAboveFold helper

* Fix types

* Fix height

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-27 19:09:31 +11:00
github-automation-metabase
bbe3c2b509 Auto-update documentation for release-x.58.x (#68715)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-01-26 23:37:45 -05:00
github-automation-metabase
43a33dc9a8 🤖 backported "Flip mariadb during table editing support check" (#68716)
Flip mariadb during table editing support check (#68171)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-01-27 04:23:40 +00:00
github-automation-metabase
0d11d471e4 🤖 backported "Reduce bundle size by removing import of enormous character sizes constant" (#68704)
Reduce bundle size by removing import of enormous character sizes constant (#68700)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-26 22:32:41 +00:00
github-automation-metabase
b72b1bba53 🤖 backported "Only validate map URLs that changed" (#68698)
Only validate map URLs that changed (#68030)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-01-26 20:53:54 +00:00
github-automation-metabase
31c596ea5b 🤖 backported "try to prevent deadlocks in impersonation tests" (#68693)
try to prevent deadlocks in impersonation tests (#68690)

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-26 20:41:45 +00:00
github-automation-metabase
a7c7994a58 🤖 backported "handle empty error message" (#68616)
handle empty error message (#68581)

Fixes https://github.com/metabase/metabase/issues/68578

This issue is not about the stack overflow per-se but blowing up on a
string includes:

```javascript
{
  "app": "metabase",
  "time": "2026-01-22T12:08:53.660601485Z",
  "stream": "stderr",
  "app_version": "v1.57.10-X01",
  "message": "Exception in thread \"Thread-41\" java.lang.NullPointerException: Cannot invoke \"Object.toString()\" because \"s\" is null
at clojure.string$includes_QMARK_.invokeStatic(string.clj:377)
at clojure.string$includes_QMARK_.invoke(string.clj:373)
at metabase.app_db.cluster_lock$retryable_QMARK_.invokeStatic(cluster_lock.clj:27)
at metabase.app_db.cluster_lock$retryable_QMARK_.invoke(cluster_lock.clj:19)
at metabase.app_db.cluster_lock$do_with_cluster_lock.invokeStatic(cluster_lock.clj:87)
at metabase.app_db.cluster_lock$do_with_cluster_lock.invoke(cluster_lock.clj:65)
at metabase.app_db.cluster_lock$do_with_cluster_lock.invokeStatic(cluster_lock.clj:79)
at metabase.app_db.cluster_lock$do_with_cluster_lock.invoke(cluster_lock.clj:65)
at metabase.search.task.search_index$init_BANG_.invokeStatic(search_index.clj:36)
at metabase.search.task.search_index$init_BANG_.invoke(search_index.clj:32)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Unknown Source)",
  "namespace": "hosting-eb9b3875e12d465a",
  "container": "metabase",
  "cluster": "metabase-1",
  "_p": "F"
}
```

The error message itself comes from a stackoverflow which perhaps does
not have a message? Either way, it's possible for this to be missing so
be a bit defensive

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-26 20:36:29 +00:00
github-automation-metabase
b9cda3ebec 🤖 backported "Don't duplicate uploads in admin page" (#68695)
Don't duplicate uploads in admin page (#68077)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-01-26 20:29:40 +00:00
github-automation-metabase
c0a9ec4a6c 🤖 backported "Better logging around token checks" (#68688)
Better logging around token checks (#68625)

* Better logging around token checks

We used to just log we were checking but not give error responses. So it
would look like a ton of token checks for no real reason.

Now includes error responses if any, and also include logs when engaging
the token check circuit breaker, and when it is "half open", when it
lets one real token check happen every 30 seconds to see if the service
is back.

```
2026-01-23 12:26:47,175 INFO premium-features.token-check :: Checking with the MetaStore to see whether token 'f325...d01a' is valid...
2026-01-23 12:26:47,186 INFO premium-features.token-check :: Reporting Metabase stats: {:embedding-dashboard-count 0, :enabled-embedding-sdk false, :internal-users 1, :embedding-question-count 0, :query_executions_static_embed 0, :query_executions_public_link 0, :domains 1, :metabot-usage-date 2026-01-22, :enabled-embedding-static false, :enabled-embedding-simple false, :metabot-queries 0, :external-users 0, :metabot-tokens 0, :query_executions_simple_embed 0, :enabled-embedding-interactive false, :query_executions_internal 0, :metabot-users 0, :query_executions_sdk_embed 0, :query_executions_interactive_embed 0, :users 1}
2026-01-23 12:26:49,190 INFO premium-features.token-check :: Error checking token: Connect timed out †
2026-01-23 12:26:49,194 INFO premium-features.token-check :: Checking with the MetaStore to see whether token 'f325...d01a' is valid...
2026-01-23 12:26:49,201 INFO premium-features.token-check :: Reporting Metabase stats: {:embedding-dashboard-count 0, :enabled-embedding-sdk false, :internal-users 1, :embedding-question-count 0, :query_executions_static_embed 0, :query_executions_public_link 0, :domains 1, :metabot-usage-date 2026-01-22, :enabled-embedding-static false, :enabled-embedding-simple false, :metabot-queries 0, :external-users 0, :metabot-tokens 0, :query_executions_simple_embed 0, :enabled-embedding-interactive false, :query_executions_internal 0, :metabot-users 0, :query_executions_sdk_embed 0, :query_executions_interactive_embed 0, :users 1}
2026-01-23 12:26:51,205 INFO premium-features.token-check :: Engaging circuit breaker in token check ††
2026-01-23 12:26:51,206 INFO premium-features.token-check :: Error checking token: Connect timed out
2026-01-23 12:27:44,548 INFO premium-features.token-check :: In token check circuit breaker but attempting check
2026-01-23 12:27:44,551 INFO premium-features.token-check :: Checking with the MetaStore to see whether token 'f325...d01a' is valid...
2026-01-23 12:27:44,565 INFO premium-features.token-check :: Reporting Metabase stats: {:embedding-dashboard-count 0, :enabled-embedding-sdk false, :internal-users 1, :embedding-question-count 0, :query_executions_static_embed 0, :query_executions_public_link 0, :domains 1, :metabot-usage-date 2026-01-22, :enabled-embedding-static false, :enabled-embedding-simple false, :metabot-queries 0, :external-users 0, :metabot-tokens 0, :query_executions_simple_embed 0, :enabled-embedding-interactive false, :query_executions_internal 0, :metabot-users 0, :query_executions_sdk_embed 0, :query_executions_interactive_embed 0, :users 1}
2026-01-23 12:27:46,574 INFO premium-features.token-check :: Engaging circuit breaker in token check
2026-01-23 12:27:46,575 INFO premium-features.token-check :: Error checking token: Connect timed out

...
2026-01-23 12:32:50,432 INFO premium-features.token-check :: In token check circuit breaker but attempting check †††
2026-01-23 12:32:50,433 INFO premium-features.token-check :: Checking with the MetaStore to see whether token 'f325...d01a' is valid...
2026-01-23 12:32:50,444 INFO premium-features.token-check :: Reporting Metabase stats: {:embedding-dashboard-count 0, :enabled-embedding-sdk false, :internal-users 1, :embedding-question-count 0, :query_executions_static_embed 0, :query_executions_public_link 0, :domains 1, :metabot-usage-date 2026-01-22, :enabled-embedding-static false, :enabled-embedding-simple false, :metabot-queries 0, :external-users 0, :metabot-tokens 0, :query_executions_simple_embed 0, :enabled-embedding-interactive false, :query_executions_internal 0, :metabot-users 0, :query_executions_sdk_embed 0, :query_executions_interactive_embed 0, :users 1}
2026-01-23 12:32:52,450 INFO premium-features.token-check :: Engaging circuit breaker in token check
2026-01-23 12:32:52,450 INFO premium-features.token-check :: Error checking token: Connect timed out
```

The highlights are now we include:
- † `Error checkign token: Connect timed out` the error response when
appropriate
- †† `Engaging circuit breaker in token check` when we engage the
circuit breaker to no longer do real token checks
- ††† `In token check circuit breaker but attempting check` indicating
we are doing a real one from the circuit breaker to determine if the
service is restored

* Whew. Lots of stuff

add a namespace to the circuit breaker keyword:
`:token-check/circuit-breaker`. Change the keyword holding
`:token-check/app-db-not-ready` to cause. I had used reason but nothing
checked that.

this is because want to log when a token check fails, but not when it is
- failure due to circuit breaker
- failure due to appdb not ready yet.

token checks can happen anywhere and with an enormous frequency. they
fail before the appdb is setup (we can't check settigns yet) and of
course they fail during the circuit breaker opening. that's the point of
the circuit breaker. So we don't have to log these.

We _do_ want to log other failures.

We also want to do some prometheus metrics. Here's a journey:
You previously couldn't import the prometheus analytics namespace
because analytics.settings required appearance.settings. It does so
because a docstring in analytics settings used to include Metabase in
the string. I removed that so now it says "in order to help us
improve". And then things would be smooth sailing.

Except we had an issue.

```
026-01-23 20:50:03,514 INFO analytics.prometheus :: Starting prometheus metrics collector
2026-01-23 20:50:03,539 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
thread229238 we made the system!
thread229238 and now we are done with the lock!
2026-01-23 20:50:03,607 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,611 ERROR premium-features.token-check :: Error validating token: Failed to initialize Prometheus on port 9,191
2026-01-23 20:50:03,611 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,612 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,614 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,616 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,617 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,618 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,619 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,619 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
2026-01-23 20:50:03,653 INFO core.core :: Setting up prometheus metrics
```

We have locking around the system but it is starting tons of times! Lots
of debugging, swearing that this can't happen. but then i finally threw
in my favorite trick: `(clojure.repl/pst (Exception. "how did we get
here"))`. And it turns out we are doing this:

1. token check fails, so we call `prometheus/inc!`
2. inc is helpful, sees system isn't yet setup, and sets it up for us
3. Setup metric system
4. setup metrics in system
5. we hit the following code which gets initial values for labels

```clojure
(defn- initial-labelled-metric-values []
  (for [metric (keys (methods known-labels))
        labels (known-labels metric)]
    {:metric metric
     :labels labels
     :value  (initial-value metric labels)}))
```
6. We hit the following search code about which search we have

```clojure
(defmethod analytics/initial-value :metabase-search/engine-active
  [_ {:keys [engine]}]
  (if (search.engine/supported-engine? (keyword "search.engine" engine))
  1 0))
```

7. This takes us to semantic search:

```clojure
(defmethod search.engine/supported-engine? :search.engine/semantic [_]
  (try
    (supported?)
    (catch Exception e
      (log/warn e "Semantic search engine not supported")
      false)))
```

8. `supported?` here checks to see if you support a particular search
impelementation, which of course depends on _YOUR FEATURES_.
9. Checking features fails, so we should increment our prometheus
counter
10. the system is not yet initialized yet. Let's initialize it. (this is
also step 2)

So I have added a simple `inc-if-initialized!` function. It's not
important if the system is down. It's ok if these events are lost. The
system will be initialized in core anyways.

```
❯ http get :9191/metrics | grep metabase_token
 HELP metabase_token_check_attempt_total Total number of token checks. Includes a status label.
 TYPE metabase_token_check_attempt_total counter
metabase_token_check_attempt_total{status="failure",} 8.0
```

logs:

```
2026-01-23 22:58:26,668 INFO premium-features.token-check :: Checking with the MetaStore to see whether token '82bf...c3fe' is valid...
2026-01-23 22:58:28,706 INFO premium-features.token-check :: Error checking token: Connect timed out
2026-01-23 22:58:28,750 INFO core.core :: Setting up prometheus metrics
2026-01-23 22:58:28,751 INFO analytics.prometheus :: Starting prometheus metrics collector
2026-01-23 22:58:28,789 INFO premium-features.token-check :: Checking with the MetaStore to see whether token '82bf...c3fe' is valid...
2026-01-23 22:58:30,793 INFO premium-features.token-check :: Error checking token: Connect timed out
2026-01-23 22:58:30,798 INFO analytics.prometheus :: Starting prometheus metrics web-server on port 9191
...

2026-01-23 22:58:53,441 INFO premium-features.token-check :: Checking with the MetaStore to see whether token '82bf...c3fe' is valid... {mb-quartz-job-type=SyncAndAnalyzeDatabase}
...
2026-01-23 22:58:55,445 INFO premium-features.token-check :: Engaging circuit breaker in token check {mb-quartz-job-type=SyncAndAnalyzeDatabase}
2026-01-23 22:58:55,445 INFO premium-features.token-check :: Error checking token: Connect timed out {mb-quartz-job-type=SyncAndAnalyzeDatabase}
```

```
Exception how here??
	metabase.analytics.prometheus/setup! (prometheus.clj:584)
	metabase.analytics.prometheus/setup! (prometheus.clj:576)
	metabase.analytics.prometheus/inc! (prometheus.clj:668)
	metabase.analytics.prometheus/inc! (prometheus.clj:658)
	metabase.analytics.prometheus/inc! (prometheus.clj:665)
	metabase.analytics.prometheus/inc! (prometheus.clj:658)
	metabase.premium-features.token-check/error-catching-token-checker/reify--98262 (token_check.clj:431)
	metabase.premium-features.token-check/check-token (token_check.clj:488)
	metabase.premium-features.token-check/check-token (token_check.clj:484)
	metabase.premium-features.token-check/check-token (token_check.clj:486)
	metabase.premium-features.token-check/check-token (token_check.clj:484)
	metabase.premium-features.token-check/eval98325/*token-features*98348--98349 (token_check.clj:534)
	metabase.premium-features.token-check/eval98325/fn--98353 (token_check.clj:529)
	metabase.premium-features.token-check/has-feature? (token_check.clj:575)
	metabase.premium-features.token-check/has-feature? (token_check.clj:569)
	clojure.lang.Var.invoke (Var.java:386)
	metabase.premium-features.defenterprise/check-feature (defenterprise.clj:41)
	metabase.premium-features.defenterprise/check-feature (defenterprise.clj:35)
	metabase.premium-features.defenterprise/dynamic-ee-oss-fn/fn--71956 (defenterprise.clj:53)
	metabase.search.semantic.core/eval180600/fn--180601 (core.clj:58)
	clojure.lang.MultiFn.invoke (MultiFn.java:229)
	metabase.search.core/eval139302/fn--139304 (core.clj:77)
	clojure.lang.MultiFn.invoke (MultiFn.java:234)
	metabase.analytics.prometheus/initial-labelled-metric-values/iter--97802--97808/fn--97809/iter--97804--97810/fn--97811 (prometheus.clj:521)
	clojure.lang.LazySeq.force (LazySeq.java:50)
	clojure.lang.LazySeq.realize (LazySeq.java:89)
	clojure.lang.LazySeq.seq (LazySeq.java:106)
	clojure.lang.RT.seq (RT.java:555)
	clojure.core/seq--5488 (core.clj:139)
	clojure.core/concat/fn--5579 (core.clj:727)
	clojure.lang.LazySeq.force (LazySeq.java:50)
	clojure.lang.LazySeq.realize (LazySeq.java:89)
	clojure.lang.LazySeq.seq (LazySeq.java:106)
	clojure.lang.Cons.next (Cons.java:41)
	clojure.lang.RT.next (RT.java:733)
	clojure.core/next--5472 (core.clj:64)
	clojure.core/next--5472 (core.clj:64)
	metabase.analytics.prometheus/setup-metrics! (prometheus.clj:546)
	metabase.analytics.prometheus/setup-metrics! (prometheus.clj:533)
	metabase.analytics.prometheus/make-prometheus-system (prometheus.clj:60)
	metabase.analytics.prometheus/make-prometheus-system (prometheus.clj:55)
	metabase.analytics.prometheus/setup!/fn--97866 (prometheus.clj:591)
	metabase.analytics.prometheus/setup! (prometheus.clj:590)
	metabase.analytics.prometheus/setup! (prometheus.clj:576)
	metabase.analytics.prometheus/inc! (prometheus.clj:668)
	metabase.analytics.prometheus/inc! (prometheus.clj:658)
	metabase.analytics.prometheus/inc! (prometheus.clj:665)
	metabase.analytics.prometheus/inc! (prometheus.clj:658)
	metabase.premium-features.token-check/error-catching-token-checker/reify--98262 (token_check.clj:431)
	metabase.premium-features.token-check/check-token (token_check.clj:488)
```

* module config fixup

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-26 19:16:51 +00:00
github-automation-metabase
f0dc972c68 🤖 backported "Fix flaky GeoJS-dependent tests by mocking external service" (#68687)
Fix flaky GeoJS-dependent tests by mocking external service (#68623)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-01-26 18:23:07 +00:00
github-automation-metabase
c94c1b3714 🤖 backported "Delete from cache in batches of 1000" (#68685)
Delete from cache in batches of 1000 (#68622)

There's apparently an instance on cloud that is trying to remove 70k queries from the cache at once, and postgres
doesn't allow 70k params to a query.  Batching the deletes in groups of 1000 should fix that.

Co-authored-by: William <william@metabase.com>
2026-01-26 18:08:50 +00:00
github-automation-metabase
80f17de84b 🤖 backported "Tweak data loading behavior for a test after MySQL 9.6.0 release" (#68643)
Tweak data loading behavior for a test after MySQL 9.6.0 release (#68634)

Closes DEV-1289

### Description

Within the last day or two, `metabase.query-processor-test.remapping-test/self-referencing-test` began failing on MySQL Latest. I hypothesize this has to do with the [latest release](https://dev.mysql.com/doc/relnotes/mysql/9.6/en/news-9-6-0.html) fixing an unknown bug around batch inserts in InnoDB and the deprecation of a recusive [sic] fk-related flag.

The error is thrown not in the test conditions, but in the test setup -- MySQL apparently now checks foreign key constraints row-per-row even on a batch insert.

This adds a flag that the test can set which changes the test data-loading behavior to disable the FK check before insertion and re-enable it after.

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
2026-01-26 16:50:38 +00:00
github-automation-metabase
fd35df566a 🤖 backported "Fixed missing bg color for dashboards" (#68676)
Fixed missing bg color for dashboards (#68673)

fixed missing bg color for dashboards

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-26 12:55:39 +00:00
github-automation-metabase
c24f1c8c66 🤖 backported "Respect abbreviate date style and be defensive around missing settings" (#68663)
Respect abbreviate date style and be defensive around missing settings (#68661)

* Respect date_abbreviate when formatting date

* Respect abbreviate setting in month format too

* Add unit tests for abbreviated formats

* Add unit test for empty formatting settings

* Add repro for metabase#68574

* Add formatting settings unit tests

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-26 05:25:06 +00:00
github-automation-metabase
6488241a39 🤖 backported "fix: word wrap overflows row when reordering in dashboard table card" (#68652)
fix: word wrap overflows row when reordering in dashboard table card (#68566)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-24 04:24:54 +00:00
github-automation-metabase
a36b09ac66 🤖 backported "If a dashboard is back to just one tab, auto-assign all cards to that tab" (#68636)
If a dashboard is back to just one tab, auto-assign all cards to that tab (#68201)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-01-23 21:04:40 +00:00
github-automation-metabase
eb93a0a906 🤖 backported "fix: custom Logo isn't loaded properly on User Invite Email" (#68632)
fix: custom Logo isn't loaded properly on User Invite Email (#68476)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-23 21:03:57 +00:00
github-automation-metabase
68bb2e222d 🤖 backported "Unset the premium token for E2E tests" (#68605)
Unset the premium token for E2E tests (#68533)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-23 19:39:09 +00:00
github-automation-metabase
4233f7e4dd 🤖 backported "Revert ClickHouse from 0.9.5 to 0.8.4" (#68619)
Revert ClickHouse from 0.9.5 to 0.8.4 (#68502)

* revert to 0.8.4

* disable test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-23 18:07:00 +00:00
github-automation-metabase
9935851e9a 🤖 backported "Fix ChartTypeDropdown overflowing" (#68611)
Fix ChartTypeDropdown overflowing (#68455)

* Forcing overflow policy on ChartTypeDropdown

* tpyo

* refactoring to enable testing this with loki

* fixed story

* loki

* screenshot

* removed useless unit test

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-23 15:59:06 +00:00
github-automation-metabase
37aa580e95 🤖 backported "fix proper bg color for embedded dashboards with custom theme" (#68601)
fix proper bg color for embedded dashboards with custom theme (#68539)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-23 12:41:53 +00:00
github-automation-metabase
2756592a84 🤖 backported "fix: custom brand color not consistently applied on Enterprise UI elements" (#68582)
fix: custom brand color not consistently applied on Enterprise UI elements (#68484)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-22 23:37:36 +00:00
github-automation-metabase
31467e021f 🤖 backported "Don't show CORS settings in OSS/Starter editions" (#68569)
Don't show CORS settings in OSS/Starter editions (#68564)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-22 20:59:47 +00:00
github-automation-metabase
28aa9ebf76 🤖 backported "bit more cleanup" (#68558)
bit more cleanup (#68300)

* bit more cleanup

kept having a few flakes, couldn't consistently get it to pass 45 times
in a row locally. So just simplify it. Don't worry about "in process"
stats. Trying to get the webserver paused in the middle of a request was
occasionally deadlocking, often flaking.

So just calculate the simple ones and it's fine

```clojure
statistics-handler-test=> (clojure.test/run-test server-stats-test)

Testing metabase.server.statistics-handler-test

Ran 1 tests containing 13 assertions.
0 failures, 0 errors.
{:test 1, :pass 13, :fail 0, :error 0, :type :summary}
statistics-handler-test=> (dotimes [_ 100](server-stats-test))
nil
```

Also got rid of the macro that really only existed to collect the forms
into an anonymous function. Everything in-lined and now don't need a
kondo hook, etc

* remove unused alias

* kondo the refers

* reintroduce in-flight metrics

these:
```
(is (prometheus-test/approx= 1 (value! :jetty/requests-active)))
(is (prometheus-test/approx= 1 (value! :jetty/dispatched-active)))
```

Require a mechanism that can pause a request while active, verify that
the requests-active and dispatched active are incremented, and then
carry on. This is all kinda trivial except getting it wrong can
deadlock. Here are 500 successful runs of this test:

```
statistics-handler-test=> (dotimes [_ 100] (server-stats-test))
nil
statistics-handler-test=> (dotimes [_ 100] (server-stats-test))
nil
statistics-handler-test=> (dotimes [_ 100] (server-stats-test))
nil
statistics-handler-test=> (dotimes [_ 100] (server-stats-test))
nil
statistics-handler-test=> (dotimes [_ 100] (server-stats-test))
nil
```

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-22 17:50:00 +00:00
github-automation-metabase
a942e62612 🤖 backported "fix(embed-homepage): rename static embed to guest embed" (#68554)
fix(embed-homepage): rename static embed to guest embed (#68338)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-01-22 17:18:07 +00:00
dpsutton
6ad78eb844 Revert "🤖 backported "Add Anchor Links to Documents" (#68519)" (#68545)
This reverts commit 9699dfba74.
2026-01-22 17:08:04 +01:00
github-automation-metabase
f884329d9a Auto-update documentation for release-x.58.x (#68526)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-01-22 09:25:47 -05:00
github-automation-metabase
b31cc0523f 🤖 backported "add analytics skill" (#68530)
add analytics skill (#68419)

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-01-22 08:38:51 +00:00
github-automation-metabase
9699dfba74 🤖 backported "Add Anchor Links to Documents" (#68519)
Add Anchor Links to Documents (#67940)

* Add AnchorLinkButton component for document anchor links

- Add AnchorLinkButton component that copies URL to clipboard on click
- Shows 'Copied!' tooltip feedback using Mantine useClipboard hook
- Follows same pattern as CommentsButton for consistent styling
- Add unit tests for the component

* Add AnchorLinkMenu component for left-side anchor link hover

- Add AnchorLinkMenu floating menu for document blocks
- Uses createPortal for positioning (same pattern as CommentsMenu)
- Positioned on left side of blocks using floating-ui
- Shows/hides based on hover state via show prop
- Add unit tests for the component

* Add AnchorLinkMenu to document node views

- Add documentWithAnchor URL helper to generate shareable anchor URLs
- Update Heading, Paragraph, and Blockquote node views to render AnchorLinkMenu
- AnchorLinkMenu appears on the left side on hover
- CommentsMenu on the right side remains unchanged
- Each node view now uses two useFloating instances for positioning

* Add scroll-to-anchor for document URLs with hash

- Add E2E tests for anchor links functionality
- Implement scroll-to-anchor when navigating to document with #blockId hash
- Tests cover: hover shows anchor icon, copy to clipboard, scroll to block
- Regression test ensures CommentsMenu still works on right side

* Fix scroll-to-anchor dependency arrays for navigation edge cases

- Add documentId to scroll effect dependencies to re-run when navigating
  between documents with the same anchor hash
- Add location.hash to reset effect dependencies to properly reset flag
  when navigating via back button or changing anchors

* Fix accidental logo replacement and E2E blockquote test

- Restore original Metabase logo SVG (was replaced with red star debug graphic)
- Fix E2E test: use find('blockquote') instead of findByRole('blockquote')
  since native blockquote elements have no implicit ARIA role

* Fix scroll-to-anchor reliability and empty line behavior

- Implement retry mechanism for scroll-to-anchor to ensure target element exists
- Add highlight animation when scrolling to anchor
- Hide anchor link and comment menus on empty lines (Heading, Paragraph, Blockquote)

* Fix selector mismatch for scroll-to-anchor

- Add data-node-id attribute to NodeViewWrappers in Heading, Paragraph, and Blockquote
  extensions so they can be queried by DocumentPage
- Update DocumentPage to query using [data-node-id] selector instead of internal _id attribute
- Remove unused ID_ATTRIBUTE_NAME import in DocumentPage

* Fix highlight animation color variable

- Replace non-existent --mb-color-brand-alpha-25 with --mb-color-brand-light
- Ensure highlight animation is visible when scrolling to anchor

* added anchor links to lists and code blocks. some bugs fixes.

* make sure scroll-to-anchor observer is correctly initialized

- Refactor scroll-to-anchor logic to ensure smoother navigation
- Optimize highlight animation visibility during scrolling
- Adjust anchor link behavior on empty lines for better user experience

* small fixes

* clean up

* fixes and cleanup

* e2e test fixes

* fixed e2e test

* Leave anchor links only for header blocks

* Fix alignment

* Review fixes

* Fix unit tests

---------

Co-authored-by: Arkadi Yaroslavtsev <arkadi@metabase.com>
Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-21 23:44:43 +00:00
Timothy S. Dean
074aaf759b Backport of "Migration follow-up fix to #68100 (#68498)" (#68514)
Move migration from 058 to 056
2026-01-21 16:15:44 -07:00
github-automation-metabase
e935dbf5e5 🤖 backported "Uxw 2633 copy cells from table" (#68518)
Uxw 2633 copy cells from table (#68429)

* UXW-2633 fix sorted table values copy-paste

* Add e2e test

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-21 23:06:25 +00:00
github-automation-metabase
5bb8d13db5 🤖 backported "fix materialized views test" (#68516)
fix materialized views test (#68509)

https://github.com/metabase/metabase/pull/68190 did:

> Treats a 0 value of n_live_tup as NULL, due to confusion reported when
> auto analyze thresholds have not been met on a table.

I think what's happening is this is trying to suss out "i don't know"
and not give misleading information. When there are no stats pg would
report there are 0 rows rather than saying i don't know. So we toss away
these unreliable 0 count estimations.

This test flakes 7% of the time. Our hypothesis is that stats are empty
7% of the time so this row count estimation now gets removed.

By default the schema is `:estimated_row_count (mt/malli=? [:maybe
:int])` which was being clobbered with
`{:estimated_row_count (mt/malli=? int?)}` So the fix is to just not
clobber

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-21 22:58:35 +00:00
github-automation-metabase
a15602e4b3 🤖 backported "Bump toucan2 version to fix dashboards sometimes failing to load" (#68503)
Bump toucan2 version to fix dashboards sometimes failing to load (#68494)

If the first table mentioned by a dashboard has no fields (presumably because the table and its field are all
inactive), /api/dashboard/<id>/query_metadata would fail due to a toucan2 bug.  This bumps toucan2 to fix the bug and
adds a test to verify that this case now works.

Co-authored-by: William <william@metabase.com>
2026-01-21 21:32:23 +00:00
github-automation-metabase
e9ed0e5c7c 🤖 backported "Fix flaky test that uses readonly db that lacks permissions" (#68512)
Fix flaky test that uses readonly db that lacks permissions (#68417)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-21 21:30:42 +00:00
github-automation-metabase
afb058466e 🤖 backported "ci: Enable fail-fast for BigQuery and Snowflake driver tests" (#68507)
ci: Enable fail-fast for BigQuery and Snowflake driver tests (#68199)

Add :fail-fast? true to BigQuery and Snowflake test-args, matching the
existing Redshift configuration. This stops test execution on first
failure, saving CI time and resources.

Co-authored-by: Dan Meyer <dan.meyer@metabase.com>
2026-01-21 21:01:04 +00:00
github-automation-metabase
e5e4380e0b 🤖 backported "Apply unified theme object to main app and modular embedding" (#68491)
Apply unified theme object to main app and modular embedding (#68169)

Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-01-21 19:22:06 +00:00
github-automation-metabase
e741e08632 🤖 backported "Delete invalid source-card-ids on native SQL questions" (#68262)
* Delete invalid `source-card-id`s on native SQL questions (#68100)

When a user creates a question based on a model, `source_card_id` was set to the model's ID. If that question was later converted to native SQL, `source_card_id` wouldn't get cleared. This means that deleting the model would cause the question to be deleted even though they no longer have any relationship to one another.

The code fix won't help anyone whose data is already incorrect, so this adds a migration to correct the inconsistent data. I added an assertion to the t2 hook to catch this at dev time in the future. And ultimately, the delete cascade seems overkill, so there's a migration to replace that with SET NULL instead.

* Odd line duplication, oh well.

---------

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
Co-authored-by: Timothy Dean <timothy@timothydean.dev>
2026-01-21 13:08:30 -06:00
github-automation-metabase
d79e1b96c3 🤖 backported "Deduplicate field refs by ignoring :source-field-name unless it matters" (#68485)
Deduplicate field refs by ignoring `:source-field-name` unless it matters (#68166)

* Tentative fix for #67808 -- deduplicate by ignoring :source-field-name if possible

* Make sure `:fields` remains a vector

* Add note

* cljfmt

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-01-21 18:08:00 +00:00
github-automation-metabase
7f89aa0f6d 🤖 backported "fix: page hangs without a loader when saving a PDF" (#68482)
fix: page hangs without a loader when saving a PDF (#68385)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-21 17:13:25 +00:00
github-automation-metabase
a9a5332467 Auto-update documentation for release-x.58.x (#68449)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-01-21 11:54:47 -05:00
github-automation-metabase
6f582d5091 🤖 backported "Fix Horror Show fingerprint OOMs" (#68436)
Fix Horror Show fingerprint OOMs (#68391)

* Fix Horror Show fingerprint OOMs

This may likely fix many OOMs that others are seeing. Anyone with large
schema will likely benefit from this.

```clojure
(let [database (toucan2.core/select-one :model/Database :id 2)]
  (metabase.sync.analyze.fingerprint/fingerprint-fields-for-db!
    database (fn [s t] (println "synced " s "for " (:name t)))))
```

This is how we fingerprint fields. DB 2 here is "Horror Show", a
database with 200 tables, each of which has 900 fields in it. This
database has zero rows in it, it it just a large schema.

Syncing this recently has caused huge cpu spikes and then OOM errors
until the instance is killed.

Profiling locally with

```
MB_JETTY_PORT=3091 java "$(socket-repl 6091)" -Xmx2g -jar metabase.jar
```
and visual vm hooked up, I run

```clojure
(let [database (toucan2.core/select-one :model/Database :id 2)]
  (metabase.sync.analyze.fingerprint/fingerprint-fields-for-db!
    database (fn [s t] (println "synced " s "for " (:name t)))))
```

And observe this behavior:
The ram usage approaches the 2gb limit and then bounces there. The CPU
begins to spike erratically and spend 10% of its time in GC.

Taking a heap dump we can see that we have 2.8 million ResultSetMetaData
objects occuping 183 Mb.

The ResultSetMetaData are closed over and kept in the metadata of the
snake hating maps stored in the cached metadata provider.

This brings into stark relief one simple way to fix this: don't use a
caching metadata provider. This PR just raising the body of the
fingerprint-tables-for-db function to not include
`(qp.store/with-metadata-provider (u/the-id database)` . There is no
benefit to caching here as this is an enumeration of the database. It is
by design not meant to reuse anything. If we didn't OOM we would end up
with 200 tables and 200*900 = 180,000 fields in the cache, each of which
was accessed only once.

That is what this PR fixes.

I also followed one other thread: why are we holding so many
ResultSetMetaData objects in memory. This seems to come about from a
change in https://github.com/metabase/metabase/pull/62330 specifically
this line:
https://github.com/metabase/metabase/blob/master/src/metabase/lib_be/metadata/jvm.clj#L63

```clojure
(mu/defn instance->metadata
  "Convert a (presumably) Toucan 2 instance of an application database model with `snake_case` keys to a MLv2 style
  metadata instance with `:lib/type` and `kebab-case` keys."
  [instance      :- :map
   metadata-type :- :keyword]
  (let [normalize (if-let [schema (get metadata-type->schema metadata-type)]
                    (fn [instance]
                      (lib.normalize/normalize schema instance))
                    identity)]
    (-> instance
        (perf/update-keys memoized-kebab-key)
        (assoc :lib/type metadata-type)
        normalize
        u.snake-hating-map/snake-hating-map
        ;; the line below here captures the result coming back from
        ;; toucan and has a closure over
        ;; toucan2.jdbc.read/make-column-thunk which has a closure over
        ;; (.getMetaData rset)
        (vary-meta assoc :metabase/toucan-instance instance))))
```

As it stands without any changes, the instance gets quite unstable and
falls over. If you comment out the `var-meta` form above, the graph
returns to a very normal sawtooth graph of memory usage and
reclaimation. But central to this is that it does not need to retain any
of this memory at all. But without this metadata containing the instance
and db classes, we only cache the table and field data and the
fingerprinting can finish. When we cache this stuff and also
inadvertently keep these db classes, we quite quickly run out of
headroom and the instance becomes unstable and falls over.

* fix kondo lint (removes a legacy usage as well :) 💰

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-21 16:23:56 +00:00
github-automation-metabase
208e3124e0 🤖 backported "Transforms job runs keep trying other transforms if one fails." (#68316)
Transforms job runs keep trying other transforms if one fails. (#68141)

Previously, when running a transform job (e.g., daily), it would fail if a single transform in the run failed. This PR makes it so that the job continues to run transforms that don't depend on any failed transform. As previously, if any transform in the run fails, the job is marked as failed.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-01-21 10:04:40 -06:00
github-automation-metabase
5598b8fb2b 🤖 backported "Prevent exception in cleanup masking the original exception" (#68471)
Prevent exception in cleanup masking the original exception (#68371)

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-01-21 15:35:05 +00:00
Edward Paget
b1d8c28162 Fix: Actions attached to models inside of Library(synced collection) break remote sync (#68252) (#68428)
Fixes #68215

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Code[bot] <noreply@anthropic.com>
Co-authored-by: Ed Paget <ed@metabse.coma>
2026-01-21 08:11:43 -06:00
github-automation-metabase
10daca1705 🤖 backported "Remove linking between static and simple embedding settings when toggling guest embeds in Admin UI" (#68462)
Remove linking between static and simple embedding settings when toggling guest embeds in Admin UI (#68231)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-21 14:01:12 +00:00
Dan Stone
ddf5113f44 Remove ^:parallel meta for tests that search + hold locks (#68240) (#68464)
A recent change to search permissions queries in [#67055](https://github.com/metabase/metabase/pull/67055) will cause H2 to use SYS locks during search operations. This is because H2 uses temporary tables to implement CTE's, and their creation/dropping requires global locks.

This commit removes some ^:parallel meta in an attempt to avoid test
flakes due to lock timeout.

This change is a bit speculative:

- It is not 100% confirmed that parallel tests are the only problem (e.g. some background task might also hold a lock)
- The tests changed are based on a cursory scan for search tests that
  hold transactions (mt/with-temp). There may be other tests.

The impact of the CTE lock behaviour in production searches is likely
minimal because:

a. Search queries will typically run in auto commit sessions and so lock
lifetime will be short
b. concurrent multi-user deployments are most likely not on H2.

Should keep an eye on both tests and any reports in production of lock
timeout errors / slow searches when using H2.
2026-01-21 14:28:04 +01:00
github-automation-metabase
c0883dabf4 🤖 backported "Run codespell on schedule and auto-fix typos" (#68461)
Run `codespell` on schedule and auto-fix typos (#68444)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-21 11:28:01 +00:00
github-automation-metabase
b13c40dcd2 🤖 backported "Custom ref schema that reuses the cache" (#68457)
Custom ref schema that reuses the cache (#68379)

Add ref schema caching

Introduces a custom :ref IntoSchema that permits
reuse of Schema objects for references when safe to do so.

Early tests indicate a dramatic reduction in heap retention, after
loading a single dashboard, I see a 10x resident heap reduction from ~300MB to ~30MB.

It should also act as knot tie / runtime combinatorics limiter, so we should not see 'leaky' growth at runtime.

More work could be done as there are still _some_ gaps here.
- Bare pointers (keywords) can still lead to exponential allocation
- We do not cache when :documentation is present on the ref
  (as it would specialise the Schema object delivered for that specific reference)

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-01-21 11:19:54 +00:00
github-automation-metabase
0ab3cad804 🤖 backported "Enable codespell GitHub action for src folder" (#68304)
* Enable codespell GitHub action for `src` folder (#68213)

* Fix formatting

---------

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-21 12:16:03 +01:00
github-automation-metabase
138c32ef2b 🤖 backported "Fixed no-literal-metabase-strings eslint rule for export * from './MetabaseThing';" (#68454)
Fixed no-literal-metabase-strings eslint rule for `export * from './MetabaseThing';` (#68411)

fixed eslint custom rule

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-21 10:17:41 +00:00
github-automation-metabase
d829cb427b 🤖 backported "Contain layout for notebook preview" (#68451)
Contain layout for notebook preview (#68448)

* Contain layout for notebook preview

* Add repro for metabase#67903

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-21 08:52:29 +00:00
github-automation-metabase
156674cc87 🤖 backported "fix: "Connect to Slack" CTA remains visible after Slack is configured" (#68438)
fix: "Connect to Slack" CTA remains visible after Slack is configured (#68289)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-20 22:39:37 +00:00
github-automation-metabase
f240458ae1 🤖 backported "[Metabot] Bug fix - animation color for nlq loading state" (#68434)
[Metabot] Bug fix - animation color for nlq loading state (#68149)

fix animation color for nlq loading state

Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2026-01-20 21:33:16 +00:00
github-automation-metabase
fae2d4f3f8 🤖 backported "Add random query parameter for EmbedJS iframe src" (#68426)
feat(embed-js): Add a counter-like query parameter for EmbedJS iframe src to allow multiple iframes loading in parallel (#68420)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-20 19:34:56 +00:00
github-automation-metabase
f68b82cfb7 🤖 backported "UXW-2497 fix remote-sync flaky test" (#68416)
UXW-2497 fix remote-sync flaky test (#68368)

# Conflicts:
#	e2e/support/helpers/e2e-remote-sync-helpers.ts
#	e2e/test/scenarios/admin/remote-sync.cy.spec.ts

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-20 19:29:53 +03:00
github-automation-metabase
a0183f7a05 🤖 backported "docs - guest embed locked parameters" (#68421)
docs - guest embed locked parameters (#68293)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-20 15:57:09 +00:00
github-automation-metabase
ed69947170 🤖 backported "Fix tracking event never set to default in embed" (#68413)
Fix tracking event never set to default in embed (#68407)

* fix tracking event never set to default in embed

* added e2e

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-20 14:16:14 +00:00
github-automation-metabase
f6706967cd 🤖 backported "Show sensitive columns in the sandboxing UI" (#68367)
Show sensitive columns in the sandboxing UI (#66757)

* Show sensitive columns in the sandboxing UI

Closes #53378

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-01-20 17:10:01 +03:00
github-automation-metabase
46152d32b1 🤖 backported "fix: dropdown menu in create/edit record on database table" (#68259)
fix: dropdown menu in create/edit record on database table (#67807)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-20 13:42:26 +00:00
github-automation-metabase
cae120dc51 🤖 backported "MBQL lib test helpers" (#68400)
MBQL lib test helpers (#68168)

* Add test helper definition and implement joins

* Add support for fields clause

* Be explicit with types

* Pull out findJoinStrategy helper

* Pull out appenTestQueryStage

* Simplify helpers

* Move helper

* Allow disamiguating column name

* Fix rhs columns

* pull out createTestJoinClause

* Add filters

* Add aggregations

* Add breakouts

* Add expressions

* Add ordering

* Add limiting rows

* Make source optional

* Make provider the first argument

* Expand example in tests

* Automatically pick the base column if no table was specified

* Remove unused sourceMetadata argument where not needed

* Fix join metadata

* Improve types

* Add createNativeQuery and createNativeJsQuery helpers

* Use column groups to disambiguate instead of table name

* Test the results

* Deprecate createQuery

* Replace createQueryWithClauses with createTestQuery

* Add SAMPLE_PROVIDER

* Add helpers to build metadata provider

* Use displayName for groupName

* Remove raw mbql in test and replace it with Lib inspections

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-20 00:47:48 +00:00
github-automation-metabase
482d3d922d 🤖 backported "Use proper link in public powered by metabase footer link" (#68374)
Use proper link in public powered by metabase footer link (#68301)

* Use proper link in public powered by metabase footer link

* Fix tests

* Fix tests

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-19 18:21:04 +00:00
github-automation-metabase
4a226c73b4 🤖 backported "68048 missing bar label" (#68305)
* Fix missing labels for bar chart (#68299)

* Fix missing label for cartesian

* Add e2e tests

* Add comment

* Update Loki Snapshots

---------

Co-authored-by: Metabase Automation <github-automation@metabase.com>

* Add missing loki files

---------

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-19 16:07:10 +00:00
github-automation-metabase
c44b55ec89 🤖 backported "Report datetime insights even if columns is PK or FK" (#68358)
Report datetime insights even if columns is PK or FK (#67536)

Closes #35281

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-01-19 15:48:44 +00:00
github-automation-metabase
2dd7e98f92 🤖 backported "Use Soft/Weak references for malli cache entries" (#68339)
Use Soft/Weak references for malli cache entries (#68076)

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-01-19 15:16:58 +00:00
github-automation-metabase
34c6e8d86c 🤖 backported "docs: IAM for RDS" (#68351)
docs: IAM for RDS (#68349)

* Update IAM authentication details for RDS instances

Clarified the types of RDS instances that support IAM authentication.

* Update docs/databases/connections/aws-rds.md

* Update docs/databases/connections/aws-rds.md

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-19 14:22:35 +00:00
github-automation-metabase
bf0b3476a5 🤖 backported "Fix flaky assertion for "sdk iframe embedding fires ready event after iframe is loaded"" (#68345)
Fix flaky assertion for "sdk iframe embedding fires ready event after iframe is loaded" (#68336)

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-19 13:00:58 +00:00
github-automation-metabase
50ba384862 🤖 backported "UXW-46 Safari smart scalar truncation" (#68310)
UXW-46 Safari smart scalar truncation (#68248)

* UXW-46 refactor solution

* Update Loki Snapshots

* Fix typecheck

* Fix e2e

* Refactor to simpler solution

---------


# Conflicts:
#	.loki/reference/chrome_laptop_App_Embed_PublicOrEmbeddedQuestionView_Smart_Scalar_Dark_Theme.png
#	.loki/reference/chrome_laptop_App_Embed_PublicOrEmbeddedQuestionView_Smart_Scalar_Light_Theme.png

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-17 13:11:50 +03:00
github-automation-metabase
17a6925328 🤖 backported "Fix coercion for UNIX timestamp fields via implicit joins (#67704)" (#68313)
Fix coercion for UNIX timestamp fields via implicit joins (#68164)

Addresses #67704.

When a UNIX timestamp is accessed through an implicit join, the coercion to DateTime wasn't being applied. The `allow-casting?` check requires `pos-int?` on `::source-table` to apply coercion. For implicit joins, `::source-table` is set to a string, so it was being skipped.

Fix: in `add-alias-info/add-source-to-field-ref`, wet the flag `:qp/allow-coercion-for-columns-without-integer-qp.add.source-table`. I cribbed this approach from the SparkSQL driver, when it has to rewrite a numeric ID with a string.

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
2026-01-17 00:04:25 +00:00
github-automation-metabase
6dfd5b92b2 🤖 backported "Disable native sql validation" (#68277)
Native sql validation is a bit too unreliable for general deployment at the moment, so we are disabling it for check_* endpoints unless/until we can make it more reliable.

Co-authored-by: William <william@metabase.com>
Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-01-16 19:06:37 +00:00
github-automation-metabase
1c5a73a375 🤖 backported "Require free text for ui-bug and other feedback types" (#68295)
Require free text for ui-bug and other feedback types (#68234)

* Require free text for ui-bug and other feedback types

Add Yup validation to MetabotFeedbackModal that requires free text feedback when issue type is ui-bug or other. Issue types requiring free text are maintained in a constant array for easy extension.

* Address PR feedback: improve type safety and UX in feedback modal

- Replace 'as any' with proper TypeScript type assertion
- Fix type inconsistency between schema and initial value for issue_type
- Add dynamic label showing '(required)' when ui-bug or other is selected



* pr feedback

---------

Co-authored-by: Thomas Schmidt <thomas@metabase.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Sloan Sparger <sloansparger@gmail.com>
2026-01-16 18:17:02 +00:00
github-automation-metabase
54d4e39d2c 🤖 backported "Fix untranslated string in an alert modal" (#68291)
Fix untranslated string in an alert modal (#68287)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Joseph Adams <danielowenderefaka@gmail.com>
2026-01-16 17:36:25 +00:00
github-automation-metabase
eb7cd25703 🤖 backported "Manage table metadata allows syncing table" (#68284)
Manage table metadata allows syncing table (#67868)

This is the permission we're correctly checking with the below
`api/check-403` but by using `warehouses/get-database` (which, btw, has
the MOST confusing possible arguments I've ever seen) we were throwing a
403 if we didn't have read access to the whole database (which
checks *create-queries* perms on the entire database).

We still need to exclude mirror databases. In the medium term there
might be a better way to do this - maybe we could somehow have two
different models, so `(t2/select :model/Database)` would always exclude
mirror databases, while `(t2/select
:model/DatabaseIncludingMirrorDatabase)` would return them? I dunno.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-16 14:54:35 +00:00
github-automation-metabase
01b2c9daaa 🤖 backported "Fix perms checks for unarchiving collections" (#68178)
Fix perms checks for unarchiving collections (#67729)

* Fix perms checks for unarchiving collections

* use `can_restore` as single source of truth

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-16 14:48:46 +00:00
github-automation-metabase
afc45a4223 🤖 backported "fix(embed-js): adjust experience reset logic to avoid unexpected experience resets" (#68281)
fix(embed-js): adjust experience reset logic to avoid unexpected experience resets (#68273)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-16 13:49:16 +00:00
github-automation-metabase
bbaf280f47 🤖 backported "Hide 0 estimate row counts to avoid confusion" (#68270)
Hide 0 estimate row counts to avoid confusion (#68190)

Treats 0 n_live_tup as NULL, due to confusion reported when auto analyze
thresholds have not been met on a table.

To justify:
- You have a non-zero estimate (No change)
- A zero estimate but actually have rows (We now hide the estimate)
- A zero estimate and actually have zero rows (We now hide the estimate,
unfortunately)

This behaviour is considered on balance preferable to the behaviour now
where users will likely be confused, even thought we explicitly label
the field 'estimated'.

Other options considered that we might explore in the future:
- Forcing ANALYZE, e.g. on sync
- Bounded/LIMIT count
- Some policy based on last analyze timestamps
- Better tooltips or explaination on frontend

We should revisit in the future once we have a better idea for how
estimates should work across drivers (as its only postgres for now).

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-01-16 09:45:06 +00:00
github-automation-metabase
bcd2ae22ef 🤖 backported "Replace amalloy/ring-buffer dependency with already included CircularFifoQueue" (#68253)
Replace amalloy/ring-buffer dependency with already included CircularFifoQueue (#66007)

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-01-16 08:06:03 +00:00
github-automation-metabase
a40ff858fa 🤖 backported "Fix filters not closing properly on native SQL questions" (#68257)
Fix filters not closing properly on native SQL questions (#68216)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-15 21:41:31 +00:00
github-automation-metabase
a11a0aa705 🤖 backported "Fix EE Starter Edition Embedding Admin page visuals" (#68251)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-15 23:11:48 +04:00
github-automation-metabase
444566ac52 🤖 backported "UXW-136 Fix issue with bar viz on filtered column" (#68250)
UXW-136 Fix issue with bar viz on filtered column (#67573)

* UXW-136 Fix issue with bar viz on filtered column

* Review fixes

* Refactor solution

* Review fix

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-15 18:03:44 +00:00
github-automation-metabase
0ed73243f5 🤖 backported "Log error instead of warning if a subscription is not sent through the channel rather than a warning" (#68244)
Log error instead of warning if a subscription is not sent through the channel rather than a warning (#68214)

* Why is it a warning when it should be an error?

* Fix error logging format in notification worker

* Improve error logging in notification send process

Fix silly mistakes that I do when I'm sleepy

Co-authored-by: da <paoliniluis@gmail.com>
2026-01-15 17:15:07 +00:00
github-automation-metabase
fb364c3246 🤖 backported "docs- remove sample app" (#68239)
docs- remove sample app (#68235)

remove sample app

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-15 15:12:39 +00:00
github-automation-metabase
84e9631ca9 🤖 backported "note on slack notifications" (#68183)
merge

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-15 15:05:06 +00:00
github-automation-metabase
1415cc3a66 🤖 backported "Cleanup additional space to properly build Sample Apps" (#68232)
Cleanup additional space to properly build Sample Apps (#68229)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-15 13:54:45 +00:00
github-automation-metabase
acee2b5283 🤖 backported "Improve Metabot input and message scrolling UX" (#68223)
Improve Metabot input and message scrolling UX (#68117)


- Add max-height and vertical scrolling to input area
- Fix newline preservation in multi-line messages
- Add horizontal scrolling for wide code blocks in messages
- Style code blocks with proper background, border, and custom scrollbar
- Reduce code font size to 0.6875rem for better proportion
- Increase user message bubble width to 90%
- Add inline code styling with background and border

Co-authored-by: Thomas Schmidt <thomas@metabase.com>
2026-01-15 09:26:58 +00:00
github-automation-metabase
582ff0270e 🤖 backported "Increase verbosity in the caching middleware" (#68205)
Increase verbosity in the caching middleware (#68121)

* Increase verbosity in the caching middleware

* Fix linter

* Make it simpler

* Broke so many tests

* Make the linter happy

* Fix tests (going back to old implementation)

Co-authored-by: da <paoliniluis@gmail.com>
2026-01-14 22:03:31 +00:00
github-automation-metabase
cfda6bac53 🤖 backported "Remove embedding dev-related folders from Snyk" (#68211)
Remove embedding dev-related folders from Snyk (#68207)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-14 21:21:54 +00:00
github-automation-metabase
73ca985f57 🤖 backported "Cache Main App/Embed JS fonts" (#68202)
Cache Main App/Embed JS fonts (#68120)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-14 20:22:53 +00:00
Alexander Polyankin
4bd6fd02e2 Fix: Having : as a special character in the DB name breaks the UI for Clickhouse (#68013) 2026-01-14 17:14:42 +00:00
github-automation-metabase
64096645df 🤖 backported "Fix EmbedJS/SDK dashboard styles to properly display the EmbedJS branding footer" (#68191)
fix(embed-js): Fix EmbedJS/SDK dashboard styles to properly display the EmbedJS branding footer (#68090)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-14 16:44:07 +00:00
github-automation-metabase
d17ea7b418 🤖 backported "Fixes computing columns for Question -> Question -> Model on the FE" (#68185)
Fixes computing columns for Question -> Question -> Model on the FE (#68140)

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-01-14 15:41:59 +00:00
github-automation-metabase
c483dfed98 🤖 backported "Increase the unreturned cxn timeout for appdb" (#68175)
Increase the unreturned cxn timeout for appdb (#67571)

For the data warehouses we can safely set a fixed
unreturnedConnectionTimeout to a fairly low number (5 minute default)
because we also have a default maximum query length for data warehouses,
which can't be exceeded anywhere.

For the application DB though, this isn't safe, as operations against it
can legitimately hold connections for extended periods - for example,
dump-to-h2 on large databases streams data for as long as it takes to
copy all rows.

Bumping this to 1 hour by default (configurable via
`MB_APPLICATION_DB_UNRETURNED_CONNECTION_TIMEOUT`).

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-14 14:34:49 +00:00
github-automation-metabase
2bcf550883 🤖 backported "Fix flake in model test" (#68180)
Fix a broken model e2e test (#67499)

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-14 14:28:52 +00:00
github-automation-metabase
2bf33cd22c 🤖 backported "include API keys when copying DBs" (#68176)
include API keys when copying DBs (#67998)

[UXW-2690: Instance restored from a H2 snapshot is missing API keys](https://linear.app/metabase/issue/UXW-2690/instance-restored-from-a-h2-snapshot-is-missing-api-keys)

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-14 13:51:57 +00:00
github-automation-metabase
313a67a5fe 🤖 backported "Nicer error msg when trying to pull tenant colls" (#68177)
Nicer error msg when trying to pull tenant colls (#67948)

Previously if you tried to pull from a remote sync repository that
contained tenant collections you would get an incomprehensible error
that didn't explain what was wrong.

[EMB-1104: Update error message when trying to pull Tenant collections with Tenants turned off](https://linear.app/metabase/issue/EMB-1104/update-error-message-when-trying-to-pull-tenant-collections-with)

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-14 13:44:17 +00:00
github-automation-metabase
c7c87ada6b 🤖 backported "submit transform metering data to metering endpoint" (#67984)
submit transform metering data to metering endpoint (#67902)

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-01-14 11:57:26 +00:00
github-automation-metabase
ac776546c8 🤖 backported "Uxw 2596 color range on table crashes it if values span a large scale" (#68131)
Uxw 2596 color range on table crashes it if values span a large scale (#68022)

# Conflicts:
#	yarn.lock

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-01-14 11:07:50 +01:00
github-automation-metabase
2247b181ea 🤖 backported "Block official collections in shared collections and its subcollections" (#67879)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Phoomparin Mano <phoomparin@gmail.com>
2026-01-14 14:10:44 +07:00
github-automation-metabase
40646ac0cd 🤖 backported "simpler tests? you decide" (#68160)
simpler tests? you decide (#68144)

* simpler tests? you decide

* ignore discouraged var. just tests. don't need api docs

* avec-server -> with-server

originally there was another `with-server` and i didn't want to clobber
it until i was ready

* bit of cleanup

* cljfmt

* bit of linter appeasement

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-13 23:13:45 +00:00
github-automation-metabase
dab88589f9 🤖 backported "Fix typos in dev folder" (#68157)
Enable codespell for dev folder (#68124)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-13 22:32:41 +00:00
github-automation-metabase
d365676a67 🤖 backported "Admins see personal collections for tenant users" (#68150)
Admins see personal collections for tenant users (#67949)

* Admins see personal collections for tenant users

[EMB-1110: As an Admin, I want to be able to see personal collections of external users](https://linear.app/metabase/issue/EMB-1110/as-an-admin-i-want-to-be-able-to-see-personal-collections-of-external)

This was already implemented on the BE. Claude helped with the FE but I
think it seems reasonable.

* CR resp

* Remove pagination

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-13 22:03:19 +00:00
github-automation-metabase
62a365b09d 🤖 backported "Upgrade clickhouse to 0.9.5" (#68147)
Upgrade clickhouse to 0.9.5 (#67297)

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-13 22:02:07 +00:00
github-automation-metabase
e4b89f674d 🤖 backported "Fix nested & misused is in tests found by new kondo version" (#68146)
Fix nested & misused `is` in tests found by new kondo version (#67939)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-01-13 20:25:25 +00:00
github-automation-metabase
f650ea23e3 🤖 backported "UXW-2666 Row chart tooltip doesn't reflect column rename" (#68143)
UXW-2666 Row chart tooltip doesn't reflect column rename (#68137)

* fix: prefer title_text over display_name

* test: add dimension key unit spec

* refactor: rename to `columnTitle`

Co-authored-by: Gabriel Moreno <gabriel@metabase.com>
2026-01-13 19:08:32 +00:00
github-automation-metabase
bce8816f3c 🤖 backported "fix: don't unset remote-sync settings on api req" (#68132)
fix: don't unset remote-sync settings on api req (#67605)

* fix: don't unset remote-sync settings on api req

...if request is partial. Fixes an issue where the token could be unset
when switching between read-write and read-only modes.

* add debugging

* remove debugging

* fixup! handle extra collection

* fixup! update syntax

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-01-13 16:34:21 +00:00
github-automation-metabase
1b4080d463 🤖 backported "Fix public powered by metabase footer link" (#68126)
Fix public powered by metabase footer link (#68069)

* Fix public powered by metabase footer link

* Fix tests

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-13 15:27:10 +00:00
github-automation-metabase
808683fd86 🤖 backported "Enable codespell GH action for frontend" (#68122)
Enable codespell GH action for frontend (#68073)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-13 13:47:45 +00:00
github-automation-metabase
184999bc50 🤖 backported "Remove deprecated moveDnDKitElement helper" (#68119)
Remove deprecated `moveDnDKitElement` helper (#67604)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: metabase-bot[bot] <109303359+metabase-bot[bot]@users.noreply.github.com>
2026-01-13 13:25:57 +00:00
github-automation-metabase
da4778a7a4 🤖 backported "Disable regex lookaheads/lookbehinds for Snowflake driver" (#68093)
Disable regex lookaheads/lookbehinds for Snowflake driver (#68084)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-01-13 00:14:02 +00:00
github-automation-metabase
bf9e3cf701 🤖 backported "If the entity id is unknown when calling the export API, throw an error" (#68098)
If the entity id is unknown when calling the export API, throw an error (#68040)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-01-13 00:02:41 +00:00
github-automation-metabase
bb6442fbc5 🤖 backported "UXW-64 Fix table cell formatting for temporal breakout by week" (#68088)
UXW-64 Fix table cell formatting for temporal breakout by week (#67477)

* UXW-64 Fix table cell formatting for temporal breakout by week

* Review fixes

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-01-12 21:50:53 +00:00
github-automation-metabase
fe63f77f8c 🤖 backported "fix: text selection inside card embed when interacting with card embeds" (#68083)
fix: text selection inside card embed when interacting with card embeds (#67761)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-12 19:00:57 +00:00
github-automation-metabase
8a1544e6c0 🤖 backported "Fix funnel viz to handle increasing data" (#68081)
Fix funnel viz to handle increasing data (#68031)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-12 18:36:30 +00:00
github-automation-metabase
1d966f1396 🤖 backported "updating ClauseStep type, fixing segment and measure editors" (#67963)
updating ClauseStep type, fixing segment and measure editors (#67956)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-01-12 12:14:12 -04:00
github-automation-metabase
0976f56ca2 🤖 backported "fix: remote-sync origin url errors" (#68066)
fix: remote-sync origin url errors (#67594)

* fix: remote-sync origin url errors

Fixes issues where the tmp directory for the remote-sync repo can get
into a bad state where it doesn't have an origin URL. This calls a
function that explicitly sets our desired origin URL and updates all
calls to use the more specific :remote-url keyword rather than
inconsistently using :url vs :remote-url.

* Update git_test.clj

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-01-12 14:59:58 +00:00
github-automation-metabase
c0d04a547e 🤖 backported "docs: Update link to Metabase pricing page" (#68068)
docs: Update link to Metabase pricing page (#68067)

Update link to Metabase pricing page

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-12 14:41:45 +00:00
github-automation-metabase
864b49ae03 Auto-update documentation for release-x.58.x (#68054)
Update generated docs (release-x.58.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-01-12 09:35:00 -05:00
github-automation-metabase
6755cb40e5 🤖 backported "Add virtualized grid to collection list view for tenants" (#68064)
Add virtualized grid to collection list view for tenants (#67958)

Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-12 14:24:38 +00:00
github-automation-metabase
efb7a83033 🤖 backported "Index incremental filter column for OLTP databases" (#67847)
Index incremental filter column for OLTP databases (#66478)

* Add indexes to incremental checkpoint filter columns

* Fix bad barf

* Fix drop-index arg-list

* Less indirect supports test

* Comment on sync order

* Cleanup driver changelog entry

* Move changelog note back to 0.58 (backport)

* Fix passive voice

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-01-12 14:23:04 +00:00
github-automation-metabase
3ecdb41659 🤖 backported "Fix serialization in the presence of xray of usage analytics" (#67972)
Fix serialization in the presence of xray of usage analytics (#67848)

* feat: separate analytics vs non analytics escapes

* update callsite

* fix: descendant-ids requires coll models

* add test

* fix: nil safe

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-01-12 11:49:39 +00:00
github-automation-metabase
f948f076b0 fix(sdk): fix crashes on React 19 due to findDOMNode on Gauge and Modal (#67953) (#68058)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-12 10:30:28 +00:00
github-automation-metabase
46ab29e968 🤖 backported "chore: Fix safe typos in enterprise/ folder" (#67982)
* chore: Fix safe typos in enterprise/ folder (#67912)

* Fix frontend typo

---------

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-10 07:57:35 +01:00
github-automation-metabase
b31f1906f6 Fix sentence in JWT Identity Provider URI description (#68038) (#68039)
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-09 22:46:38 +00:00
github-automation-metabase
f924d7feb0 fix: limit can_run_adhoc_query hydration (#68028) (#68032)
We can't hydrate unbounded collections of cards with the
can_run_adhoc_query hydration since it linearly adds db queries to the
request. Users with > 10000k can have severe CPU/memory issues
processing this.

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-01-09 22:36:33 +00:00
github-automation-metabase
a420fbf064 fix: make sure we don't sync unchanged collections (#67795) (#68034)
* fix: make sure we don't sync unchanged collections

* fixup! bad test

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-01-09 22:30:19 +00:00
github-automation-metabase
3b5c370d37 QUE-2687 remove automatic selection of the first option in TemporalUnitDropdown. (#67598) (#68029)
Co-authored-by: Egor Grushin <egor@metabase.com>
2026-01-09 21:49:18 +00:00
github-automation-metabase
c806ee4b0b Enable codespell for modules/drivers (#68010) (#68026)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-09 20:44:44 +00:00
github-automation-metabase
3782c65f7a Fix frontend typos (#68003) (#68023)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-09 20:23:10 +00:00
github-automation-metabase
cd1d82cccf docs - fix translation docs (#68011) (#68027)
* fix translation docs

* comment

* sdk

* data

* cleanup

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-09 20:09:32 +00:00
github-automation-metabase
7fcb6731a9 Docs: AI exploration (#67859) (#68025)
* AI exploration section

* Optimized 2 images, saved 221.4 KB (51.0% smaller)

* fix the heading link

* Update docs/ai/metabot.md



* Update docs/ai/settings.md



* few edits

* typo

---------

Co-authored-by: Abed Habli <154609371+abdhabli@users.noreply.github.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-09 19:56:58 +00:00
github-automation-metabase
712cc75115 Fix typos in FE enterprise code translations (#67908) (#67916)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-09 20:33:35 +01:00
github-automation-metabase
176f1714fe Increase the viewport width for a flaky "data studio" e2e tests (#67901) (#67981)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-09 12:18:41 -07:00
github-automation-metabase
70bd4b8feb 🤖 backported "Typesafe c and bg props" (#68004)
* Typesafe `c` and `bg` props (#67899)

* most of the way there

* happy types, simpler themeColor function

* PR Feedback

* make editor buttons slightly less offensive

* final adjustments

* adjusting types

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-01-09 14:48:29 -04:00
github-automation-metabase
8db4dee438 Mention search in data picker docs (#67930) (#68018)
* Replace data picker image, add a line about search

* Optimized 1 images, saved -360 bytes (-1.1% smaller)

* Fix screenshot and description to talk about v58

* Incorporate bot suggestion

---------

Co-authored-by: Robert Kosara <rkosara@me.com>
2026-01-09 18:43:14 +00:00
github-automation-metabase
981363c75f docs: minor edits to tenants (#67961) (#68016)
* Fix heading level for multi-tenant strategy section

* Correct 'Admin setting' to 'Admin settings'

Updated references from 'Admin setting' to 'Admin settings' for consistency throughout the document.

* more edits

* typos

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-09 18:39:51 +00:00
github-automation-metabase
25ede8d131 plan callouts (#68014) (#68017)
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-09 18:39:41 +00:00
github-automation-metabase
ab84f1723e skip flaking loki bar chart spec (#67929) (#67936)
Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2026-01-09 17:58:09 +00:00
github-automation-metabase
0bc8b12bc6 docs(sdk): remove links to package changelog (#67997) (#68007)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-01-09 17:51:44 +00:00
github-automation-metabase
e1343374c4 fix: ellipsis breadcrumb shows gray background in Dark Mode (#67805) (#68000)
* fix: ellipsis breadcrumb shows gray background in Dark Mode

* refactor: use `metabase/ui` in `CollectionBreadcrumbs`

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-01-09 17:34:37 +00:00
github-automation-metabase
5e0d605170 Enable codespell for the enterprise folder (#67979) (#67999)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-09 17:29:05 +00:00
github-automation-metabase
79d5c0d4bc feat(embed-js): Change guest embeds disabled tooltip to display a link to admin settings (#67925) (#67996)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-09 17:10:42 +00:00
github-automation-metabase
0ee3e33a61 Add a tooltip message if model persistence is unsupported for a database (#67566) (#67827)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-09 16:52:05 +00:00
github-automation-metabase
7e65036be6 Use source alias for breakout with implicit join (#67480) (#67919)
* use source alias if we have a fk-field-id

* try only on single stages

* try to identify implicit joins

* try fix

* Clean up

* move test and test all drivers

* move test

* only test drivers with left join feature

* adjust length for certain drivers

* smaller for mysql

* fix starts-with filter

* improve test

* case insensitive filter for h2

* move let bindings up

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-09 16:38:35 +00:00
github-automation-metabase
7f07244f9a Allow passing arrays of string as sqlInitialParameters in InteractiveQuestion (#67282) (#67992)
* Allow passing arrays of string as sqlInitialParameters in InteractiveQuestion

* nit

* better assertion

* pass all initial sql params as is

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-09 16:37:17 +00:00
github-automation-metabase
cfd14e0db1 fix: make dashboard header use container queries to respond to metabot (#67376) (#67994)
* fix: make dashboard header use container query

* use named container everywhere

* fix syntax

* rename and extract to other class

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-01-09 16:33:54 +00:00
github-automation-metabase
23afcd677e Update llms.txt and llms-full.txt (release-x.58.x) (#67991)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Actions <actions@github.com>
2026-01-09 15:55:59 +00:00
github-automation-metabase
94af114408 docs - embedding browser options (#67957) (#67985)
* browser params

* array options

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-09 15:14:58 +00:00
github-automation-metabase
333475ab8b GIT-8461 hide "Visualize another way" button for Sankey charts (#67753) (#67962)
Co-authored-by: Egor Grushin <egor@metabase.com>
2026-01-09 00:21:25 +00:00
github-automation-metabase
503191e176 Add documentation button to tenants list page (#67884) (#67959)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-08 23:37:56 +00:00
github-automation-metabase
d53c1d347a 🤖 backported "Color Key Cleanup" (#67889)
* Color Key Cleanup

* catching old color keys

* Update Loki Snapshots

---------

Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-01-08 19:00:45 -04:00
github-automation-metabase
9d68441cdf fix flake unit test (#67942) (#67954)
Co-authored-by: Egor Grushin <egor@metabase.com>
2026-01-08 22:30:08 +00:00
kevinkelleher12
672c84308b Fix search links for actions and segments (#67915) 2026-01-08 21:30:19 +00:00
github-automation-metabase
6eef92192b [QP] Reject fuzzy match of join condition LHS to that join's RHS (#67804) (#67943)
Fixes #67667.

`lib.equality` has logic to do "fuzzy" matching of field refs with
the corresponding columns. This logic exists to support somewhat
malformed older queries with impoverished field refs. Refs in healthy
recent queries are fully specified and there's nothing ambiguous to
required the fuzzy matching.

The bug #67667 caught a case where this fuzzy matching could find a
column with the same name on the RHS of a join, if the original target
column has disappeared from an upstream query.

This change causes the QP to fail in exactly this case: when a would-be
LHS ref in a join condition ends up pointing at the RHS of the same
join. That would produce a strange join condition like
`LEFT JOIN Orders ON Orders.ID = Orders.PRODUCT_ID`
which produces incoherent results, and could result in a very costly
Cartesian join.

This is a user-level error, since the query is broken and needs repair.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-01-08 20:01:13 +00:00
github-automation-metabase
9509a192c5 Provide Cypress env (CI) for the support file (#67934) (#67941)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-08 19:33:57 +00:00
github-automation-metabase
dcc0857c05 Fix typo in a group membership endpoint (#67923) (#67938)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-08 19:13:19 +00:00
github-automation-metabase
9142ccd068 Readded fk field ids to v_content's fk fields (#67867) (#67928)
Basically, the issue is that trying to implicit join using the instance analytics content model's made_public_by_user field made qp throw an error. The underlying problem is that the field in question wasn't defined as a foreign key, even though the model's result metadata claimed it was a foreign key. Updating the field to actually be a foreign key fixed the problem. This also applies to the content model's question_database_id field, which was also fixed.

Co-authored-by: William <william@metabase.com>
2026-01-08 17:33:20 +00:00
github-automation-metabase
94cc33c19b Fix typos in Metabot code (#67918) (#67926)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-08 17:03:52 +00:00
github-automation-metabase
51eb983f60 Fix typo in test metadata (#67909) (#67921)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-08 15:12:18 +00:00
github-automation-metabase
346fa4aa05 docs(sdk): Update Readme version references and published npm version to 0.58.0 (#67913) 2026-01-08 14:19:59 +00:00
github-automation-metabase
6926d0ed4e Fix flaky "shows a static dashboard using drills" e2e (#67874) (#67910)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-08 13:56:56 +00:00
github-automation-metabase
5c1e233360 fix(embed-js, sdk): Properly handle restricted collection access in MetabaseBrowser (#67523) (#67906)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-08 13:22:49 +00:00
github-automation-metabase
b4cb1c55b5 Reroute admin/tenants to admin/people/tenants (#67869) (#67904)
Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-08 13:15:31 +00:00
Nicolò Pretto
0b34521c4b chore(sdk): checklist steps for 58 release on the release 58 branch (#67857)
* chore(sdk): updates as per the sdk checklist on the release-58 branch

* Update .github/workflows/release-embedding-sdk.yml
2026-01-08 14:10:53 +01:00
github-automation-metabase
ca6da001b9 Remove static llms.txt and embedding/llms.txt (#67878) (#67905)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2026-01-08 12:52:22 +00:00
github-automation-metabase
3f6b0790dd Add transform metrics to anonymous stats ping (#67786) (#67797)
* feat: add transforms metrics

* feat: send transform metrics

* fix: don't require transforms feature, we send stats if we disabled the feature

* add tests

* fix: ee test

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-01-08 12:36:42 +00:00
github-automation-metabase
f6d76760d2 Fix logging messages for field values updates (#66767) (#67875)
We're logging "Field Field xxx xxxx". I'm just simplifying that log line

Co-authored-by: da <paoliniluis@gmail.com>
2026-01-08 12:35:59 +00:00
github-automation-metabase
733a4f876f fix(SDK, Embed JS): Hide Static Question topbar from DOM when no children rendered (#67852) (#67898)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-08 11:16:28 +00:00
github-automation-metabase
650cb8abd1 chore(sdk): move setting cypress baseUrl to global beforeEach for sdk tests (#66308) (#67546)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-01-08 10:38:06 +00:00
github-automation-metabase
c763638b25 Use formatting settings for date parameters (#67713) (#67895)
* Use instance settings for date filters in parameters

* Fix test instance to use default time format

* Add unit tests for date paramater formatting with custom settings

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-08 04:05:06 +00:00
github-automation-metabase
9c8636136f Update generated docs (release-x.58.x) (#67894)
Co-authored-by: github-actions <github-actions@github.com>
2026-01-07 21:49:42 -05:00
github-automation-metabase
e54d946007 Allow to overwrite id only for native models (#67773) (#67888)
Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-01-08 01:26:40 +00:00
github-automation-metabase
94bd9d066f Add tooltip to run button when field filters are missing a target field in Native editor (#67670) (#67882)
* Add e2e test for missing field mapping

* Make validateTemplateTags public

* Render errors in run button tooltip

* Pass errors to run button

* Fix selector in test

* Simplify test

* Try with realClick

* Add Lib implementation of validateTemplateTags

* Also validate display-name

* Use Lib implementation of validateTemplateTags

* Localize error messages

* fixup! Add Lib implementation of validateTemplateTags

* Add Lib.ValidationError type

* Remove unused code

* Also validate temporal-units dimension

* Use validate-template-tags in can-run

* Add tag-name to template tag errors

* Fix malli types

* Add tests for validate-template-tags

* Add tooltip to save button too

* Also test time grouping and save button

* Remove more unused code

* Remove simple wrapper

* Use cond-> pattern instead of filter identity

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-08 00:08:18 +00:00
github-automation-metabase
32b6e125c6 UXW-49 fixing log scale axis value (#67668) (#67885)
Use a linear scale for values between 0 and 1, and a logarithmic scale for values greater than 1.

Co-authored-by: Egor Grushin <egor@metabase.com>
2026-01-07 23:36:05 +00:00
github-automation-metabase
1e17dac385 fix typo (#67863) (#67876)
Co-authored-by: Riley Thompson <riley@metabase.com>
2026-01-07 23:01:03 +00:00
github-automation-metabase
5d65943889 Remove openapi.json from repo and disable CI check (#67294) (#67355)
Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Stas Gavrylov <stasgavrylov@gmail.com>
Co-authored-by: Stas Gavrylov <stas@metabase.com>
2026-01-07 21:00:15 +00:00
github-automation-metabase
ed5b8a9600 Fill line series symbol with appropriate color in dark mode (#67811) (#67871)
Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-07 19:32:25 +00:00
github-automation-metabase
81d77e3413 Fix dark text on dark verification tooltip background in light mode (#67799) (#67864)
Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-01-07 18:00:58 +00:00
github-automation-metabase
02ce4fc023 airgap token check user creation fix (#66770) (#67484)
Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-07 17:49:56 +00:00
github-automation-metabase
c42ac2aac2 Make stacked row chart tooltips use custom display names (#67706) (#67856)
* Make stacked row chart tooltips use custom display names

* Change the way we override seriesName with custom title

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-01-07 16:00:34 +00:00
github-automation-metabase
d7cbb20436 Bump Storybook to 8.6.15 (#67473) (#67853)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-07 15:36:20 +00:00
github-automation-metabase
c747a8b193 perms for moving collections with archived kids (#67728) (#67792)
Previously if you had:

```
A (curate)
  B (curate)
    C (no permissions)
      D (curate)
```

Then if C was archived, you would be unable to move or archive A or
B.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-01-07 13:48:41 +00:00
github-automation-metabase
e8a60fd531 Test coercion strategy (#67496) (#67836)
* Also test coerced datetime column

* Add e2e reproduction for opening the datetime filter for coerced fields

* Also check :effective-type in original-isa

* Fix test

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-01-07 02:00:52 +00:00
github-automation-metabase
fedd87b424 Update translations 2026-01-06 (#67800) (#67835)
* Update translation sources 2026-01-06

* Update translations

---------

Co-authored-by: github-actions <github-actions@github.com>
2026-01-07 01:01:08 +00:00
github-automation-metabase
342b9ddf67 Fix dependency graph zoom controls colors in dark mode (#67774) (#67829)
* Fix dependency graph zoom controls colors in dark mode

* Do not use :global

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-01-07 00:52:02 +00:00
github-automation-metabase
693fb67667 docs: Add redirect for interactive embedding quickstart guide (#67833) (#67834)
* Add redirect for interactive embedding quickstart guide

* Add redirect for quick-start guide

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-06 23:54:31 +00:00
github-automation-metabase
7b94c0fbdc [Metabot] Split up metabot.unit.spec.tsx (#67764) (#67824)
* init pass at adding an error boundary to metabot

* update the illustration used for error boundary and remove simulated error ui

* add unit tests

* split up the mega metabot.unit.spec.tsx unit test file

* fix lint

Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2026-01-06 21:30:38 +00:00
github-automation-metabase
c582f57adf Update generated docs (release-x.58.x) (#67822)
Co-authored-by: github-actions <github-actions@github.com>
2026-01-06 14:52:07 -05:00
github-automation-metabase
65de276f1a docs: remove temp tenants docs (#67819) (#67821)
* remove temp tenants

* jwt

* more link

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-06 19:46:01 +00:00
github-automation-metabase
8047bd26ef docs - note on subscriptions (#67816) (#67818)
* note on subscriptions

* typo

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-06 19:00:03 +00:00
github-automation-metabase
b2a476dbbe docs: tenants (#67474) (#67817)
* tenants

* Apply suggestions from code review



* links

* add links and images and edit remote sync

* links

* one more link

* Optimized 12 images, saved 930.1 KB (47.9% smaller)

* Apply suggestions from code review



* edits

---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-01-06 18:53:49 +00:00
github-automation-metabase
8e77833b3b documents oss (#67810) (#67813)
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-06 18:21:42 +00:00
github-automation-metabase
0491cc002f remove transforms once again (#67809) (#67812)
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-06 18:21:38 +00:00
github-automation-metabase
2110e8c8d0 [Metabot] Metabot error boundary (#67749) (#67802)
Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2026-01-06 17:44:45 +00:00
github-automation-metabase
4d97aef6ba add all .env file except .env.example to gitignore (#67793) (#67806)
Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-01-06 17:36:16 +00:00
github-automation-metabase
dafb834464 Fix pie chart label not visible on dark theme (#67639) (#67790)
* Fix `text-secondary` not working on dark theme on charts

* Support all colors so it's easier to reason about

* Add tests

* Fix type error

* Revert part of the code that's not used anymore

* Add test snapshots

* Make overriding font more consistency across environments

e.g. From storybook to SDK to the main app.

* Fix formatting

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-01-06 13:08:57 +00:00
github-automation-metabase
a7a12d0bee Fix MB in an iframe running on a subpath (#67724) (#67787)
* fix MB in an iframe running on a subpath

* fix

* extracted out the util fn and added unit tests for it

* addressed comments

* fixed unit tests

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-01-06 13:02:26 +00:00
Nemanja Glumac
7fbf305894 Update translations 2026-01-06 (#67782) (#67783)
* Update translation sources 2026-01-06

* Update translations

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
2026-01-06 12:37:31 +01:00
github-automation-metabase
ba500320c7 [dashboards] Handle parallel FKs with dashboard filter values (#66287) (#67661)
Fixes #65838.

This issue was about dashboard filters showing the wrong value when
the filter was bound to an FK field from a table with multiple FKs to
the same foreign table. The dashboard parameters logic on the BE was
choosing which FK to use for the filter values arbitrarily, meaning that
binding the filter to one of them would work fine, but the other would
give incoherent results.

The fix is to be deliberate about selecting the parameter's column. That
doesn't solve all ambiguous cases, but we really can't help if there's
a multi-hop join that has parallel edges in the middle!

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-01-06 10:17:46 +01:00
github-automation-metabase
87c1bbdc50 Upgrade jspdf (#67760) (#67777)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-01-06 08:36:03 +00:00
github-automation-metabase
fbb8d252f6 specify gauge label sizes in px (#67386) (#67692)
Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-01-05 23:46:47 +00:00
github-automation-metabase
d37203ae22 Fix parsing of :ERROR chunks in metabase-enterprise.metabot-v3.util/aisdk->messages (#67674) (#67757)
* Fix parsing of :ERROR chunks in metabase-enterprise.metabot-v3.util/aisdk->messages

There was a typo in the case expr where :ERROR chunks were being handled like :DATA chunks, but in fact should be
handled like :TEXT chunks. This was resulting in an error like

    1. Unhandled java.lang.ClassCastException
       class java.lang.String cannot be cast to class
       clojure.lang.Associative (java.lang.String is in module java.base
       of loader 'bootstrap'; clojure.lang.Associative is in unnamed
       module of loader 'app')
                       RT.java:  847  clojure.lang.RT/assoc
                      core.clj:  193  clojure.core/assoc
                      core.clj:  192  clojure.core/assoc
                      util.clj:   56  metabase-enterprise.metabot-v3.util/aisdk->messages/fn/fn
                      ...

whenever an :ERROR chunk was encountered as we tried to ASSOC a string where we were expecting a map.

https://v4.ai-sdk.dev/docs/ai-sdk-ui/stream-protocol#text-part
https://v4.ai-sdk.dev/docs/ai-sdk-ui/stream-protocol#error-part

059d904d6e/ai_service/ai_sdk.py (L50)
059d904d6e/ai_service/ai_sdk.py (L203)
059d904d6e/ai_service/ai_sdk.py (L324)

* Add some error chunk parsing tests to aisdk-line-parse-test

* Mark aisdk-line-parse-test as ^:parallel

This does io to read some files, but should be threadsafe as no other tests read or modify those files.

* Add make-mock-error-stream-response test util

And rename make-mock-stream-response to make-mock-text-stream-response

* Add client-error-test to test streaming-request with error chunks in response

Co-authored-by: appleby <86076+appleby@users.noreply.github.com>
2026-01-05 23:00:37 +00:00
github-automation-metabase
0bfaf6af31 fix saved question intro modal layout (#67703) (#67759)
Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2026-01-05 21:58:36 +00:00
github-automation-metabase
268863194c Clarify permissions model for suggested prompts generation (#67656) (#67739)
* Run suggested prompts generator as admin & fix test

* Add a prompt suggestions GET perms test

* small cleanups

* use mbql5

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-01-05 20:16:42 +00:00
github-automation-metabase
e365c5aeaf [Metabot] Update Metabot icon (#67741) (#67750)
Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2026-01-05 20:06:13 +00:00
github-automation-metabase
2ed0ffb2d6 Patch malli to avoid OOM related to recursive memoization (#67733) (#67742)
This is a temporary fix until https://github.com/metosin/malli/pull/1250 gets merged into Malli.

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-01-05 19:36:25 +00:00
github-automation-metabase
62588151e8 Handle unroutable token checks (#67698) (#67734)
We have a grace periods and circuit breakers for token checks. But one
issue is that if the token check doesn't throw an error we can't catch
it.

An easy way to see this is to use a local network address that won't
respond like 192.168.random.random (i used 192.168.40.40) then see the
behavior. Without the timeouts, the threads all just get stuck here and
the page never loads. With timeouts, you'll see a few stutters until the
circuit breaker steps in, at which point you have a non-enterprise
version.

https://www.loom.com/share/6ae056dc126b48c9abe8a7ad9366fd05

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-05 19:16:50 +00:00
github-automation-metabase
ce53241a0b try to fix flake in semantic index dlq tests (#67700) (#67726)
Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-01-05 14:36:35 +00:00
github-automation-metabase
5da26b6881 bumping deps: (#67638) (#67643)
- https://github.com/metabase/metabase/security/code-scanning/543
  about snowflake's of grpc netty shaded. We already have this
  version elsewhere so now it matches
- https://github.com/metabase/metabase/security/code-scanning/549
  and https://github.com/metabase/metabase/security/code-scanning/557
  issue in databricks. We bumped that and now it uses the new coordinate
  `at.yawk.lz4/lz4-java 1.10.1`
- https://github.com/metabase/metabase/security/code-scanning/496 bump commons-lang3.
  actually just exclude it from the driver jar so it will be found on parent
  classpath with coordinate from deps.edn: `{:mvn/version "3.19.0"}`

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-01-05 14:20:04 +00:00
github-automation-metabase
564dffaf3b Don't close InteractiveQuestion editor on Filters change (#67517) (#67722)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-01-05 13:48:33 +00:00
github-automation-metabase
5fb46c07ee Measure all columns to provide expand option (#67429) (#67508)
Co-authored-by: Fraser <fraser@metabase.com>
2026-01-05 23:22:09 +13:00
github-automation-metabase
7b6fcb1069 Don't show metrics in the join step (#67490) (#67693)
Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-01-02 17:35:47 +00:00
github-automation-metabase
b5927af992 Adding e2e repro for drill through entity keys (#67467) (#67691)
Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-01-02 17:27:51 +00:00
github-automation-metabase
7e6b56a743 fix: broken date filter test (#67684) (#67688)
Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-01-02 16:22:28 +00:00
github-automation-metabase
78c813bf08 Improve formatting and clarity in serialization.md (#67587) (#67689)
Updated curl command formatting and clarified instructions for exporting and importing Metabase data.

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-01-02 15:43:31 +00:00
github-automation-metabase
b502579ad7 Extra remapped fields (#67601) (#67663)
* kick ci

* Disable remaps when calculating columns for a query.

* Add tests for result_metadata remappings

* Add comments

* Whitespace

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-31 20:14:19 +00:00
github-automation-metabase
b15beb846d fix zoom resets on resize (#67420) (#67649)
Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2025-12-30 23:11:03 -05:00
github-automation-metabase
04cdda021d series limit for row chart (#67419) (#67657)
Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2025-12-31 01:44:07 +00:00
github-automation-metabase
d5dc421476 Avoid joins of remote_sync_object with actual tables (#67042) (#67654)
Co-authored-by: Nathan Voxland <nathan@metabase.com>
2025-12-30 22:18:49 +00:00
github-automation-metabase
15bbb785bf Simpler fix than first attempt. (#67300) (#67651)
Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
2025-12-30 20:50:18 +00:00
github-automation-metabase
e28326bbbd UXW-2586: Acquire locks before changing data permissions (#67201) (#67635)
* Acquire locks before changing data permissions

Data permission have a read-modify-write cycle:

- we read the existing permissions to see what's currently set
- then we decide what to do (e.g. delete the existing DB level
  permissions to write a granular table-level permission)
- then we do the write

This has a race condition if multiple Metabase instances are modifying
permissions at the same time.

For example, say we have:

Initial state: `{:db_id 1 :table_id nil :perm_value :unrestricted}`

Instance A: set table 1 to :blocked
Instance B: set database to :blocked

T1: A reads state, sees db-level permission, plans to expand to table-level
T2: B reads state, sees db-level permission, plans to replace it
T3: A deletes db-level, inserts table-level rows for all tables
T4: B deletes db-level (no-op), inserts new db-level :blocked

Result (CORRUPT):
```
{:db_id 1 :table_id 1 :perm_value :blocked}      ;; from A
{:db_id 1 :table_id 2 :perm_value :unrestricted} ;; from A
{:db_id 1 :table_id nil :perm_value :blocked}    ;; from B
```

Both db-level AND table-level permissions now exist.

For the permissions API, we take a cluster lock, but sync operations
bypassed this cluster lock. This PR creates a lower-level cluster lock
per `[database, group, perm-type]` so only one instance/thread can do
the read/decide/write cycle for a particular db/group/perm at a time.

* Add a test for race conditions setting data perms

This took a while before I was able to track down the fact that using
`(mt/with-temp )` caused both threads to share the same connection, so
they could obtain the lock simultaneously 🤦

* Use a slightly coarser lock

I realized that if an instance has a huge number of groups, we'll obtain
a lock and ask Postgres to maintain an active savepoint for each group,
which might be untenable.

I think the best solution here is to use slightly coarser locks. This
might increase contention slightly, since we won't be able to change
permissions for `db 1, group 1, perm type view-data` at the same time
that we change permissions for `db 1, group 2, perm type view-data`. But
I think the tradeoff here is necessary.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-12-30 14:26:53 +00:00
github-automation-metabase
aa77fce3f6 Fix empty cards with no results making dashboard longer than expected (#67581) (#67632)
* Prevent unnecessary height calculation

* Prioritize local layout from `react-grid-layout` for height calculation

* Refix the issue for real

* Add tests

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-30 13:26:33 +00:00
github-automation-metabase
0e1ce45d6f fix: hide editing toggle for unsupported engines (#67564) (#67628)
* fix: hide untested and unsupported db engines in table editing section

* move allowed engines to constants file

* test: add hidden editing toggle test case

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-30 11:39:18 +00:00
github-automation-metabase
efcf30e0ec E2E workflows env vars cleanup (#66592) (#67625)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-30 10:37:03 +00:00
github-automation-metabase
3e10af0b27 feat: allow setting custom y axis range, even if points are outside of the range (#67533) (#67624)
* feat: allow setting custom y axis range, even if points are outside of the range

* fix: adjust Waterfall null x value loki screenshot test

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-30 08:54:11 +00:00
github-automation-metabase
03ee0bec47 UXW-2597 fix row bar charts' tooltip (#67617) (#67619)
* UXW-2597 fix Row Bar tooltip data error

Co-authored-by: Egor Grushin <egor@metabase.com>
2025-12-30 02:14:09 +00:00
github-automation-metabase
49f8dd0d64 UXW-69 Avoid persisting non-dashboard settings (#67592) (#67615)
* fix: avoid persisting settings that are hidden from dashboard UI

* test: add `sanitizeDashcardSettings` unit spec

* refactor: use `_.pick` for sanitizing dashcard settings

Co-authored-by: Gabriel Moreno <gabriel@metabase.com>
2025-12-29 23:42:21 +00:00
github-automation-metabase
d017bc0f5b fix perf/mapv to handle infinite and large lazy sequences (#66984) (#67614)
Co-authored-by: bryan <bryan.maass@gmail.com>
2025-12-29 23:36:26 +00:00
github-automation-metabase
1d53db91df Normalize aggregation references, sort maps and remove all uuids (#67521) (#67610)
* Normalize aggregation references, sort maps and remove all uuids

Fixes QUE-2916

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-12-29 23:25:38 +00:00
github-automation-metabase
b83aea452b Re-introduce: Upload failed e2e test artifacts for quarantined tests (#67600) (#67606)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-29 21:50:04 +00:00
github-automation-metabase
39f2cb3b1d our analytics strikes again (#66909) (#67602)
Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2025-12-29 20:41:34 +00:00
github-automation-metabase
2dfb1ede25 Reinforce 'rename column' e2e helper (#67539) (#67548)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-29 20:53:42 +01:00
github-automation-metabase
a75fbdbc2d fix: user's input is overwritten by async form reinitializations (#67525) (#67595)
Co-authored-by: Egor Grushin <egor@metabase.com>
2025-12-29 19:09:12 +00:00
github-automation-metabase
7c5a4473b2 Fix pie chart flickering when toggling legend / Convert ChartWithLegend to ts (#67240) (#67593)
* Fix pie chart flickering on toggling legend / Convert ChartWithLegend to ts

* Convert test to ts

* Resolve flickering when toggling visualization config sidebar

* Fix regression with map chart (only apply svg centralization to pie charts)

* Apply PieChartContainer classname to inner component

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2025-12-29 18:21:42 +00:00
github-automation-metabase
09b75e6678 Default to base-type when it differs from effective type (#67486) (#67590)
* Default to base-type when it differs from effective type

* Make 'er parallel

* Does this clause make it better?

* Remove parallel.

* New test and fix for two literals

* Use y-type for effective type

* Update test to try number

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-29 18:12:42 +00:00
github-automation-metabase
28586d60a0 Hopeful fix for the ooms that betterment is running into. (#67482) (#67588)
* Hopeful fix for the ooms that betterment is running into.

Note that this will only work once macaw is updated and metabase is using the new version of macaw.  Until that
happens, this change is a noop.

* bump macaw for context stripping

https://github.com/metabase/macaw/pull/123

here's the gist:

```clojure
core-test=> (let [base {:select [:a :b :c]
                        :from   [:foo]
                        :where  [:= :foo.a [:inline "baz"]]}]
              (-> {:union-all (for [_ (range 3)]
                                base)}
                  sql/format
                  first
                  (components {:strip-contexts? true})
                  :columns
                  ))
                  ;; replacing #{} with <set> so git doens't comment it out
<set>{{:component {:table "foo", :column "a"}}
  {:component {:table "foo", :column "b"}}
  {:component {:table "foo", :column "c"}}}
core-test=> (let [base {:select [:a :b :c]
                        :from   [:foo]
                        :where  [:= :foo.a [:inline "baz"]]}]
              (-> {:union-all (for [_ (range 3)]
                                base)}
                  sql/format
                  first
                  (components )
                  :columns
                  ))
                  ;; replacing #{} with <set> so git doesn't comment it out
 <set>{{:component {:table "foo", :column "b"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x4de719cd "com.metabase.macaw.AstWalker$ScopeInstance@4de719cd"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x76f86e4f "com.metabase.macaw.AstWalker$ScopeInstance@76f86e4f"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "c"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "b"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x1241e96a "com.metabase.macaw.AstWalker$ScopeInstance@1241e96a"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x542edf1d "com.metabase.macaw.AstWalker$ScopeInstance@542edf1d"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x2e474cfd "com.metabase.macaw.AstWalker$ScopeInstance@2e474cfd"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "b"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x459ed576 "com.metabase.macaw.AstWalker$ScopeInstance@459ed576"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x38a0b358 "com.metabase.macaw.AstWalker$ScopeInstance@38a0b358"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x1241e96a "com.metabase.macaw.AstWalker$ScopeInstance@1241e96a"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "c"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "a"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x1241e96a "com.metabase.macaw.AstWalker$ScopeInstance@1241e96a"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}
  {:component {:table "foo", :column "c"},
   :context
   (#object[com.metabase.macaw.AstWalker$ScopeInstance 0x1241e96a "com.metabase.macaw.AstWalker$ScopeInstance@1241e96a"]
    #object[com.metabase.m
acaw.AstWalker$ScopeInstance 0x6343d805 "com.metabase.macaw.AstWalker$ScopeInstance@6343d805"]
    #object[com.metabase.macaw.AstWalker$ScopeInstance 0x761965fc
    "com.metabase.macaw.AstWalker$ScopeInstance@761965fc"])}}
```

---------

Co-authored-by: William <william@metabase.com>
Co-authored-by: dan sutton <dan@dpsutton.com>
2025-12-29 17:24:36 +00:00
github-automation-metabase
614f6bf521 docs: fix enable tenant string (#67195) (#67585)
Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2025-12-29 16:24:12 +00:00
github-automation-metabase
f1af011f5e Revert "Upload failed e2e test artifacts for quarantined tests (#67381)" (#67582) (#67583)
This reverts commit 487036f0b1.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-29 13:28:20 +00:00
github-automation-metabase
b20cf8c133 fix: custom home page settings are not being exported (#67550) (#67578)
* fix: custom home page settings are not being exported

* fix: update seralization baseline test

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-29 10:02:47 +00:00
github-automation-metabase
722c6bc18d Add hour to redshift test schema prefix for more aggressive cleanup (#67215) (#67567)
Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 19:49:03 +00:00
github-automation-metabase
21e1f6c88e docs: improve .env.example docs (#67545) (#67563)
* docs: improve .env.example docs

* docs: fix numbering and comment out default value env var

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-26 15:04:21 +00:00
github-automation-metabase
c296807a14 bump log4j (#67393) (#67561)
* bump log4j

* bump snowflake in hope of clearing advisory

https://github.com/metabase/metabase/security/code-scanning/543

> This file introduces a vulnerable io.grpc:grpc-netty-shaded package
> with a high severity vulnerability.

* bump netty shaded

https://github.com/metabase/metabase/security/code-scanning/543

* bump aws s3 for io.netty:netty-codec-http2

https://github.com/metabase/metabase/security/code-scanning/536

before bump:
    . io.netty/netty-codec-http2 4.1.126.Final

after dump:
❯ clj -X:deps tree :extra '{:deps {software.amazon.awssdk/s3 {:mvn/version "2.40.13"}}}' | grep http2
    . io.netty/netty-codec-http2 4.1.130.Final

* bump netty-codec-http

from software.amazon.awssdk/s3

before:
    . io.netty/netty-codec-http 4.1.126.Final

https://github.com/metabase/metabase/security/code-scanning/534

* bump athena to 3.7.0

ran workflow at
https://github.com/metabase/metabase/actions/runs/20439789522/job/58729767910

https://github.com/metabase/metabase/actions/workflows/athena.yml to
publish the 3.7.0 version

* include driver change to force running drivers

* sort deps edn

* attempt to solve l4z issues

weirdness is that this version might move some stuff? we'll see if it
works.

* Revert "attempt to solve l4z issues"

This reverts commit 03d845eeea.

Co-authored-by: dpsutton <dan@dpsutton.com>
2025-12-26 14:42:50 +00:00
github-automation-metabase
9fea80b7c5 Delete duplicate e2e repro model metadata (with custom expression) (#67555) (#67556)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-26 13:18:52 +00:00
github-automation-metabase
7eb2bf078a note on SQL download perms (#67464) (#67557)
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-12-26 13:05:30 +00:00
github-automation-metabase
7ba6a02410 Prevent black background loaded with light full-app embedding (#67544) (#67552)
* Prevent black background loaded with light full-app embedding

* Fix tests

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-26 12:49:22 +00:00
github-automation-metabase
74300cb20c Upload failed e2e test artifacts for quarantined tests (#67381) (#67554)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-26 12:40:13 +00:00
github-automation-metabase
337445afea fix(sdk-package, sdk-bundle, embed-js): Don't expose question in SDK's entityTypes (#67534) (#67542)
* Don't expose `question` in SDK's `entityTypes`

Because it's only applicable to staged picker

* Fix type

* Clarify the use of `question` in SDK's `entityTypes`

* Fix SDK not building

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-26 12:21:14 +00:00
Phoomparin Mano
51cbcba0f4 fix failing tenants test due to casing (#67549) 2025-12-26 18:38:59 +07:00
github-automation-metabase
c87334b94b Fix model metadata e2e flake (#67522) (#67538)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-25 19:47:54 +00:00
github-automation-metabase
a15e52b401 feat(sdk-bundle, embed-js): Remove embedding subscriptions email links (#67511) (#67535)
* Prevent test email from including Metabase links (#67068)

* Send a new flag from FE if testing subscription from modular embedding

* Pass :disable_links to dashboard subscription email template

* Remove links from dashboard subscription email template

* Remove link from pulse cards

* Remove dangling divider line

* Add test

* Fix tests

* Use the same logic as in the actual subscription tasks

* Prepare to use a new column name from pulse table

* Remove embedding subscriptions email links (#67181)

* Add a column to pulse to save when a subscription is created on embedding

* Save disable_links to "pulse" table

* Fix tests

* Fix more tests

* Update column name

* Add tests

* Make code less confusing after embedding name change

* Fix liquibase boolean type

* Fix tests

* Fix more tests

* Fix formatting

* Fix wrong test names

* Make function comment styles consistent

* Make the test more solid

* Add modular embedding SDK tests

* Don't render the dashboard subscription button when there's no data cards (#67501)

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-25 15:29:48 +00:00
github-automation-metabase
1014179cde Make "All internal users" sentence-cased in permission editor (#67258) (#67267)
Co-authored-by: Phoomparin Mano <phoomparin@gmail.com>
2025-12-25 22:07:11 +07:00
github-automation-metabase
875709f26b Validation for internal group's tenant collection permission should reference all internal users (#67177) (#67254)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-25 22:06:53 +07:00
github-automation-metabase
03a15af369 Use actual metadata in a Notebook in Embedding SDK/Embed JS (#67453) (#67531)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-25 12:13:23 +00:00
github-automation-metabase
bf00b5f29c fix: add filter clauses to support min max required for age binning (#67448) (#67528)
Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-25 09:29:50 +00:00
github-automation-metabase
7f9a921090 docs(sdk): move llms.txt under docs/embedding (#67526) (#67527)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-24 22:16:24 +00:00
Denis Berezin
82369f46d5 Fix: very low percentages can collide with the y-axis when there are lots of decimals (#67219) (#67479)
* Fix: very low percentages can collide with the y-axis when there are lots of decimals

Fixes #55853

🤖 Generated with [Claude Code](https://claude.ai/code)



* Add e2e test

* Review fixes

* Update Loki Snapshots

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Code[bot] <noreply@anthropic.com>
Co-authored-by: Metabase Automation <github-automation@metabase.com>
2025-12-24 23:01:34 +03:00
github-automation-metabase
2587afbe78 UXW-1852 Reset filter to default for specific click behavior (#67220) (#67518)
* UXW-1852 Reset filter to default for specific click behavior

* Fix CI

* Fix unit tests

* Review fixes

* Add e2e test

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2025-12-24 16:39:27 +00:00
github-automation-metabase
bffb349e0b Custom headers (#67502) (#67514)
* added vars
* added tests

Co-authored-by: Roman Abdulmanov <roman@metabase.com>
2025-12-24 15:41:05 +00:00
github-automation-metabase
ea039adb26 docs(sdk): add statically generated docs/llms.txt (#67506) (#67510)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-24 12:32:34 +00:00
github-automation-metabase
c11efb6ab4 fix: respect time format in exclude date picker filter QUE-2611 (#67384) (#67504)
* fix: respect time format in exlude date picker filter QUE-2611

* rework: move constant out of function body

* test: fix failing tests due to lack of redux provider

* fix: add missing redux  provider in story

* test: improve testing logic for ExcludeDatePicker

* internal: use specialized useSetting hook

* test: adjust looping with async action

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2025-12-24 10:24:40 +00:00
github-automation-metabase
7e2f185da3 Hide Data Permissions sections that are irrelevant to oss (#67354) (#67412)
Co-authored-by: Fraser <fraser@metabase.com>
2025-12-24 07:59:42 +00:00
github-automation-metabase
2456fab3ae Apply field settings to parameter field widget (#67428) (#67497)
Co-authored-by: Fraser <fraser@metabase.com>
2025-12-24 05:03:35 +00:00
github-automation-metabase
368ede9c01 Fix flaky pinned metrics e2e test (#67481) (#67487)
The root cause of the flakiness was that the save modal sometimes picks the root collection, while at other times it picks the current user's personal collection. The selector was trying to find "Our analytics" in the breadcrumbs, which is why it was failing every time the actual collection is personal collection.

The second issue was that trying to (1) clear and then (2) type the metric name was extremely unreliable.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 23:04:16 +00:00
github-automation-metabase
16818e5674 Disable nonworking email and URL extractions for BigQuery and 7 other broken drivers (#66982) (#67471)
* Add failing test for #63822, DEV-1190

* Add new feature flag

* Update FE config

* Fix tests 🔧

* Disable for 7 more drivers

* Fix MySQL + MariaDB

* Fix TypeScript

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-23 20:26:40 +00:00
github-automation-metabase
16e3dc0bad Fix #61219: Add ability to include personal collection items in search results for admins (#67396) (#67468)
Co-authored-by: Brad Anderson <brad@metabase.com>
2025-12-23 19:01:23 +00:00
github-automation-metabase
c3ec40a378 fix: use "All tenant users" group for tenant users in popover and modal (#67446) (#67463)
* fix: use "All tenant users" group for tenant users in popover and modal

* clean up

* Revert "clean up"

This reverts commit d054ad7d9e.

Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-23 17:40:50 +00:00
github-automation-metabase
601adc19fb Add parameters /search e2e for guest embeds (#67273) (#67461)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-23 17:08:55 +00:00
github-automation-metabase
0cb8f7c9d7 Check that the number was parsed correctly (#67403) (#67458)
* Check that the number was parsed correctly

* Don't parse int columns that are remapped

* oops, remove old change

* Better fix and specific test

* kick ci

* kick ci

* Make sure it still hits the bigint branch

* Move check into parseNumber()

* Move check back to value.tsx

* Single describe in tests

* Add blank lines (fe-lint)

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-23 17:06:45 +00:00
github-automation-metabase
cdcfdd2c43 Tenant Collections -> Shared collections in permissions page (#67452) (#67457)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-23 16:41:55 +00:00
github-automation-metabase
11684ac114 hide the column to promote to group manager for tenant groups (#67451) (#67454)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-23 16:08:13 +00:00
github-automation-metabase
c687678f09 Refactor metabot error handling (#67290) (#67304)
* metabot check-response! function for ai service error handling

* Add test, tweak logic

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2025-12-23 15:09:48 +00:00
github-automation-metabase
c117c4bde6 Fix object detail flake #39477 (#67442) (#67443)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 13:23:05 +00:00
github-automation-metabase
0408c343e1 Remove the "Groups" heading from the invite popover (#67222) (#67439)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 12:35:24 +00:00
github-automation-metabase
6759db19a1 update tenants empty state listing copy (#67431) (#67438)
* update tenants empty state listing

* Update enterprise/frontend/src/metabase-enterprise/tenants/components/TenantsListingEmptyState.tsx

Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-23 12:27:45 +00:00
github-automation-metabase
e1be32e478 Consolidate outlines in the main sidebar nav (#67283) (#67436)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 12:22:34 +00:00
github-automation-metabase
9b922e4054 Fix flake #23630 (#67367) (#67437)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 11:58:32 +00:00
github-automation-metabase
cd7e7da811 Simplify content moderation e2e tests (#67375) (#67407)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-23 11:56:47 +00:00
github-automation-metabase
200666cc21 Use collection in breadcrumbs for nested questions (#67154) (#67415)
* Always show collection in header breadcrumbs for cards

* Add repro for metabase#47005

* Fix e2e tests

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-12-23 10:28:44 +00:00
github-automation-metabase
69344c4124 Docs: Metabot inline SQL editing (#67362) (#67433)
* Docs: inline SQL editing

* Optimized 1 images, saved 35.9 KB (13.6% smaller)

* typos

* Update docs/ai/metabot.md



* Update docs/ai/metabot.md



* Update docs/ai/metabot.md



* small edit

---------

Co-authored-by: Abed Habli <154609371+abdhabli@users.noreply.github.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-12-23 09:16:07 +00:00
github-automation-metabase
1b499ced70 Fix adding two DIFFERENT implicit joins with the SAME generated alias (#67411) (#67422)
* Fix adding two DIFFERENT implicit joins with the same generated alias

* Part 2 of #67411 fix

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-23 02:43:25 +00:00
github-automation-metabase
0119994ea5 UXW-2546 Fix permissions table cell background color & borders (#67331) (#67424)
* fix: table cell background & border color

* feat: use css variable instead of theme templating

Co-authored-by: Gabriel Moreno <gabriel@metabase.com>
2025-12-23 02:40:00 +00:00
github-automation-metabase
e2f2584be8 Allow temporal args for - (#67397) (#67405)
Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-23 00:50:23 +00:00
github-automation-metabase
9935824876 Fix #64631: Change "Report an issue" -> "Download diagnostics" (#67310) (#67410)
* UXW-1988 Copy change: "Report an issue" -> "Download diagnostics"

* UXW-1988 Updates tests/documentation

Co-authored-by: Brad Anderson <brad@metabase.com>
2025-12-22 23:21:55 +00:00
github-automation-metabase
4c8550acf0 resolve mdast-util-to-hast to 13.2.1 (#67389) (#67400)
Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2025-12-22 20:53:20 +00:00
github-automation-metabase
47459998f4 Log each entity as it gets dependency-backfilled at debug level (#67378) (#67390)
Log each entity (card) as its dependencies get backfilled by the job. This is to be able to see if there is a particular entity that's causing the OOM.

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-12-22 18:28:08 +00:00
github-automation-metabase
2fa58a08ce [Metabot] Natural language query entry point (#66737) (#67382)
* prototype

* open chat sidebar on navigate

* update copy for new route

* use nlq profile and make sticky, redirect to empty query builder if no navigate_to is recieved

* responsiveness

* move code to enterprise folder

* imple error states, better loading state

* handle user leaving the page while a response is being loaded

* lint fix, change inline sql shortcut key, disable prompt suggestions and fade out once a prompt has been sent

* fix e2e test

* add test coverage, update copy

* fix failing e2e tests

* attempt to fix e2e flake

Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2025-12-22 17:38:26 +00:00
github-automation-metabase
2638bab3b7 bump versions (#67385) (#67387)
Co-authored-by: Roman Abdulmanov <roman@metabase.com>
2025-12-22 17:25:20 +00:00
github-automation-metabase
d253655a51 bump versions (#67379) (#67380)
Co-authored-by: Roman Abdulmanov <roman@metabase.com>
2025-12-22 17:02:52 +00:00
github-automation-metabase
c2949d4805 Remove my temp DB file (#67369) (#67374)
Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-22 15:15:09 +00:00
github-automation-metabase
136e36b8a6 auth snippets (#67371) (#67373)
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-12-22 15:08:34 +00:00
github-automation-metabase
cfe7b43948 UXW-77 fix missing bar chart labels for 12 months timeseries (#67316) (#67370)
* UXW-77 fix missing bar chart labels for 12 months timeseries

* Update Loki Snapshots

---------

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2025-12-22 15:03:24 +00:00
github-automation-metabase
edf76b8069 Keep filters header visible when details view is open (#67246) (#67352)
* Do not hide filters when showing object details

* Add repro for metabase#66957

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-12-22 03:24:01 +00:00
github-automation-metabase
949c4663ed Add time in click behaviour for hours and minutes (#67151) (#67351)
* Allow clicking dates with hour and minutes granularity to set parameter

* Add repro for metabase#58556

* Fix unit tests

* Add repro for metabase#66277

* Allow selecting date ranges with hours and minutes

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-12-22 03:07:46 +00:00
github-automation-metabase
c0c43f4d21 Allow arbitrary expressions inside :is-null and :not-null in MBQL 4 schema (#67326) (#67347)
* Support arbitrary expressions inside `:is-null` and `:not-null`

* Remove unnecessary blank line in schema_test.cljc

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-21 16:42:44 -08:00
github-automation-metabase
765116cc8b Allow :aggregation refs inside (aggregation) expressions in MBQL 4 schema (#67311) (#67342)
* Allow :aggregation refs inside expressions in MBQL 4 schema

* Test + Kondo fix

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-21 21:27:46 +00:00
github-automation-metabase
f590798f44 Get rid of peridot dependency by embedding necessary functions (#66921) (#67346)
Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2025-12-21 21:26:45 +00:00
github-automation-metabase
120b4830b5 Metabot NLQ collection picker (#67051) (#67334)
* accept optional profile-id in search tool request and use it to determine collection filtering

* cleanup

* try to fix tests

* fix build

* kondo

* fix toucan syntax

* address comment

* oops, fix build

* remove some more use_case code on the FE that slipped through the revert via messy rebase

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2025-12-20 00:50:22 +00:00
github-automation-metabase
7a6be8e99d MBQL 4 => MBQL 5 conversion should ignore invalid expressions (#67305) (#67323)
Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-20 00:31:41 +00:00
github-automation-metabase
685f193099 fix isExternalUser check (#67303) (#67325)
Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2025-12-19 23:04:35 +00:00
github-automation-metabase
9bcc0d2e95 docs - update embedding docs (#66784) (#67322)
* move appearance

* links

* sample app links

* heading

* update code to copy

* embedding updates

* remove generated file

* fixes

* redirect

* typos

* image

* various clean up

* appearance

* components

* pick an item

* guest embeds and components

* translations

* auth

* sample app

* Apply suggestion from @jeff-bruemmer

* theme json

* links

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-12-19 22:30:43 +00:00
github-automation-metabase
44a4f7ca7f Set network timeout in connection options (#66861) (#67301)
* set network timeout in connection options

* add test

* kondo

* fix test

* Add try catch

* use network timeout setting

* use exception chain util

* use cached thread pool, and timeout to call connection.close

* just do setnetworktimeout

* address comments

Co-authored-by: Riley Thompson <riley@metabase.com>
2025-12-19 21:38:39 +00:00
github-automation-metabase
3d8ad85f29 Fix trend lines when aggregating by datetime (#65873) (#67298)
Co-authored-by: Nathan Voxland <nathan@metabase.com>
2025-12-19 21:15:31 +00:00
github-automation-metabase
dcc3b198cf UXW-115 Disables "Export as PDF" button in dashboard share menu if cards are still loading (#67168) (#67296)
Co-authored-by: Brad Anderson <brad@metabase.com>
2025-12-19 20:05:58 +00:00
github-automation-metabase
8364a1d334 🤖 backported "UXW-2578 - Prevent renaming of tenant collection" (#67278)
* UXW-2578 - Prevent renaming of tenant collection (#67086)

* Prevent updating tenant specific root collections

* Localize the name of dedicated tenant collections

* rename dedicated tenant collections 'Our Data'

When displayed on the FE for an admin, they can be renamed to something
like "Foobar's tenant collection"

* Internal users see different names

* prevent tenant users to edit their dedicated tenant collection

* Revert "prevent tenant users to edit their dedicated tenant collection"

This reverts commit 08d2d722be.

* Rename `Our Data` to `Our data`

Co-authored-by: Nicolò Pretto <info@npretto.com>

---------

Co-authored-by: Nicolò Pretto <info@npretto.com>

* update collection  name in tests to use the new one from the BE

* empty commit to retrigger ci

---------

Co-authored-by: John Swanson <john.swanson@metabase.com>
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-19 10:58:49 -08:00
github-automation-metabase
12bc5e501d Don't allow attachments if the creator doesn't have permission to download (#66827) (#67175)
* Don't allow attachments if the creator doesn't have permission to download

* Fixed failing test

* Fixed failing test

* Fixed frontend issues

* Fixed frontend issues

* Updated BE code

* Fix unit tests

---------

Co-authored-by: Nathan Voxland <nathan@metabase.com>
Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2025-12-19 10:58:08 -08:00
github-automation-metabase
88b69d6b8e UXW-2576 show tenant collections in the trash (#67124) (#67281)
* UXW-2576 show tenant collections in the trash

I also deleted the `audit-namespace-clause` function. It felt like it
didn't do enough to justify its existence - every caller needed to
modify the list of namespaces. Could probably DRY things up a bit still,
but think we should change the approach.

* Check `use-tenants` before returning tenant colls

* s/audit-namespace-clause/namespace-clause helper

`namespace-clause` takes the ns column, ns value, and an optional
argument for whether *this* particular result should include the tenant
collections in the response (since sometimes we want 'em, sometimes we
don't.)

* kondo

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-12-19 10:20:54 -08:00
github-automation-metabase
f65ecb8e3a docs(sdk): Update Readme version references and published npm version to 0.58.0-beta.0 (#67291) 2025-12-19 17:22:44 +00:00
github-automation-metabase
f66380a5b6 Add mbql time schema test (#67182) (#67205)
* Add test

* Move test to temporal-test

* Openapi json

* Add second time string

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-19 17:19:17 +00:00
github-automation-metabase
6b6e54b6fe Fix race condition in metabase.util.queue-test/multithreaded-listener-test (#67225) (#67289)
Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2025-12-19 16:59:54 +00:00
github-automation-metabase
95df601af3 Use snake_case for MetabotCodeEdit and MetabotCodeEditorBufferContext fields (#67231) (#67288)
For consistency with other types shared between metabase and ai-service.

Co-authored-by: appleby <86076+appleby@users.noreply.github.com>
2025-12-19 16:39:49 +00:00
github-automation-metabase
0e715fb278 Don't do implicit joins through sensitive FKs (#67056) (#67192)
* WIP

* Working test! (it reproduces)

* Fhew! I found it!

* Remove printlns

* Also remove sensitive fks in calculation

* Remove stray marker comment

* Move tests to fields-test

* Exclude :retired too

* Move tests and add one for retired

* Add another retired

* Better tests

* Appease the kondo

* Fix broken test

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-19 16:28:18 +00:00
github-automation-metabase
75aa3db456 Cleanup docker build caches when building sample apps on CI (#67268) (#67285)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-19 16:19:03 +00:00
github-automation-metabase
735362bc46 feat: add branch picker to data studio (#66970) (#67223)
* feat: add branch picker to data studio

* fixup! address PR feedback

* fixup! PR feedback about sync visibility

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2025-12-19 16:18:03 +00:00
github-automation-metabase
b282202dfa installing merge drivers works with git worktrees (#67199) (#67287)
Co-authored-by: bryan <bryan.maass@gmail.com>
2025-12-19 16:12:56 +00:00
github-automation-metabase
bcfea0d6c8 Fix invalid snowplow schema (#67250) (#67279)
* Pass the schema validation

* update schema

* Update tests

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-19 15:48:26 +00:00
github-automation-metabase
c38455e80b test(tenants): add e2e for what tenant users should see in core app (#67272) (#67277)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-19 16:16:40 +01:00
github-automation-metabase
dc7151908f Show embedding picker when logged in as a tenant user (#67189) (#67264)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-19 14:58:59 +00:00
github-automation-metabase
cec806494e disable chunked encoding if using path style access (#67262) (#67270)
Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2025-12-19 14:26:00 +00:00
github-automation-metabase
85532d68b5 Use mongo field filter alias if available (#67025) (#67121)
* use mongo field alias if available

* Address comments

Co-authored-by: Riley Thompson <riley@metabase.com>
2025-12-19 14:00:39 +00:00
github-automation-metabase
b8a8297504 My Tenant Collection -> Our data in hooks.ts (#67257) (#67266)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-19 13:50:15 +00:00
github-automation-metabase
988554eb7b SDK loaderComponent now applies to all loaders (#66646) (#67263)
* SDK loaderComponent now applies to all loaders

* removed getLoaderComponent, render the loader comp as a react comp, pass it an optional label

Co-authored-by: Sébastien <sebastien@metabase.com>
2025-12-19 13:08:36 +00:00
github-automation-metabase
ae01ada663 🤖 backported "prevent tenant users from editing their dedicated tenant collection" (#67252)
* prevent tenant users to edit their dedicated tenant collection name (#67180)

* empty commit to retrigger ci

---------

Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-19 10:47:41 +00:00
github-automation-metabase
650a7e6dcc Design changes for tenants onboarding flow in embedding setup guide (#67125) (#67255)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-19 10:32:22 +00:00
github-automation-metabase
02a1e20f87 Allow customizing filters values for subscriptions on modular embedding (#67249) (#67253)
* Allow customizing filter values for subscriptions on modular embedding

* Add tests

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-19 10:26:24 +00:00
github-automation-metabase
708a36234e don't show synced collections icon for tenant users (#67161) (#67190)
* feat(tenants): tenant users should not see the synced folder icon

* empty commit to retrigger ci

Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-19 10:47:53 +01:00
github-automation-metabase
dea8744fa2 Fix opening an info sidebar when native _variables_ sidebar was already opened (#67165) (#67251)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-19 09:39:05 +00:00
github-automation-metabase
8a49a063a3 🤖 backported "flatten collection list for tenant users" (#67166)
* Revert "Hide external collections sidebar for internal users without tenant collection accesses (#67033) (#67074)"

This reverts commit d4ab4f01c1.

* flatten collection list for tenant users (#67072)

* Hide external collections sidebar for internal users without tenant collection accesses (#67033)

* show the add button if user can write to root

* update unit tests for shared collections nav

* simplify test mocks

* getIsTenantUser selector

* flatten navbar for tenant users

* move up state and use plugin, keep "Collections" name when the external
collection section is not shown

* polish

* throw new error

* fix unit test

---------

Co-authored-by: Phoomparin Mano <poom@metabase.com>

---------

Co-authored-by: Nicolò Pretto <info@npretto.com>
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-19 09:56:54 +01:00
github-automation-metabase
d014973092 Modular embedding subscription analytics (#66932) (#67183)
* Update default value locations in comments

* Update snowplow schema for modular embedding analytics

* Add more type safety

* fix 'dashboard.drills' and 'question.drills' default values for guest embeds

* Fix auth type

* Test guest embed authentication

* Log `with-subscriptions`

* Strengthen the type

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2025-12-19 07:56:36 +00:00
github-automation-metabase
29d9300a8f Only import the needed plugins in unit tests (#66751) (#67247)
* Demo of only importing the relevant plugin in unit test

* Optimize enterprise plugin unit tests with targeted setupEnterpriseOnlyPlugin calls

* fixed tests

* fixup

* .

* fixed test

* removed hasEnterprisePlugin

* fixup

* removed remaining hasEnterprisePlugins and unnecessary setupEnterprise fn

* specificPlugins -> enterprisePlugins

* .

* fixed type

* docs

Co-authored-by: Sébastien <sebastien@metabase.com>
2025-12-19 07:27:00 +00:00
github-automation-metabase
3110cabfc3 Add effective type to expression when resolving from ref (#67064) (#67245)
* Add effective type to expression when resolving from ref

* Add repro for QUE-2567

* Fallback to base type when checking effective types

* Avoid shadowing var

* Add tests for effective-type fallback

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2025-12-19 06:03:53 +00:00
github-automation-metabase
277edcd930 Several MBQL 4 normalization fixes 🔧 (#67203) (#67232)
* Fix normalization of MBQL 4 `:aggregation-options` with a `nil` options map

* Update tests

* Fix normalization of Template Tag :options

* Allow raw values as expression definitions

* Automatically remove :ident from joins

* Properly handle aggregations expressions that contain `:if` (alias for `:case`)

* Allow `:coalesce`, `:if`, and `:case` as datetime exprs in MBQL 4

* Test & Kondo fixes 🔧

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-19 02:20:04 +00:00
github-automation-metabase
8bf8853892 Convert the "View SQL" to an icon only (#67159) (#67229)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-18 23:46:00 +00:00
github-automation-metabase
12c834cc60 Fix bigquery timestamp and timezone casting in aggregation (#67089) (#67227)
* working fix

* clean up

* clean up test

* kondo

* Update modules/drivers/bigquery-cloud-sdk/src/metabase/driver/bigquery_cloud_sdk/query_processor.clj



* Update modules/drivers/bigquery-cloud-sdk/src/metabase/driver/bigquery_cloud_sdk/query_processor.clj



---------

Co-authored-by: Riley Thompson <riley@metabase.com>
Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2025-12-18 23:44:33 +00:00
github-automation-metabase
19cecaba98 🤖 backported "Revert "Metabot use case configuration groundwork (#66673)"" (#67212)
* Revert "Metabot use case configuration groundwork (#66673)" (#67106)

This reverts commit dce776c8cc.

* bump ci

---------

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
Co-authored-by: Noah Moss <noahbmoss@gmail.com>
2025-12-18 23:05:29 +00:00
github-automation-metabase
4055a4f799 [Metabot] Inline SQL entry point (#66688) (#67224)
Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2025-12-18 22:52:43 +00:00
github-automation-metabase
50786328f2 Fix grammar of billing period for Metabase AI (#67191) (#67216)
Fixes: 2b76c38e1f
Closes: https://github.com/metabase/metabase/pull/67053#issuecomment-3671353062

Co-authored-by: Dennis Schridde <63082+devurandom@users.noreply.github.com>
2025-12-18 21:43:04 +00:00
github-automation-metabase
c1a0ca9c71 Remove models and metrics section from settings (#67174) (#67197)
Removed section on adding models and metrics to Metabot collection.

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2025-12-18 18:55:57 +00:00
github-automation-metabase
d9b4465228 Fix Question parameters remapping, add more e2e (#67164)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-18 22:32:36 +04:00
github-automation-metabase
6e46ae0a2c Change Metabase AI price to be based on quantity for whole billing period (#67053) (#67186)
### Description

We want to communicate per-billing-period quantities with customer, instead of always communicate monthly quantities.  Invoiced totals will stay the same.

### How to verify

Describe the steps to verify that the changes are working as expected.

1. Ensure you have a token with the `offer-metabase-ai-tiered` feature, but without the `metabot-v3` feature.
2. Navigate to `/admin/metabot` and see the quantities as per billing period, and not per month.

### Checklist

- [x] Tests have been added/updated to cover changes in this PR

Fixes: 2b76c38e1f
Closes: https://metaboat.slack.com/archives/C07RMUQ0GE5/p1765907134400039

Co-authored-by: Dennis Schridde <63082+devurandom@users.noreply.github.com>
2025-12-18 18:19:44 +00:00
github-automation-metabase
d40da31afe Move the attribute widget description under the accordion header (#67019) (#67116)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-19 00:52:17 +07:00
github-automation-metabase
df414b22f4 [Metabot] Multi-convo support (#66864) (#67179)
Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2025-12-18 17:49:46 +00:00
github-automation-metabase
9d962cae50 🤖 backported "Hide authority level picker in new shared collection modal" (#67114)
* Hide authority level picker in new shared collection modal (#67041)

* also mark canWriteToSharedCollectionRoot to true

---------

Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Phoomparin Mano <phoomparin@gmail.com>
2025-12-18 17:41:33 +00:00
github-automation-metabase
d5d847f38e fix dashboard question picker collection icons (#67139) (#67172)
Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2025-12-18 17:29:20 +00:00
github-automation-metabase
9d6a8e6d5c Fix props wrongly marked as interactive-only (#67008) (#67169)
* fix props wrongly marked as interactive-only

* also remove interactive from withDownloads

Co-authored-by: Sébastien <sebastien@metabase.com>
2025-12-18 16:39:39 +00:00
github-automation-metabase
3e32666e40 add a precondition to segment dependency migration in case it was already run on 57 (#67052) (#67167)
Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2025-12-18 16:23:13 +00:00
github-automation-metabase
2c0e5e074b Improvements to pro-self-hosted to cloud migration flow (#66806) (#67162)
* Change url from checkout to login

* Use store login url when pro-self-hosted plan

* Unit test WIP

* source_plan query param added

* Cleanups

* Move useGetStoreUrl to hooks file

* Unit tests added

* Misc

* Misc

* Remove hooks

* Removed login path page

* Param renamed to `migration-source-plan`

* Unit tests updated

Co-authored-by: Benoit Vinay <ben@benoitvinay.com>
2025-12-18 14:50:52 +00:00
github-automation-metabase
b37301453b Scalar - column might be undefined (#67099) (#67132)
Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2025-12-18 14:28:24 +00:00
github-automation-metabase
48b42b2faa fix: improve search performance with tables (#67055) (#67107)
Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2025-12-18 08:23:18 -06:00
github-automation-metabase
d8731fc411 Stop preserving the sql/native preview panel open/closed state (#67138) (#67157)
This pull request removes the user setting that persisted the open/closed state of the native query preview sidebar in the notebook editor. The sidebar's visibility is now managed entirely in the UI state (not persisted per user), simplifying the logic for showing or hiding the sidebar and cleaning up related code and tests.

1. opening a notebook editor will *always* start from a closed native preview sidebar
2. state is now managed exclusively by Redux (sidebar state might be preserved until the page reload, but it is not persisted on the backend)
3. We're changing a previous behavior where, if a native preview sidebar was open and we're resizing the window to something small, the sidebar was automatically closed. This PR changes that behavior. i.e. There is no special resize handling anymore. Whatever the (Redux) state of the sidebar is, it will stay like that no matter the window size.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-18 13:05:32 +00:00
Mahatthana (Kelvin) Nomsawadi
9593db4747 embedding 58 beta checklist (#66999)
* Update SDK release 58 workflow

* npm version update
2025-12-18 12:34:21 +00:00
github-automation-metabase
490086b84c docs(tenants): update "tenant" to "@tenant" (#67069) (#67155)
Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-18 08:36:20 +00:00
github-automation-metabase
daabf9471f UXW-186: Mark Mongo connection URI as a "password" (#65178) (#67134)
Since it contains a password, it should be treated as one. This way it
will be redacted in the UI and API.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-12-17 22:34:43 +00:00
github-automation-metabase
a73377914c Fix github.ref_name references in backend workflows (#66257) (#67130)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: bryan <bryan.maass@gmail.com>
2025-12-17 21:42:58 +00:00
github-automation-metabase
313303df49 Use sentence case for people tab pages in admin settings (#67048) (#67122)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-17 20:28:01 +00:00
github-automation-metabase
69792c83b4 Reduce the "Attributes" font size in a user form (#67096) (#67112)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-17 19:18:32 +00:00
github-automation-metabase
b7932d8623 feat(sdk): resolve tenant collection in collection browser (#67050) (#67115)
Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-17 19:08:11 +00:00
github-automation-metabase
8ffe92824a Wait for recent dashboards being loaded before we load a resource in Embed JS wizard (#67013) (#67104)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-17 18:25:11 +00:00
github-automation-metabase
cccd2f9fb6 UXW-2451 Fix opposite light/dark mode colors leaking when table is present (#67017) (#67100)
* WIP UXW-2451 Fixes issue where changing light/dark mode messes up color variables by removing nested providers in useBodyCellMeasure which probably breaks other things

* Update Loki Snapshots

---------

Co-authored-by: Brad Anderson <brad@metabase.com>
2025-12-17 18:02:48 +00:00
github-automation-metabase
59c9e995f2 [o11y] Log + metrics for lib.convert/clean making material changes (#67094) (#67097)
This generally indicates an MBQL 4 -> 5 conversion issue, and we need
the signal in the 57 rollout.

Also improves the detail of the logging for when `:dataset_query {}`.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2025-12-17 17:25:13 +00:00
github-automation-metabase
2ec3244a5e fix: dirty state tracking of bulk set collections (#67020) (#67095)
Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2025-12-17 15:38:35 +00:00
github-automation-metabase
a9bb3d1fea docs - australia (#67039) (#67091)
* Add Australia (Sydney) to available regions

Added Australia (Sydney) to the list of regions.

* Add Asia Pacific (Sydney) IP addresses to whitelist

Added IP addresses for the Asia Pacific (Sydney) region.

* Reorder South America IP addresses section

* Update cloud region list in change-region.md

Removed duplicate entry for Australia (Sydney) and updated Asia Pacific region.

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2025-12-17 15:05:16 +00:00
github-automation-metabase
3b1e126524 refactor: create CollectionListView component that is used both by UserCollectionList and TenantCollectionList (#66937) (#67085)
* refactor: create CollectionListView component that is used both by
UserCollectionList and TenantCollectionList

* address  PR feedback

* use IconName

Co-authored-by: Nicolò Pretto <info@npretto.com>
2025-12-17 14:49:03 +00:00
github-automation-metabase
6f351996f0 Fix embedding types casing (#67071) (#67083)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-17 13:49:37 +00:00
github-automation-metabase
d4ab4f01c1 Hide external collections sidebar for internal users without tenant collection accesses (#67033) (#67074)
* show the add button if user can write to root

* update unit tests for shared collections nav

* simplify test mocks

Co-authored-by: Phoomparin Mano <poom@metabase.com>
2025-12-17 10:52:47 +00:00
github-automation-metabase
041186edbf Adjust text of Static Embedding Alert (#67037) (#67070)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-17 10:29:54 +00:00
github-automation-metabase
cc3e630ae0 fix: card serdes/descendants misses metrics (#67029) (#67061)
Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2025-12-17 03:44:58 +00:00
github-automation-metabase
842c7fbbaa UXW-2425 Add event timeline label (#66976) (#67046)
* UXW-2425 Add event timeline label

* fix: typecheck

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2025-12-16 20:35:29 +00:00
github-automation-metabase
d9327a55ff Manage Table Metadata permission is enough to sync table schema (#65866) (#67044)
Co-authored-by: Nathan Voxland <nathan@metabase.com>
2025-12-16 20:33:22 +00:00
github-automation-metabase
2122ef3b36 update test to match exact string (#67043) (#67047)
Co-authored-by: bryan <bryan.maass@gmail.com>
2025-12-16 20:16:51 +00:00
github-automation-metabase
ecf45b61ec Fix bad normalization for the :text function in MBQL 4 (#67031) (#67036)
Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2025-12-16 14:14:17 -05:00
github-automation-metabase
bdfa834fc3 Fix check for card changes (#64374) (#67023)
* Fix check for card changes

The query coming from the FE looks like:

```
{:aggregation [["count"]],
 :breakout [["field"
             42
             {:base-type "type/DateTime",
             :temporal-unit "month"}]],
 :source-table 7}
```

(note strings like `"count"` and `"month"` and, most importantly, `"type/DateTime"`.)

The card from the DB looked like:

```
{:aggregation [[:count]],
 :breakout [[:field
             42
             {:base-type :type/DateTime,
              :temporal-unit :month}]],
 :source-table 7}
```

When we compare the query to the old version to see if it's changed (and
thus, we should invalidate the verified status) we walk it first,
converting all keywords to strings:

```
  (let [prepare              (fn prepare [card] (walk/prewalk (fn [x] (if (keyword? x)
                                                                        (name x)
                                                                        x))
```

... but this is not the correct way to do this conversion, because
`:type/DateTime` becomes `"DateTime"`. We need to include the namespace
if it's present.

* Compare normalized queries

* Modify `changed?` to only compare updated keys

In the end we're doing a `t2/update!` with the updates passed in. If a
key isn't in the updates, it's not going to be updated.

Simplify `changed?` to just take two arguments, `before` and `after`,
and compare the keys in `after` (after doing the necessary
normalization).

If a key is in `after` but *not* before we can't compare it and should
throw an exception. For example, if we passed a card like
`(t2/select-one [:model/Card :id :name])`, we should throw.

* More sane way to check if a card has changed

Instead of ad-hoc updating keys, use the toucan transforms to just
canonicalize all the values before we compare.

* kondo

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-12-16 17:24:17 +00:00
Nemanja Glumac
504f0684b6 Update translations 2025-12-16 (#67009) (#67021)
* Update translation sources 2025-12-16

* Update translations

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
2025-12-16 09:39:28 -07:00
github-automation-metabase
35223772fa Update version-helpers for v58 (#67010) (#67024)
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2025-12-16 16:06:06 +00:00
github-automation-metabase
4087b3fe78 UXW-2368 Fixes Alert's warning background color (#66964) (#67014)
Co-authored-by: Brad Anderson <brad@metabase.com>
2025-12-16 14:46:33 +00:00
github-automation-metabase
eb3b7c343b Output container logs for Sample App CI (#67003) (#67015)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-16 14:42:35 +00:00
github-automation-metabase
a7341aabec Update jsonwebtoken dependency (#67006) (#67012)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-16 14:11:04 +00:00
github-automation-metabase
2092b111fc Add cluster lock around data permissions updates (#66960) (#67011)
We currently have the "revision number", but:

- the intent there is slightly different; we want to prohibit one user
from making changes to the permissions graph before they *see* changes
another user might have made concurrently, not just sequence the
concurrent changes, and

- we allow API users to pass the `force` parameter to skip the revision
check entirely

Note that the reason we have `force` available is to allow people to
change permissions without first making a request to *GET* the
permissions graph (which can in some cases be extremely large). It is
not intended to allow concurrent updates to permissions.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2025-12-16 13:55:08 +00:00
github-automation-metabase
653b07a767 Update Embedding-related dependencies (#67001) (#67004)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2025-12-16 12:13:06 +00:00
github-automation-metabase
7b5ea083de Don't offer drill-throughs when top-level column doesn't exist (#66907) (#66986)
The summary: we are offering drill-throughs on custom columns defined after aggregation, but those custom columns don't exist in the base query. The error presented in such a way that `lib.underlying/top-level-column` for a dimension was returning `nil`, and we were happily putting that `nil` into the query we constructed.

I created a utility to filter dimensions by whether or not the top-level-column can be resolved, and used this for the underlying-records drill-through (from the original issue) as well as the pivot drill-through (which behaved similarly). If no dimensions have a top-level column, the drill-through is not available. If some do, we offer the partial drill-through.

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
2025-12-16 00:09:14 +00:00
github-automation-metabase
75f462989c Skip fields with inactive table. (#66967) (#66983)
* Skip fields with inactive table.

* Remove redundant let

* Better fix.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2025-12-15 23:45:29 +00:00
3103 changed files with 433624 additions and 293060 deletions

View File

@@ -42,7 +42,7 @@ This guide covers Clojure and ClojureScript coding conventions for Metabase. See
- Break up functions > 20 lines
- Lines ≤ 120 characters
- No blank lines within definition forms (except pairwise `let`/`cond`)
- No blank non-comment lines within definition forms (except pairwise `let`/`cond`)
## Style Conventions

View File

@@ -0,0 +1,420 @@
---
name: add-malli-schemas
description: Efficiently add Malli schemas to API endpoints in the Metabase codebase with proper patterns, validation timing, and error handling
---
# Add Malli Schemas to API Endpoints
This skill helps you efficiently and uniformly add Malli schemas to API endpoints in the Metabase codebase.
## Reference Files (Best Examples)
- `src/metabase/warehouses/api.clj` - Most comprehensive schemas, custom error messages
- `src/metabase/api_keys/api.clj` - Excellent response schemas
- `src/metabase/collections/api.clj` - Great named schema patterns
- `src/metabase/timeline/api/timeline.clj` - Clean, simple examples
## Quick Checklist
When adding Malli schemas to an endpoint:
- [ ] Route params have schemas
- [ ] Query params have schemas with `:optional true` and `:default` where appropriate
- [ ] Request body has a schema (for POST/PUT)
- [ ] Response schema is defined (using `:-` after route string)
- [ ] Use existing schema types from `ms` namespace when possible
- [ ] Consider creating named schemas for reusable or complex types
- [ ] Add contextual error messages for validation failures
## Basic Structure
### Complete Endpoint Example
```clojure
(mr/def ::Color [:enum "red" "blue" "green"])
(mr/def ::ResponseSchema
[:map
[:id pos-int?]
[:name string?]
[:color ::Color]
[:created_at ms/TemporalString]])
(api.macros/defendpoint :post "/:name" :- ::ResponseSchema
"Create a resource with a given name."
[;; Route Params:
{:keys [name]} :- [:map [:name ms/NonBlankString]]
;; Query Params:
{:keys [include archived]} :- [:map
[:include {:optional true} [:maybe [:= "details"]]]
[:archived {:default false} [:maybe ms/BooleanValue]]]
;; Body Params:
{:keys [color]} :- [:map [:color ::Color]]
]
;; endpoint implementation, ex:
{:id 99
:name (str "mr or mrs " name)
:color ({"red" "blue" "blue" "green" "green" "red"} color)
:created_at (t/format (t/formatter "yyyy-MM-dd'T'HH:mm:ssXXX") (t/zoned-date-time))}
)
```
## Common Schema Patterns
1. Route Params (the 5 in `api/user/id/5`)
2. Query Params (the sort+asc pair in `api/users?sort=asc`)
3. Body Params (the contents of a request body. Almost always decoded from json into edn)
4. The Raw Request map
Of the 4 arguments, deprioritize usage of the raw request unless necessary.
### Route Params
Always required, typically just a map with an ID:
```clojure
[{:keys [id]} :- [:map [:id ms/PositiveInt]]]
```
For multiple route params:
```clojure
[{:keys [id field-id]} :- [:map
[:id ms/PositiveInt]
[:field-id ms/PositiveInt]]]
```
### Query Params
Add properties for `{:optional true ...}` and `:default` values:
```clojure
{:keys [archived include limit offset]} :- [:map
[:archived {:default false} [:maybe ms/BooleanValue]]
[:include {:optional true} [:maybe [:= "tables"]]]
[:limit {:optional true} [:maybe ms/PositiveInt]]
[:offset {:optional true} [:maybe ms/PositiveInt]]]
```
### Request Body (POST/PUT)
```clojure
{:keys [name description parent_id]} :- [:map
[:name ms/NonBlankString]
[:description {:optional true} [:maybe ms/NonBlankString]]
[:parent_id {:optional true} [:maybe ms/PositiveInt]]]
```
### Response Schemas
#### Simple inline response:
```clojure
(api.macros/defendpoint :get "/:id" :- [:map
[:id pos-int?]
[:name string?]]
"Get a thing"
...)
```
#### Named schema for reuse:
```clojure
(mr/def ::Thing
[:map
[:id pos-int?]
[:name string?]
[:description [:maybe string?]]])
(api.macros/defendpoint :get "/:id" :- ::Thing
"Get a thing"
...)
(api.macros/defendpoint :get "/" :- [:sequential ::Thing]
"Get all things"
...)
```
## Common Schema Types
### From `metabase.util.malli.schema` (aliased as `ms`)
Prefer the schemas in the ms/* namespace, since they work better with our api infrastructure.
For example use `ms/PositiveInt` instead of `pos-int?`.
```clojure
ms/PositiveInt ;; Positive integer
ms/NonBlankString ;; Non-empty string
ms/BooleanValue ;; String "true"/"false" or boolean
ms/MaybeBooleanValue ;; BooleanValue or nil
ms/TemporalString ;; ISO-8601 date/time string (for REQUEST params only!)
ms/Map ;; Any map
ms/JSONString ;; JSON-encoded string
ms/PositiveNum ;; Positive number
ms/IntGreaterThanOrEqualToZero ;; 0 or positive
```
**IMPORTANT:** For response schemas, use `:any` for temporal fields, not `ms/TemporalString`!
Response schemas validate BEFORE JSON serialization, so they see Java Time objects.
### Built-in Malli Types
```clojure
:string ;; Any string
:boolean ;; true/false
:int ;; Any integer
:keyword ;; Clojure keyword
pos-int? ;; Positive integer predicate
[:maybe X] ;; X or nil
[:enum "a" "b" "c"] ;; One of these values
[:or X Y] ;; Schema that satisfies X or Y
[:and X Y] ;; Schema that satisfies X and Y
[:sequential X] ;; Sequential of Xs
[:set X] ;; Set of Xs
[:map-of K V] ;; Map with keys w/ schema K and values w/ schema V
[:tuple X Y Z] ;; Fixed-length tuple of schemas X Y Z
```
Avoid using sequence schemas unless completely necessary.
## Step-by-Step: Adding Schemas to an Endpoint
### Example: Adding return schema to `GET /api/field/:id/related`
**Before:**
```clojure
(api.macros/defendpoint :get "/:id/related"
"Return related entities."
[{:keys [id]} :- [:map [:id ms/PositiveInt]]]
(-> (t2/select-one :model/Field :id id) api/read-check xrays/related))
```
**Step 1:** Check what the function returns (look at `xrays/related`)
**Step 2:** Define response schema based on return type:
```clojure
(mr/def ::RelatedEntity
[:map
[:tables [:sequential [:map [:id pos-int?] [:name string?]]]]
[:fields [:sequential [:map [:id pos-int?] [:name string?]]]]])
```
**Step 3:** Add response schema to endpoint:
```clojure
(api.macros/defendpoint :get "/:id/related" :- ::RelatedEntity
"Return related entities."
[{:keys [id]} :- [:map [:id ms/PositiveInt]]]
(-> (t2/select-one :model/Field :id id) api/read-check xrays/related))
```
## Advanced Patterns
### Custom Error Messages
```clojure
(def DBEngineString
"Schema for a valid database engine name."
(mu/with-api-error-message
[:and
ms/NonBlankString
[:fn
{:error/message "Valid database engine"}
#(u/ignore-exceptions (driver/the-driver %))]]
(deferred-tru "value must be a valid database engine.")))
```
### Enum with Documentation
```clojure
(def PinnedState
(into [:enum {:error/message "pinned state must be 'all', 'is_pinned', or 'is_not_pinned'"}]
#{"all" "is_pinned" "is_not_pinned"}))
```
### Complex Nested Response
```clojure
(mr/def ::DashboardQuestionCandidate
[:map
[:id ms/PositiveInt]
[:name ms/NonBlankString]
[:description [:maybe string?]]
[:sole_dashboard_info
[:map
[:id ms/PositiveInt]
[:name ms/NonBlankString]
[:description [:maybe string?]]]]])
(mr/def ::DashboardQuestionCandidatesResponse
[:map
[:data [:sequential ::DashboardQuestionCandidate]]
[:total ms/PositiveInt]])
```
### Paginated Response Pattern
```clojure
(mr/def ::PaginatedResponse
[:map
[:data [:sequential ::Item]]
[:total integer?]
[:limit {:optional true} [:maybe integer?]]
[:offset {:optional true} [:maybe integer?]]])
```
## Common Pitfalls
### Don't: Forget `:maybe` for nullable fields
```clojure
[:description ms/NonBlankString] ;; WRONG - fails if nil
[:description [:maybe ms/NonBlankString]] ;; RIGHT - allows nil
```
### Don't: Forget `:optional true` for optional query params
```clojure
[:limit ms/PositiveInt] ;; WRONG - required but shouldn't be
[:limit {:optional true} [:maybe ms/PositiveInt]] ;; RIGHT
```
### Don't: Forget `:default` values for known params
```clojure
[:limit ms/PositiveInt] ;; WRONG - required but shouldn't be
[:limit {:optional true :default 0} [:maybe ms/PositiveInt]] ;; RIGHT
```
### Don't: Mix up route params, query params, and body
```clojure
;; WRONG - all in one map
[{:keys [id name archived]} :- [:map ...]]
;; RIGHT - separate destructuring
[{:keys [id]} :- [:map [:id ms/PositiveInt]]
{:keys [archived]} :- [:map [:archived {:default false} ms/BooleanValue]]
{:keys [name]} :- [:map [:name ms/NonBlankString]]]
```
### Don't: Use `ms/TemporalString` for Java Time objects in response schemas
```clojure
;; WRONG - Java Time objects aren't strings yet
[:date_joined ms/TemporalString]
;; RIGHT - schemas validate BEFORE JSON serialization
[:date_joined :any] ;; Java Time object, serialized to string by middleware
[:last_login [:maybe :any]] ;; Java Time object or nil
```
**Why:** Response schemas validate the internal Clojure data structures BEFORE they are serialized to JSON. Java Time objects like `OffsetDateTime` get converted to ISO-8601 strings by the JSON middleware, so the schema needs to accept the raw Java objects.
### Don't: Use `[:sequential X]` when the data is actually a set
```clojure
;; WRONG - group_ids is actually a set
[:group_ids {:optional true} [:sequential pos-int?]]
;; RIGHT - matches the actual data structure
[:group_ids {:optional true} [:maybe [:set pos-int?]]]
```
**Why:** Toucan hydration methods often return sets. The JSON middleware will serialize sets to arrays, but the schema validates before serialization.
### Don't: Create anonymous schemas for reused structures
Use `mr/def` for schemas used in multiple places:
```clojure
(mr/def ::User
[:map
[:id pos-int?]
[:email string?]
[:name string?]])
```
## Finding Return Types
1. **Look at the function being called**
```clojure
(api.macros/defendpoint :get "/:id"
[{:keys [id]}]
(t2/select-one :model/Field :id id)) ;; Returns a Field instance
```
2. **Check Toucan models for structure**
Look in `src/metabase/*/models/*.clj` for model definitions.
3. **Use clojure-mcp or REPL to inspect**
```bash
./bin/mage -repl '(require '\''metabase.xrays.core) (doc metabase.xrays.core/related)'
```
4. **Check tests**
Tests often show the expected response structure.
## Understanding Schema Validation Timing
**CRITICAL CONCEPT:** Schemas validate at different points in the request/response lifecycle:
### Request Parameter Schemas (Query/Body/Route)
- Validate AFTER JSON parsing
- Data is already deserialized (strings, numbers, booleans)
- Use `ms/TemporalString` for date/time inputs
- Use `ms/BooleanValue` for boolean query params
### Response Schemas
- Validate BEFORE JSON serialization
- Data is still in Clojure format (Java Time objects, sets, keywords)
- Use `:any` for Java Time objects
- Use `[:set X]` for sets
- Use `[:enum :keyword]` for keyword enums
### Serialization Flow
```
Request: JSON string → Parse → Coerce → Handler
Response: Handler → Schema Check → Encode → Serialize → JSON string
```
## Workflow Summary
1. **Read the endpoint** - understand what it does
2. **Identify params** - route, query, body
3. **Add parameter schemas** - use existing types from `ms`
4. **Determine return type** - check the implementation
5. **Define response schema** - inline or named with `mr/def`
6. **Test** - ensure the endpoint works and validates correctly
## Testing Your Schemas
After adding schemas, verify:
1. **Valid requests work** - test with correct data
2. **Invalid requests fail gracefully** - test with wrong types
3. **Optional params work** - test with/without optional params
4. **Error messages are clear** - check validation error responses
## Tips
- **Start simple** - begin with basic types, refine later
- **Reuse schemas** - if you see the same structure twice, make it a named schema
- **Be specific** - use `ms/PositiveInt` instead of `pos-int?`
- **Document intent** - add docstrings to named schemas
- **Follow conventions** - look at similar endpoints in the same namespace
- **Check the actual data** - use REPL to inspect what's actually returned before serialization
## Additional Resources
- [Malli Documentation](https://github.com/metosin/malli)
- Metabase Malli utilities: `src/metabase/util/malli/schema.clj`
- Metabase schema registry: `src/metabase/util/malli/registry.clj`

View File

@@ -0,0 +1,504 @@
---
name: analytics-events
description: Add product analytics events to track user interactions in the Metabase frontend
allowed-tools: Read, Write, Edit, Grep, Glob
---
# Frontend Analytics Events Skill
This skill helps you add product analytics (Snowplow) events to track user interactions in the Metabase frontend codebase.
## Quick Reference
Analytics events in Metabase use Snowplow with typed event schemas. All events must be defined in TypeScript types before use.
**Key Files:**
- `frontend/src/metabase-types/analytics/event.ts` - Event type definitions
- `frontend/src/metabase-types/analytics/schema.ts` - Schema registry
- `frontend/src/metabase/lib/analytics.ts` - Core tracking functions
- Feature-specific `analytics.ts` files - Tracking function wrappers
## Quick Checklist
When adding a new analytics event:
- [ ] Define event type in `frontend/src/metabase-types/analytics/event.ts`
- [ ] Add event to appropriate union type (e.g., `DataStudioEvent`, `SimpleEvent`)
- [ ] Create tracking function in feature's `analytics.ts` file
- [ ] Import and call tracking function at the interaction point
- [ ] Use `trackSimpleEvent()` for basic events (most common)
## Event Schema Types
### 1. Simple Events (Most Common)
Use `SimpleEventSchema` for straightforward tracking. It supports these standard fields:
```typescript
type SimpleEventSchema = {
event: string; // Required: Event name (snake_case)
target_id?: number | null; // Optional: ID of affected entity
triggered_from?: string | null; // Optional: UI location/context
duration_ms?: number | null; // Optional: Duration in milliseconds
result?: string | null; // Optional: Outcome (e.g., "success", "failure")
event_detail?: string | null; // Optional: Additional detail/variant
};
```
**When to use:** 90% of events fit this schema. Use for clicks, opens, closes, creates, deletes, etc.
### 2. Custom Schemas (legacy, no events are being added)
Consider adding new event schema only in very special cases.
**Examples:** `DashboardEventSchema`, `CleanupEventSchema`, `QuestionEventSchema`
## Step-by-Step: Adding a Simple Event
### Example: Track when a user applies filters in a table picker
#### Step 1: Define Event Types
Add event type definitions to `frontend/src/metabase-types/analytics/event.ts`:
```typescript
export type DataStudioTablePickerFiltersAppliedEvent = ValidateEvent<{
event: "data_studio_table_picker_filters_applied";
}>;
export type DataStudioTablePickerFiltersClearedEvent = ValidateEvent<{
event: "data_studio_table_picker_filters_cleared";
}>;
```
#### Step 2: Add to Union Type
Find or create the appropriate union type and add your events:
```typescript
export type DataStudioEvent =
| DataStudioLibraryCreatedEvent
| DataStudioTablePublishedEvent
| DataStudioGlossaryCreatedEvent
| DataStudioGlossaryEditedEvent
| DataStudioGlossaryDeletedEvent
| DataStudioTablePickerFiltersAppliedEvent // <- Add here
| DataStudioTablePickerFiltersClearedEvent; // <- Add here
```
#### Step 3: Create Tracking Functions
In your feature's `analytics.ts` file (e.g., `enterprise/frontend/src/metabase-enterprise/data-studio/analytics.ts`):
```typescript
import { trackSimpleEvent } from "metabase/lib/analytics";
export const trackDataStudioTablePickerFiltersApplied = () => {
trackSimpleEvent({
event: "data_studio_table_picker_filters_applied",
});
};
export const trackDataStudioTablePickerFiltersCleared = () => {
trackSimpleEvent({
event: "data_studio_table_picker_filters_cleared",
});
};
```
#### Step 4: Use in Components
Import and call the tracking function at the interaction point:
```typescript
import {
trackDataStudioTablePickerFiltersApplied,
trackDataStudioTablePickerFiltersCleared,
} from "metabase-enterprise/data-studio/analytics";
function FilterPopover({ filters, onSubmit }) {
const handleReset = () => {
trackDataStudioTablePickerFiltersCleared(); // <- Track here
onSubmit(emptyFilters);
};
return (
<form
onSubmit={(event) => {
event.preventDefault();
trackDataStudioTablePickerFiltersApplied(); // <- Track here
onSubmit(form);
}}
>
{/* form content */}
</form>
);
}
```
## Using SimpleEventSchema Fields
### Example: Event with target_id
```typescript
// Type definition
export type DataStudioLibraryCreatedEvent = ValidateEvent<{
event: "data_studio_library_created";
target_id: number | null;
}>;
// Tracking function
export const trackDataStudioLibraryCreated = (id: CollectionId) => {
trackSimpleEvent({
event: "data_studio_library_created",
target_id: Number(id),
});
};
// Usage
trackDataStudioLibraryCreated(newLibrary.id);
```
### Example: Event with triggered_from
```typescript
// Type definition
export type NewButtonClickedEvent = ValidateEvent<{
event: "new_button_clicked";
triggered_from: "app-bar" | "empty-collection";
}>;
// Tracking function
export const trackNewButtonClicked = (location: "app-bar" | "empty-collection") => {
trackSimpleEvent({
event: "new_button_clicked",
triggered_from: location,
});
};
// Usage
<Button onClick={() => {
trackNewButtonClicked("app-bar");
handleCreate();
}}>
New
</Button>
```
### Example: Event with event_detail
```typescript
// Type definition
export type MetadataEditEvent = ValidateEvent<{
event: "metadata_edited";
event_detail: "type_casting" | "semantic_type_change" | "visibility_change";
triggered_from: "admin" | "data_studio";
}>;
// Tracking function
export const trackMetadataChange = (
detail: "type_casting" | "semantic_type_change" | "visibility_change",
location: "admin" | "data_studio"
) => {
trackSimpleEvent({
event: "metadata_edited",
event_detail: detail,
triggered_from: location,
});
};
// Usage
trackMetadataChange("semantic_type_change", "data_studio");
```
### Example: Event with result and duration
```typescript
// Type definition
export type MoveToTrashEvent = ValidateEvent<{
event: "moved-to-trash";
target_id: number | null;
triggered_from: "collection" | "detail_page" | "cleanup_modal";
duration_ms: number | null;
result: "success" | "failure";
event_detail: "question" | "model" | "metric" | "dashboard";
}>;
// Tracking function
export const trackMoveToTrash = (params: {
targetId: number | null;
triggeredFrom: "collection" | "detail_page" | "cleanup_modal";
durationMs: number | null;
result: "success" | "failure";
itemType: "question" | "model" | "metric" | "dashboard";
}) => {
trackSimpleEvent({
event: "moved-to-trash",
target_id: params.targetId,
triggered_from: params.triggeredFrom,
duration_ms: params.durationMs,
result: params.result,
event_detail: params.itemType,
});
};
// Usage with timing
const startTime = Date.now();
try {
await moveToTrash(item);
trackMoveToTrash({
targetId: item.id,
triggeredFrom: "collection",
durationMs: Date.now() - startTime,
result: "success",
itemType: "question",
});
} catch (error) {
trackMoveToTrash({
targetId: item.id,
triggeredFrom: "collection",
durationMs: Date.now() - startTime,
result: "failure",
itemType: "question",
});
}
```
## Naming Conventions
### Event Names (snake_case)
```typescript
// Good
"data_studio_library_created"
"table_picker_filters_applied"
"metabot_chat_opened"
// Bad
"DataStudioLibraryCreated" // Wrong case
"tablePickerFiltersApplied" // Wrong case
"filters-applied" // Use underscore, not hyphen
```
### Event Type Names (PascalCase with "Event" suffix)
```typescript
// Good
DataStudioLibraryCreatedEvent
TablePickerFiltersAppliedEvent
MetabotChatOpenedEvent
// Bad
dataStudioLibraryCreated // Wrong case
DataStudioLibraryCreated // Missing "Event" suffix
```
### Tracking Function Names (camelCase with "track" prefix)
```typescript
// Good
trackDataStudioLibraryCreated
trackTablePickerFiltersApplied
trackMetabotChatOpened
// Bad
DataStudioLibraryCreated // Missing "track" prefix
track_library_created // Wrong case
logLibraryCreated // Use "track" prefix
```
## Common Patterns
### Pattern 1: Feature-Specific Union Types
Group related events together:
```typescript
export type DataStudioEvent =
| DataStudioLibraryCreatedEvent
| DataStudioTablePublishedEvent
| DataStudioGlossaryCreatedEvent;
export type MetabotEvent =
| MetabotChatOpenedEvent
| MetabotRequestSentEvent
| MetabotFixQueryClickedEvent;
// Then add to SimpleEvent union
export type SimpleEvent =
| /* other events */
| DataStudioEvent
| MetabotEvent
| /* more events */;
```
### Pattern 2: Conditional Tracking
Track different events based on user action:
```typescript
const handleSave = async () => {
if (isNewItem) {
await createItem(data);
trackItemCreated(newItem.id);
} else {
await updateItem(id, data);
trackItemUpdated(id);
}
};
```
## Common Pitfalls
### Don't: Add custom fields to SimpleEvent
```typescript
// WRONG - SimpleEvent doesn't support custom fields
export const trackFiltersApplied = (filters: FilterState) => {
trackSimpleEvent({
event: "filters_applied",
data_layer: filters.dataLayer, // ❌ Not in SimpleEventSchema
data_source: filters.dataSource, // ❌ Not in SimpleEventSchema
with_owner: filters.hasOwner, // ❌ Not in SimpleEventSchema
});
};
// RIGHT - Use only standard SimpleEventSchema fields
export const trackFiltersApplied = () => {
trackSimpleEvent({
event: "filters_applied",
});
};
// Or use event_detail for a single variant
export const trackFilterApplied = (filterType: string) => {
trackSimpleEvent({
event: "filter_applied",
event_detail: filterType, // ✓ "data_layer", "data_source", etc.
});
};
```
### Don't: Forget to add event to union type
```typescript
// Define the event
export type NewFeatureClickedEvent = ValidateEvent<{
event: "new_feature_clicked";
}>;
// ❌ WRONG - Forgot to add to SimpleEvent union
// Event won't be recognized by TypeScript
// ✓ RIGHT - Add to appropriate union
export type SimpleEvent =
| /* other events */
| NewFeatureClickedEvent;
```
### Don't: Mix up event name formats
```typescript
// WRONG
event: "dataStudioLibraryCreated" // camelCase
event: "data-studio-library-created" // kebab-case
event: "Data_Studio_Library_Created" // Mixed case
// RIGHT
event: "data_studio_library_created" // snake_case
```
### Don't: Track PII or sensitive data
```typescript
// WRONG - Don't track user emails, names, or sensitive data
trackSimpleEvent({
event: "user_logged_in",
event_detail: user.email, // ❌ PII
});
// RIGHT - Track non-sensitive identifiers only
trackSimpleEvent({
event: "user_logged_in",
target_id: user.id, // ✓ Just the ID
});
```
### Don't: Forget to track both success and failure
```typescript
// WRONG - Only tracking success
try {
await saveData();
trackDataSaved();
} catch (error) {
// ❌ No tracking for failure case
}
// RIGHT - Track both outcomes
try {
await saveData();
trackDataSaved({ result: "success" });
} catch (error) {
trackDataSaved({ result: "failure" });
}
```
## Testing Analytics Events
While developing, you can verify events are firing:
1. **Check browser console** - When `SNOWPLOW_ENABLED=true` in dev, events are logged
2. **Use shouldLogAnalytics** - Set in `metabase/env` to see all analytics in console
3. **Check Snowplow debugger** - Browser extension for Snowplow events
Example console output:
```
[SNOWPLOW EVENT | event sent:true], data_studio_table_picker_filters_applied
```
## File Organization
### Where to put tracking functions:
```
Feature-specific analytics functions:
frontend/src/metabase/{feature}/analytics.ts
enterprise/frontend/src/metabase-enterprise/{feature}/analytics.ts
Event type definitions (all in one place):
frontend/src/metabase-types/analytics/event.ts
Core tracking utilities:
frontend/src/metabase/lib/analytics.ts
```
## Real-World Examples
See these files for reference:
- **Simple events**: `enterprise/frontend/src/metabase-enterprise/data-studio/analytics.ts`
- **Events with variants**: `frontend/src/metabase/dashboard/analytics.ts`
- **Complex events**: `frontend/src/metabase/query_builder/analytics.js`
- **Event type examples**: `frontend/src/metabase-types/analytics/event.ts`
## Workflow Summary
1. **Identify the user interaction** to track
2. **Decide on event name** (snake_case, descriptive)
3. **Define event type** in `event.ts` using `ValidateEvent`
4. **Add to union type** (create feature union if needed)
5. **Create tracking function** in feature's `analytics.ts`
6. **Import and call** at the interaction point
7. **Test** that events fire correctly
## Tips
- **Be specific** - `filters_applied` is better than `action_performed`
- **Use past tense** - `library_created` not `create_library`
- **Group related events** - Create feature-specific event union types
- **Track meaningful actions** - Not every click needs tracking
- **Consider the data** - What would you want to analyze later?
- **Stay consistent** - Follow existing naming patterns in the codebase
- **Document context** - Use `triggered_from` to track where the action happened

View File

@@ -61,7 +61,7 @@ Use this to scan through changes efficiently:
- [ ] Everything `^:private` unless used elsewhere
- [ ] No `declare` when avoidable (public functions near end)
- [ ] Functions under 20 lines when possible
- [ ] No blank lines within definition forms (except pairwise constructs in `let`/`cond`)
- [ ] No blank, non-comment lines within definition forms (except pairwise constructs in `let`/`cond`)
- [ ] Lines ≤ 120 characters
### Tests

View File

@@ -219,7 +219,8 @@
;; misc config for built-in linters
;;
:invalid-arity {:skip-args [metabase.lib.util.match/match]} ; TODO (cam): can we fix these?
:invalid-arity {:skip-args [metabase.lib.util.match/match
metabase.lib.util.match/match-lite]} ; TODO (cam): can we fix these?
:refer-all {:level :warning, :exclude [clojure.test]}
:unused-referred-var {:exclude {compojure.core [GET DELETE POST PUT]}}
@@ -238,7 +239,6 @@
(metabase.lib.util.match/match)
(metabase.lib.util.match/match-one)
(metabase.lib.util.match/match-lite)
(metabase.lib.util.match/match-lite-recursive)
(metabase.lib.util.match/replace)
(metabase.lib.util.match/replace-in)
(metabase.driver-api.core/match)

View File

@@ -168,7 +168,8 @@
api-routes
{:team "UX West"
:api #{metabase.api-routes.core}
:api #{metabase.api-routes.cmd
metabase.api-routes.core}
:uses :any}
app-db
@@ -263,7 +264,9 @@
config
events
models
permissions
premium-features
request
settings
util}}
@@ -365,7 +368,8 @@
collections-rest
{:team "UX West"
:api #{metabase.collections-rest.api}
:api #{metabase.collections-rest.api
metabase.collections-rest.init}
:uses #{api
app-db
collections
@@ -380,6 +384,7 @@
queries
request
revisions
settings
upload
util}}
@@ -598,7 +603,6 @@
metabase.embedding.validation}
:uses #{analytics
api
config
premium-features
server
settings
@@ -702,6 +706,7 @@
metabase.lib.binning.util
metabase.lib.card
metabase.lib.computed ; temporarily so that `qp.compile` can use it as lib memoization evolves
metabase.lib.convert ; Only so [[metabase.queries.models.card]] can set dynamic vars.
metabase.lib.core
metabase.lib.equality
metabase.lib.field
@@ -878,6 +883,7 @@
metabase.parameters.custom-values
metabase.parameters.dashboard
metabase.parameters.field
metabase.parameters.field-values
metabase.parameters.init
metabase.parameters.params
metabase.parameters.schema
@@ -916,6 +922,7 @@
{:team "UX West"
:api #{metabase.permissions-rest.api}
:uses #{api
app-db
audit-app
events
permissions
@@ -943,7 +950,8 @@
:api #{metabase.premium-features.api
metabase.premium-features.core
metabase.premium-features.init}
:uses #{api
:uses #{analytics
api
app-db
classloader
config
@@ -1005,6 +1013,7 @@
collections
config
driver
embedding
events
lib
models
@@ -1170,7 +1179,8 @@
:api #{metabase.request.core
metabase.request.init
metabase.request.schema}
:uses #{api
:uses #{analytics
api
config
embedding
permissions ; FIXME
@@ -1621,6 +1631,7 @@
lib
models
parameters
permissions
premium-features
query-processor
request
@@ -1629,7 +1640,6 @@
upload
util
warehouse-schema
warehouses-rest
xrays}}
warehouses
@@ -2058,6 +2068,7 @@
lib-be
models
native-query-snippets
parameters
permissions
premium-features
pulse
@@ -2072,7 +2083,6 @@
task
users-rest
util
warehouse-schema
warehouses-rest
enterprise/dependencies
enterprise/transforms
@@ -2280,6 +2290,7 @@
:uses #{analytics
api
app-db
channel
driver
events
lib
@@ -2289,6 +2300,7 @@
queries
query-processor
request
revisions
search
settings
sync

View File

@@ -1,9 +0,0 @@
(ns macros.metabase.server.statistics-handler-test)
(defmacro with-server
[_ _ [connector chan-start-handle chan-finish-handle chan-done-request] & body]
`(let [~connector nil
~chan-start-handle nil
~chan-finish-handle nil
~chan-done-request nil]
~@body))

View File

@@ -97,7 +97,6 @@
metabot-get-prompt-templates-url
metabot-prompt-generator-token-limit
multi-setting-read-only
notebook-native-preview-shown
notebook-native-preview-sidebar-width
notification-link-base-url
num-metabot-choices

View File

@@ -154,7 +154,6 @@
metabase.lib.util.match/match [[:inner 0]]
metabase.lib.util.match/match-one [[:inner 0]]
metabase.lib.util.match/match-lite [[:inner 0]]
metabase.lib.util.match/match-lite-recursive [[:inner 0]]
metabase.lib.util.match/replace [[:inner 0]]
metabase.lib.util.match/replace-in [[:inner 0]]
metabase.models.interface/define-batched-hydration-method [[:inner 0]]

View File

@@ -1,23 +1,35 @@
Brite
afterAll
ags
altho
Brite
cancelation
cancelations
caracteres
copyin
datas
edn
eduction
hasTable
hasTables
horizontalX
horizontalY
juxt
methodd
nd
notIn
optionA
ot
pass-thru
requestor
re-use
re-used
ser
serieses
sortings
titel
trs
trsn
tru
trun
unparseable
withs

View File

@@ -1,3 +1,24 @@
[codespell]
skip = *.csv,*.edn,*.geojson,*.json,*.tsv,*.xml,docs/developers-guide/drivers/driver-tests.md,docs/developers-guide/e2e-tests.md,docs/questions/query-builder/expressions-list.md,docs/questions/visualizations/country-codes.md,e2e/test/scenarios/admin/i18n/content-translation/constants.ts,frontend/src/cljs,frontend/src/metabase/querying/expressions/tokenizer/lezer.js,frontend/src/metabase/static-viz/constants/char-sizes.ts,frontend/src/metabase/visualizations/lib/mapping_codes.ts,modules/drivers/mongo/src/metabase/driver/mongo/operators.clj
skip =
*.csv,
*.edn,
*.geojson,
*.json,
*.tsv,
*.unit.spec.*,
*.xml,
docs/developers-guide/drivers/driver-tests.md,
docs/developers-guide/e2e-tests.md,
docs/questions/query-builder/expressions-list.md,
docs/questions/visualizations/country-codes.md,
e2e/test/scenarios/admin/i18n/content-translation/constants.ts,
frontend/src/cljs,
frontend/src/metabase/querying/expressions/tokenizer/lezer.js,
frontend/src/metabase/query_builder/components/NativeQueryEditor/CodeMirrorEditor/language.ts,
frontend/src/metabase/static-viz/constants/char-sizes.ts,
frontend/src/metabase/visualizations/lib/mapping_codes.ts,
frontend/*/mocks/*,
modules/drivers/mongo/src/metabase/driver/mongo/operators.clj,
src/metabase/analyze/classifiers/name.clj,
src/metabase/util/currency.cljc,
ignore-words = .codespellignore

View File

@@ -4,7 +4,8 @@ FROM mcr.microsoft.com/vscode/devcontainers/java:21
RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash ) \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get update && apt-get -y install --no-install-recommends nodejs yarn rlwrap fontconfig
&& apt-get update && apt-get -y install --no-install-recommends nodejs rlwrap fontconfig \
&& npm install --global yarn
# install Clojure
RUN curl https://download.clojure.org/install/linux-install-1.12.0.1488.sh | bash

View File

@@ -40,9 +40,60 @@
# DOCKER_USERNAME=your-username
# DOCKER_PASSWORD=your-access-token
# ==============================================================================
# 2. LOCAL METABASE DEVELOPMENT
# ==============================================================================
#
# Settings for running Metabase locally. Most have sensible defaults—only
# configure what you need.
# 2.1 Application Database
# ------------------------------------------------------------------------------
# Where Metabase stores its own data (dashboards, users, settings, etc.).
# https://www.metabase.com/docs/latest/installation-and-operation/configuring-application-database
# Option A: Individual connection parameters
# MB_DB_TYPE="postgres"
# MB_DB_HOST="localhost"
# MB_DB_PORT=5432
# MB_DB_DBNAME="metabase"
# MB_DB_USER="<username>"
# MB_DB_PASS="<password>"
# Option B: Single connection URI (overrides individual params)
# MB_DB_CONNECTION_URI="jdbc:postgresql://localhost:5432/metabase?user=<username>&password=<password>"
# 2.2 Server & Integrations
# ------------------------------------------------------------------------------
# https://www.metabase.com/docs/latest/configuring-metabase/customizing-jetty-webserver
# Jetty server (defaults: localhost:3000)
# MB_JETTY_HOST="localhost"
# MB_JETTY_PORT=3000
# SMTP for testing email notifications (use with maildev/maildev container)
MB_EMAIL_SMTP_HOST="localhost"
MB_EMAIL_SMTP_PORT=1025
MB_EMAIL_SMTP_USERNAME="admin"
MB_EMAIL_SMTP_PASSWORD="admin"
# 2.3 Feature Flags & Tokens
# ------------------------------------------------------------------------------
# Use staging server for license validation (avoids hitting production)
METASTORE_DEV_SERVER_URL="https://token-check.staging.metabase.com"
# Metabase license token
# Uncomment this line only when running local dev and NEVER when running Cypress
# Tests need to start from zero, and set different tokens programmatically (on-demand)
# MB_PREMIUM_EMBEDDING_TOKEN="op://Shared/Metabase License Dev Tokens/Licenses/MB_ALL_FEATURES_TOKEN"
# Skip embedding SDK build for faster frontend compilation
# SKIP_EMBEDDING_SDK="true"
# ==============================================================================
# 2. E2E / CYPRESS TESTING
# 3. E2E / CYPRESS TESTING
# ==============================================================================
#
# Configuration for running Cypress end-to-end tests locally.
@@ -54,19 +105,20 @@
# You don't _have to_ export any of these vars (except for the tokens below).
# Things will still work.
# 2.1. E2E Application Database (H2 required)
# 3.1. E2E Application Database (H2 required)
# ------------------------------------------------------------------------------
# Whether to run the enterprise or the open-source Metabase version
MB_EDITION="ee"
# Which file to use for the ephemeral testing application database?
MB_DB_FILE="./e2e/tmp/cypress-test.db"
# MB_DB_FILE="./e2e/tmp/cypress-test.db"
# Where does Cypress go to look for the application?
MB_JETTY_PORT=4000
# Where does Cypress go to look for the application? (defaults: localhost:4000)
# MB_JETTY_HOST="localhost"
# MB_JETTY_PORT=4000
# 2.2 E2E Local Runner Setup
# 3.2 E2E Local Runner Setup
# ------------------------------------------------------------------------------
# Whether to run true e2e test suite, or SDK component tests (e2e | component)
@@ -85,7 +137,7 @@ GENERATE_SNAPSHOTS="true"
# Hint: build the JAR with ./bin/build.sh
# JAR_PATH="target/uberjar/metabase.jar"
# 2.3 E2E Tokens
# 3.3 E2E Tokens
# ------------------------------------------------------------------------------
#
# These make sense for Metabase core devs only
@@ -96,7 +148,7 @@ CYPRESS_MB_STARTER_CLOUD_TOKEN="op://Shared/Metabase License Dev Tokens/Licenses
CYPRESS_MB_PRO_CLOUD_TOKEN="op://Shared/Metabase License Dev Tokens/Licenses/MB_PRO_CLOUD_TOKEN"
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN="op://Shared/Metabase License Dev Tokens/Licenses/MB_PRO_SELF_HOSTED_TOKEN"
# 2.4 E2E Misc.
# 3.4 E2E Misc.
# ------------------------------------------------------------------------------
# To make Node.js match the instance tz
@@ -106,55 +158,3 @@ TZ="US/Pacific"
# DO NOT USE Docker Desktop. Use Orbstack instead. Metabase will fail to connect
# to the dockerized Mongo QA database otherwise.
EXPERIMENTAL_DOCKER_DESKTOP_FORCE_QEMU=1
# ==============================================================================
# 3. LOCAL METABASE DEVELOPMENT
# ==============================================================================
#
# Settings for running Metabase locally. Most have sensible defaults—only
# configure what you need.
# 3.1 Application Database
# ------------------------------------------------------------------------------
# Where Metabase stores its own data (dashboards, users, settings, etc.).
# https://www.metabase.com/docs/latest/installation-and-operation/configuring-application-database
# Option A: Individual connection parameters
# MB_DB_TYPE="postgres"
# MB_DB_HOST="localhost"
# MB_DB_PORT=5432
# MB_DB_DBNAME="metabase"
# MB_DB_USER="<username>"
# MB_DB_PASS="<password>"
# Option B: Single connection URI (overrides individual params)
# MB_DB_CONNECTION_URI="jdbc:postgresql://localhost:5432/metabase?user=<username>&password=<password>"
# 3.2 Server & Integrations
# ------------------------------------------------------------------------------
# https://www.metabase.com/docs/latest/configuring-metabase/customizing-jetty-webserver
# Jetty server (defaults: localhost:3000)
# MB_JETTY_HOST="localhost"
# MB_JETTY_PORT=3000
# SMTP for testing email notifications (use with maildev/maildev container)
MB_EMAIL_SMTP_HOST="localhost"
MB_EMAIL_SMTP_PORT=1025
MB_EMAIL_SMTP_USERNAME="admin"
MB_EMAIL_SMTP_PASSWORD="admin"
# 3.3 Feature Flags & Tokens
# ------------------------------------------------------------------------------
# Use staging server for license validation (avoids hitting production)
METASTORE_DEV_SERVER_URL="https://token-check.staging.metabase.com"
# Metabase license token
# Uncomment this line only when running local dev and NEVER when running Cypress
# Tests need to start from zero, and set different tokens programmatically (on-demand)
# MB_PREMIUM_EMBEDDING_TOKEN="op://Shared/Metabase License Dev Tokens/Licenses/MB_ALL_FEATURES_TOKEN"
# Skip embedding SDK build for faster frontend compilation
# SKIP_EMBEDDING_SDK="true"

View File

@@ -38,12 +38,25 @@ runs:
const artifact_id = artifacts.data.artifacts[0].id;
const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact_id,
archive_format: 'zip',
});
let download;
const maxAttempts = 3;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact_id,
archive_format: 'zip',
});
break;
} catch (err) {
console.log(`Attempt ${attempt}/${maxAttempts} failed: ${err.message}`);
if (attempt === maxAttempts) throw err;
const delay = attempt * 15000; // 15s, 30s
console.log(`Retrying in ${delay / 1000}s...`);
await new Promise(r => setTimeout(r, delay));
}
}
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/mb.zip`, Buffer.from(download.data));

View File

@@ -0,0 +1,19 @@
name: Maximize disk space
description: Removes unused stuff from GH runner
runs:
using: "composite"
steps:
- name: Maximize build space
shell: bash
run: |
echo "-- Dotnet"
sudo rm -rf /usr/share/dotnet
echo "-- Android"
sudo rm -rf /usr/local/lib/android
echo "-- Haskell"
sudo rm -rf /opt/ghc
echo "-- CodeQL"
sudo rm -rf /opt/hostedtoolcache/CodeQL
df -h

View File

@@ -12,11 +12,18 @@ inputs:
logs-artifact-suffix:
required: false
description: Suffix to append to the test logs artifact name to avoid conflicts in matrix jobs
edition:
required: false
default: "ee"
description: Edition to test (oss or ee)
outputs:
quarantine-skipped:
description: Whether the driver test was skipped due to quarantine
value: ${{ steps.check-driver.outputs.skip }}
test-outcome:
description: "The outcome of the test run (success, failure, cancelled, skipped)"
value: ${{ steps.run-test.outcome }}
runs:
using: "composite"
@@ -61,7 +68,7 @@ runs:
MB_EDITION: ee
- name: Test database driver
if: steps.check-driver.outputs.skip != 'true'
run: clojure -X:dev:ci:ee:ee-dev:drivers:drivers-dev:test ${{ inputs.test-args }}
run: clojure -X:dev:ci:${{ inputs.edition }}:${{ inputs.edition }}-dev:drivers:drivers-dev:test ${{ inputs.test-args }}
shell: bash
id: run-test
# Trunk Quarantine controls the final state of the run in the CI!

View File

@@ -21,6 +21,8 @@ inputs:
variant:
required: false
default: ""
previous-step-outcome:
required: true
runs:
using: "composite"
@@ -57,3 +59,4 @@ runs:
dry-run: ${{ github.event_name == 'pull_request' && github.event.pull_request.draft == true }} # quarantine, but do not upload results
token: ${{ inputs.trunk-api-token }}
use-cache: true
previous-step-outcome: ${{ inputs.previous-step-outcome }}

View File

@@ -85,7 +85,9 @@ backend_ci: &backend_ci
backend_presto_kerberos:
- "**/presto_jdbc/**"
- "**/presto-jdbc/**" # the driver module has a hyphen. underscores are classpaths
- "**/presto_jdbc.clj"
- "**/presto_jdbc_test.clj"
- ".github/workflows/presto-kerberos-integration-test.yml"
backend_sources: &backend_sources

View File

@@ -68,8 +68,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -105,6 +105,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -123,6 +124,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mysql:
if: ${{ !inputs.skip }}
@@ -182,8 +184,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -227,6 +229,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -245,6 +248,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-postgres:
if: ${{ !inputs.skip }}
@@ -297,8 +301,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -336,6 +340,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }} (${{ matrix.job.name }})
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -354,6 +359,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
app-db-tests-result:
needs:

View File

@@ -88,8 +88,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -130,6 +130,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-java-tests.outcome }}
- name: Publish Test Report (JUnit)
uses: dorny/test-reporter@v1

View File

@@ -8,7 +8,7 @@ on:
workflow_dispatch:
inputs:
version:
description: 'Major version number (e.g. 52, 78, 109)'
description: "Major version number (e.g. 52, 78, 109)"
type: number
required: true
@@ -26,11 +26,14 @@ jobs:
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: release
# .github folder is needed for the prepare-release-scripts action in master
sparse-checkout: |
release
.github
fetch-depth: ${{ env.isNewReleaseBranch == 'false' && 3 || 0 }} # we need the full history to get all the commit messages
ref: master # we want the logic from master, even though we're triggering on a release branch
- name: Prepare build scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts # this action sets up bun, which is used in master, but not on versions prior to 59
- uses: actions/github-script@v7
if: ${{ env.isNewReleaseBranch == 'false' }}
name: Set milestone for single commit

View File

@@ -1,19 +1,110 @@
name: Codespell
on:
push:
branches:
- 'master'
- 'release-**'
pull_request:
schedule:
# Run nightly at 4:00 AM UTC
- cron: "0 4 * * *"
workflow_dispatch:
jobs:
codespell:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v3
- uses: codespell-project/actions-codespell@v1
- uses: actions/checkout@v4
- name: Install codespell
run: pip install codespell
- name: Set up git configuration
run: |
git config --global user.name "Claude Code[bot]"
git config --global user.email "noreply@anthropic.com"
- name: Get current date
id: date
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
- name: Run codespell check
id: codespell_check
continue-on-error: true
run: |
set -o pipefail
./bin/mage codespell 2>&1 | tee codespell_output.txt
- name: Generate GitHub App Token for Claude
if: steps.codespell_check.outcome == 'failure'
uses: actions/create-github-app-token@v1
id: claude-app-token
with:
# keep this list in sync with the list in `mage/src/mage/codespell.yml`
path: >-
docs
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
- name: Fix spelling errors with Claude Code
if: steps.codespell_check.outcome == 'failure'
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ steps.claude-app-token.outputs.token }}
prompt: |
You are tasked with fixing spelling errors detected by codespell in this repository.
## Codespell Output
The following spelling errors were detected:
```
$(cat codespell_output.txt)
```
## Instructions
1. **Review the codespell output and identify reported spelling errors** - The usual format codespell uses is `typo ==> correction`
2. **Fix every spelling error** - Use the Edit tool to fix each misspelling with the suggested correction
- If codespell suggests multiple corrections, choose the most appropriate one based on context
Human reviewers will verify the changes before merging, so fix all errors reported by codespell.
claude_args: |
--allowedTools "Write,Read,Glob,Grep,Edit,MultiEdit,Bash(cat*),Bash(ls*)"
--disallowedTools "Bash(git commit*),Bash(git push*),Bash(gh*)"
- name: Clean up temporary files
if: steps.codespell_check.outcome == 'failure'
run: rm -f codespell_output.txt
- name: Create Pull Request
if: steps.codespell_check.outcome == 'failure'
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: claude-fix/codespell-${{ steps.date.outputs.date }}
base: master
delete-branch: true
commit-message: |
Fix spelling errors detected by codespell (${{ steps.date.outputs.date }})
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
committer: "Claude Code[bot] <noreply@anthropic.com>"
author: "Claude Code[bot] <noreply@anthropic.com>"
title: "Fix spelling errors detected by codespell (${{ steps.date.outputs.date }})"
body: |
This PR automatically fixes spelling errors detected by the scheduled codespell check.
## Automated Fix
🤖 This fix was generated automatically by Claude Code based on codespell output.
**Please review carefully:**
- [ ] The spelling fixes are correct
- [ ] No code functionality was changed
- [ ] Technical terms were preserved correctly
---
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
labels: |
automated-fix
backport

View File

@@ -12,12 +12,52 @@ concurrency:
cancel-in-progress: true
jobs:
# This job will determine if the tier 3 driver tests should be skipped.
# It will always run first.
# This job determines which driver tests should run based on PR context.
# All decision logic is consolidated in mage driver-decisions.
determine-driver-skips:
runs-on: ubuntu-latest
outputs:
skip: ${{ steps.check-branch-and-files-changed.outputs.skip }}
# All driver run decisions (from mage driver-decisions)
h2-should-run: ${{ steps.driver-decisions.outputs.h2-should-run }}
athena-should-run: ${{ steps.driver-decisions.outputs.athena-should-run }}
bigquery-should-run: ${{ steps.driver-decisions.outputs.bigquery-should-run }}
clickhouse-should-run: ${{ steps.driver-decisions.outputs.clickhouse-should-run }}
databricks-should-run: ${{ steps.driver-decisions.outputs.databricks-should-run }}
druid-should-run: ${{ steps.driver-decisions.outputs.druid-should-run }}
druid-jdbc-should-run: ${{ steps.driver-decisions.outputs.druid-jdbc-should-run }}
mongo-should-run: ${{ steps.driver-decisions.outputs.mongo-should-run }}
mongo-ssl-should-run: ${{ steps.driver-decisions.outputs.mongo-ssl-should-run }}
mongo-sharded-cluster-should-run: ${{ steps.driver-decisions.outputs.mongo-sharded-cluster-should-run }}
mysql-mariadb-should-run: ${{ steps.driver-decisions.outputs.mysql-mariadb-should-run }}
oracle-should-run: ${{ steps.driver-decisions.outputs.oracle-should-run }}
postgres-should-run: ${{ steps.driver-decisions.outputs.postgres-should-run }}
presto-jdbc-should-run: ${{ steps.driver-decisions.outputs.presto-jdbc-should-run }}
redshift-should-run: ${{ steps.driver-decisions.outputs.redshift-should-run }}
snowflake-should-run: ${{ steps.driver-decisions.outputs.snowflake-should-run }}
sparksql-should-run: ${{ steps.driver-decisions.outputs.sparksql-should-run }}
sqlite-should-run: ${{ steps.driver-decisions.outputs.sqlite-should-run }}
sqlserver-should-run: ${{ steps.driver-decisions.outputs.sqlserver-should-run }}
vertica-should-run: ${{ steps.driver-decisions.outputs.vertica-should-run }}
# Per-driver quarantine conflict flags (set when driver is quarantined but has file changes)
athena-quarantine-conflict: ${{ steps.driver-decisions.outputs.athena-quarantine-conflict }}
bigquery-quarantine-conflict: ${{ steps.driver-decisions.outputs.bigquery-quarantine-conflict }}
clickhouse-quarantine-conflict: ${{ steps.driver-decisions.outputs.clickhouse-quarantine-conflict }}
databricks-quarantine-conflict: ${{ steps.driver-decisions.outputs.databricks-quarantine-conflict }}
druid-quarantine-conflict: ${{ steps.driver-decisions.outputs.druid-quarantine-conflict }}
druid-jdbc-quarantine-conflict: ${{ steps.driver-decisions.outputs.druid-jdbc-quarantine-conflict }}
mongo-quarantine-conflict: ${{ steps.driver-decisions.outputs.mongo-quarantine-conflict }}
mongo-ssl-quarantine-conflict: ${{ steps.driver-decisions.outputs.mongo-ssl-quarantine-conflict }}
mongo-sharded-cluster-quarantine-conflict: ${{ steps.driver-decisions.outputs.mongo-sharded-cluster-quarantine-conflict }}
mysql-mariadb-quarantine-conflict: ${{ steps.driver-decisions.outputs.mysql-mariadb-quarantine-conflict }}
oracle-quarantine-conflict: ${{ steps.driver-decisions.outputs.oracle-quarantine-conflict }}
postgres-quarantine-conflict: ${{ steps.driver-decisions.outputs.postgres-quarantine-conflict }}
presto-jdbc-quarantine-conflict: ${{ steps.driver-decisions.outputs.presto-jdbc-quarantine-conflict }}
redshift-quarantine-conflict: ${{ steps.driver-decisions.outputs.redshift-quarantine-conflict }}
snowflake-quarantine-conflict: ${{ steps.driver-decisions.outputs.snowflake-quarantine-conflict }}
sparksql-quarantine-conflict: ${{ steps.driver-decisions.outputs.sparksql-quarantine-conflict }}
sqlite-quarantine-conflict: ${{ steps.driver-decisions.outputs.sqlite-quarantine-conflict }}
sqlserver-quarantine-conflict: ${{ steps.driver-decisions.outputs.sqlserver-quarantine-conflict }}
vertica-quarantine-conflict: ${{ steps.driver-decisions.outputs.vertica-quarantine-conflict }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
@@ -26,29 +66,26 @@ jobs:
run: |
# Fetch the base branch to ensure its history is available for diffing
git fetch --depth=1 origin ${{ github.event.pull_request.base.ref }}:${{ github.event.pull_request.base.ref }}
# Only run this if it's a pull request and the base ref exists
- name: Check if driver tests should run
id: check-branch-and-files-changed
- name: Determine which drivers should run
id: driver-decisions
run: |
IS_MASTER_OR_RELEASE="${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release-') }}"
echo "Is master or release: ${IS_MASTER_OR_RELEASE}"
if [[ "${IS_MASTER_OR_RELEASE}" == "true" ]]; then
echo "skip=false" >> $GITHUB_OUTPUT
echo "Merging into master or a release branch. All driver tests will run."
else
echo "Checking for changes in relevant modules..."
if ./bin/mage can-skip-driver-tests "${{ github.event.pull_request.base.ref }}"; then
echo 'skip=true' >> $GITHUB_OUTPUT
else
echo 'skip=false' >> $GITHUB_OUTPUT
fi
fi
# All decision logic is in mage - it analyzes module dependencies,
# branch context, labels, and file changes to decide what runs.
MAGE_ARGS=(
--git-ref="${{ github.event.pull_request.base.ref || github.ref_name }}"
--is-master-or-release="${{ github.ref_name == 'master' || startsWith(github.ref_name, 'release-') }}"
--pr-labels="${{ join(github.event.pull_request.labels.*.name, ',') }}"
--skip="${{ inputs.skip }}"
)
# First call: show human-readable output for debugging
./bin/mage -driver-decisions "${MAGE_ARGS[@]}"
# Second call: output only key=value lines for GITHUB_OUTPUT
./bin/mage -driver-decisions "${MAGE_ARGS[@]}" --github-output-only >> $GITHUB_OUTPUT
shell: bash
be-tests-athena-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.athena-should-run == 'true' || needs.determine-driver-skips.outputs.athena-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -65,6 +102,16 @@ jobs:
MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_SECRET_KEY: ${{ secrets.MB_ATHENA_TEST_WITHOUT_GET_TABLE_METADATA_SECRET_KEY }}
name: Athena
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.athena-quarantine-conflict == 'true' }}
run: |
echo "::error::Athena driver is quarantined but you changed files in modules/drivers/athena/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Athena tests, add the label: break-quarantine-athena"
echo ""
echo "If you merge without testing, you risk breaking the Athena driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Athena driver
id: test-driver
@@ -76,7 +123,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -85,10 +132,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-bigquery-cloud-sdk-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.bigquery-should-run == 'true' || needs.determine-driver-skips.outputs.bigquery-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -99,6 +147,7 @@ jobs:
test-args: >-
:only-tags [:mb/driver-tests]
:exclude-tags [:mb/transforms-python-test]
:fail-fast? true
# DS 2025-09-26 temporarily disabled while we diagnose flakes
# - name: Transforms Python Tests
# test-args: >-
@@ -116,6 +165,16 @@ jobs:
MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING: ${{ secrets.MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING }}
name: BigQuery ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.bigquery-quarantine-conflict == 'true' }}
run: |
echo "::error::BigQuery driver is quarantined but you changed files in modules/drivers/bigquery-cloud-sdk/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run BigQuery tests, add the label: break-quarantine-bigquery"
echo ""
echo "If you merge without testing, you risk breaking the BigQuery driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -131,7 +190,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.job.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -140,6 +199,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -149,7 +209,7 @@ jobs:
be-tests-clickhouse-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.clickhouse-should-run == 'true' || needs.determine-driver-skips.outputs.clickhouse-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -173,6 +233,16 @@ jobs:
MB_CLICKHOUSE_TEST_NGINX_PORT: 8127
name: Clickhouse ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.clickhouse-quarantine-conflict == 'true' }}
run: |
echo "::error::ClickHouse driver is quarantined but you changed files in modules/drivers/clickhouse/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run ClickHouse tests, add the label: break-quarantine-clickhouse"
echo ""
echo "If you merge without testing, you risk breaking the ClickHouse driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -203,7 +273,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.job.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -212,6 +282,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -221,7 +292,7 @@ jobs:
be-tests-druid-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.druid-should-run == 'true' || needs.determine-driver-skips.outputs.druid-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -236,6 +307,16 @@ jobs:
CLUSTER_SIZE: nano-quickstart
name: Druid (Legacy)
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.druid-quarantine-conflict == 'true' }}
run: |
echo "::error::Druid driver is quarantined but you changed files in modules/drivers/druid/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Druid tests, add the label: break-quarantine-druid"
echo ""
echo "If you merge without testing, you risk breaking the Druid driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Druid driver
id: test-driver
@@ -247,7 +328,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -256,10 +337,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-druid-jdbc-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.druid-jdbc-should-run == 'true' || needs.determine-driver-skips.outputs.druid-jdbc-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -274,6 +356,16 @@ jobs:
CLUSTER_SIZE: nano-quickstart
name: Druid (JDBC)
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.druid-jdbc-quarantine-conflict == 'true' }}
run: |
echo "::error::Druid JDBC driver is quarantined but you changed files in modules/drivers/druid-jdbc/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Druid JDBC tests, add the label: break-quarantine-druid-jdbc"
echo ""
echo "If you merge without testing, you risk breaking the Druid JDBC driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Druid JDBC driver
id: test-driver
@@ -285,7 +377,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -294,10 +386,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-databricks-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.databricks-should-run == 'true' || needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -312,6 +405,16 @@ jobs:
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
name: Databricks
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
run: |
echo "::error::Databricks driver is quarantined but you changed files in modules/drivers/databricks/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Databricks tests, add the label: break-quarantine-databricks"
echo ""
echo "If you merge without testing, you risk breaking the Databricks driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Databricks driver
id: test-driver
@@ -323,7 +426,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -332,10 +435,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-databricks-multi-catalog-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.databricks-should-run == 'true' || needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -351,6 +455,16 @@ jobs:
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
name: Databricks (Multi-Catalog)
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
run: |
echo "::error::Databricks driver is quarantined but you changed files in modules/drivers/databricks/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Databricks tests, add the label: break-quarantine-databricks"
echo ""
echo "If you merge without testing, you risk breaking the Databricks driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Databricks driver with multi-catalog
id: test-driver
@@ -362,7 +476,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -371,9 +485,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-h2:
if: ${{ !inputs.skip }}
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.h2-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -391,7 +507,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -400,10 +516,43 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-h2-oss:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.h2-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
CI: 'true'
name: H2 (OSS)
steps:
- uses: actions/checkout@v4
- name: Test H2 driver (OSS)
id: test-driver
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-h2-oss'
edition: 'oss'
test-args: >-
:only-tags [:mb/driver-tests]
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mysql-mariadb:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.mysql-mariadb-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -461,8 +610,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -521,7 +670,7 @@ jobs:
:exclude-tags '[ ${{ matrix.job.exclude-tag }} ${{ env.__ADDITIONAL_EXCLUDED_TAG__ }}]'
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -530,6 +679,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: always()
uses: ./.github/actions/cleanup-python-runner
@@ -539,7 +689,7 @@ jobs:
be-tests-mongo:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.mongo-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -576,6 +726,16 @@ jobs:
MONGO_INITDB_ROOT_PASSWORD: metasample123
name: ${{ matrix.version.name }} ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.mongo-quarantine-conflict == 'true' }}
run: |
echo "::error::MongoDB driver is quarantined but you changed files in modules/drivers/mongo/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run MongoDB tests, add the label: break-quarantine-mongo"
echo ""
echo "If you merge without testing, you risk breaking the MongoDB driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -591,7 +751,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.job.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -600,6 +760,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -609,7 +770,7 @@ jobs:
be-tests-mongo-ssl:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.mongo-ssl-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-ssl-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -627,6 +788,16 @@ jobs:
MB_TEST_MONGO_REQUIRES_SSL: true
name: "${{ matrix.version.name }} (SSL)"
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.mongo-ssl-quarantine-conflict == 'true' }}
run: |
echo "::error::MongoDB SSL driver is quarantined but you changed files in modules/drivers/mongo/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run MongoDB SSL tests, add the label: break-quarantine-mongo-ssl"
echo ""
echo "If you merge without testing, you risk breaking the MongoDB SSL driver!"
exit 1
- uses: actions/checkout@v4
- name: Spin up Mongo docker container
run: >-
@@ -663,7 +834,7 @@ jobs:
:only-tags [:mb/driver-tests]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -672,10 +843,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mongo-sharded-cluster-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.mongo-sharded-cluster-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-sharded-cluster-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -688,6 +860,16 @@ jobs:
- "27017:17017"
name: MongoDB Sharded Cluster
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.mongo-sharded-cluster-quarantine-conflict == 'true' }}
run: |
echo "::error::MongoDB Sharded Cluster driver is quarantined but you changed files in modules/drivers/mongo/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run MongoDB Sharded Cluster tests, add the label: break-quarantine-mongo-sharded-cluster"
echo ""
echo "If you merge without testing, you risk breaking the MongoDB Sharded Cluster driver!"
exit 1
- uses: actions/checkout@v4
- name: Test MongoDB driver (Sharded cluster)
id: test-driver
@@ -698,7 +880,7 @@ jobs:
:only metabase.driver.mongo.sharded-cluster-test
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -707,10 +889,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-oracle:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.oracle-should-run == 'true' || needs.determine-driver-skips.outputs.oracle-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -761,6 +944,16 @@ jobs:
- "1521:${{ matrix.version.port }}"
name: ${{ matrix.version.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.oracle-quarantine-conflict == 'true' }}
run: |
echo "::error::Oracle driver is quarantined but you changed files in modules/drivers/oracle/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Oracle tests, add the label: break-quarantine-oracle"
echo ""
echo "If you merge without testing, you risk breaking the Oracle driver!"
exit 1
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
@@ -773,7 +966,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -782,10 +975,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-postgres:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.postgres-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -823,8 +1017,8 @@ jobs:
(
github.event_name == 'push' &&
(
github.ref == 'master' ||
startsWith(github.ref, 'release-')
github.ref_name == 'master' ||
startsWith(github.ref_name, 'release-')
) &&
''
) ||
@@ -871,12 +1065,13 @@ jobs:
uses: ./.github/actions/test-driver
with:
junit-name: 'be-tests-${{ matrix.version.junit-name }}'
logs-artifact-suffix: ${{ matrix.version.name }}-${{ matrix.job.name }}
test-args: >-
${{ matrix.job.test-args }}
:exclude-tags '[ ${{ matrix.job.exclude-tag }} ${{ env.__ADDITIONAL_EXCLUDED_TAG__ }}]'
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -885,6 +1080,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: always()
uses: ./.github/actions/cleanup-python-runner
@@ -894,7 +1090,7 @@ jobs:
be-tests-presto-jdbc-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.presto-jdbc-should-run == 'true' || needs.determine-driver-skips.outputs.presto-jdbc-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -917,6 +1113,16 @@ jobs:
env:
JAVA_TOOL_OPTIONS: "-Xmx2g"
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.presto-jdbc-quarantine-conflict == 'true' }}
run: |
echo "::error::Presto JDBC driver is quarantined but you changed files in modules/drivers/presto-jdbc/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Presto JDBC tests, add the label: break-quarantine-presto-jdbc"
echo ""
echo "If you merge without testing, you risk breaking the Presto JDBC driver!"
exit 1
- uses: actions/checkout@v4
- uses: ./.github/actions/await-port
with:
@@ -953,7 +1159,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -962,10 +1168,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-redshift-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.redshift-should-run == 'true' || needs.determine-driver-skips.outputs.redshift-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -1010,6 +1217,16 @@ jobs:
MB_REDSHIFT_TEST_PASSWORD: ${{ secrets.MB_REDSHIFT_TEST_PASSWORD }}
name: ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.redshift-quarantine-conflict == 'true' }}
run: |
echo "::error::Redshift driver is quarantined but you changed files in modules/drivers/redshift/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Redshift tests, add the label: break-quarantine-redshift"
echo ""
echo "If you merge without testing, you risk breaking the Redshift driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -1027,7 +1244,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.job.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: ${{ !matrix.job.skip && !cancelled() && steps.test-driver.outputs.quarantine-skipped != 'true' }}
if: ${{ !matrix.job.skip && !cancelled() }}
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1036,6 +1253,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1045,7 +1263,7 @@ jobs:
be-tests-snowflake-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.snowflake-should-run == 'true' || needs.determine-driver-skips.outputs.snowflake-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
@@ -1056,6 +1274,7 @@ jobs:
test-args: >-
:only-tags [:mb/driver-tests]
:exclude-tags [:mb/transforms-python-test]
:fail-fast? true
# DS 2025-09-26 temporarily disabled while we diagnose flakes
# - name: Transforms Python Tests
@@ -1083,6 +1302,16 @@ jobs:
MB_SNOWFLAKE_TEST_RSA_ROLE_TEST_DB: RSA_ROLE_TEST_DB
name: Snowflake ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.snowflake-quarantine-conflict == 'true' }}
run: |
echo "::error::Snowflake driver is quarantined but you changed files in modules/drivers/snowflake/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Snowflake tests, add the label: break-quarantine-snowflake"
echo ""
echo "If you merge without testing, you risk breaking the Snowflake driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -1098,7 +1327,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.job.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1107,6 +1336,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1116,7 +1346,7 @@ jobs:
be-tests-sparksql-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.sparksql-should-run == 'true' || needs.determine-driver-skips.outputs.sparksql-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -1129,6 +1359,16 @@ jobs:
- "10000:10000"
name: Spark SQL
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.sparksql-quarantine-conflict == 'true' }}
run: |
echo "::error::SparkSQL driver is quarantined but you changed files in modules/drivers/sparksql/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run SparkSQL tests, add the label: break-quarantine-sparksql"
echo ""
echo "If you merge without testing, you risk breaking the SparkSQL driver!"
exit 1
- uses: actions/checkout@v4
- name: Test Spark driver
id: test-driver
@@ -1140,7 +1380,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1149,10 +1389,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-sqlite-ee:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.sqlite-should-run == 'true' || needs.determine-driver-skips.outputs.sqlite-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -1160,6 +1401,16 @@ jobs:
DRIVERS: sqlite
name: SQLite
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.sqlite-quarantine-conflict == 'true' }}
run: |
echo "::error::SQLite driver is quarantined but you changed files in modules/drivers/sqlite/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run SQLite tests, add the label: break-quarantine-sqlite"
echo ""
echo "If you merge without testing, you risk breaking the SQLite driver!"
exit 1
- uses: actions/checkout@v4
- name: Test SQLite driver
id: test-driver
@@ -1171,7 +1422,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1180,10 +1431,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-sqlserver:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.sqlserver-should-run == 'true' || needs.determine-driver-skips.outputs.sqlserver-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
@@ -1222,6 +1474,16 @@ jobs:
MSSQL_MEMORY_LIMIT_MB: 1024
name: ${{ matrix.version.name }} ${{ matrix.job.name }}
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.sqlserver-quarantine-conflict == 'true' }}
run: |
echo "::error::SQL Server driver is quarantined but you changed files in modules/drivers/sqlserver/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run SQL Server tests, add the label: break-quarantine-sqlserver"
echo ""
echo "If you merge without testing, you risk breaking the SQL Server driver!"
exit 1
- uses: actions/checkout@v4
- name: Setup python-runner
if: ${{ matrix.job.needs-python-runner == true }}
@@ -1237,7 +1499,7 @@ jobs:
logs-artifact-suffix: ${{ matrix.version.name }}
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1246,6 +1508,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1258,7 +1521,7 @@ jobs:
# needs: determine-driver-skips
# if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
# runs-on: ubuntu-latest
# timeout-minutes: 60
# timeout-minutes: 40
# env:
# CI: 'true'
# DRIVERS: starburst
@@ -1294,7 +1557,7 @@ jobs:
login-to-ecr:
needs: determine-driver-skips
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.vertica-should-run == 'true' || needs.determine-driver-skips.outputs.vertica-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
@@ -1324,7 +1587,7 @@ jobs:
be-tests-vertica-ee:
needs: [determine-driver-skips, login-to-ecr]
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
if: ${{ needs.determine-driver-skips.outputs.vertica-should-run == 'true' || needs.determine-driver-skips.outputs.vertica-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
env:
@@ -1340,6 +1603,16 @@ jobs:
password: ${{ needs.login-to-ecr.outputs.docker_password }}
name: Vertica
steps:
- name: Fail on quarantine conflict
if: ${{ needs.determine-driver-skips.outputs.vertica-quarantine-conflict == 'true' }}
run: |
echo "::error::Vertica driver is quarantined but you changed files in modules/drivers/vertica/"
echo ""
echo "Your changes will NOT be tested because the driver is currently quarantined."
echo "To run Vertica tests, add the label: break-quarantine-vertica"
echo ""
echo "If you merge without testing, you risk breaking the Vertica driver!"
exit 1
- uses: actions/checkout@v4
- name: Make plugins directory
run: mkdir plugins
@@ -1353,7 +1626,7 @@ jobs:
:exclude-tags [:mb/transforms-python-test]
- name: Upload Test Results
uses: ./.github/actions/upload-test-results
if: always() && steps.test-driver.outputs.quarantine-skipped != 'true'
if: always()
with:
input-path: ./target/junit/
output-name: ${{ github.job }}
@@ -1362,6 +1635,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
drivers-tests-result:
needs:

View File

@@ -76,19 +76,15 @@ jobs:
timeout-minutes: 60
name: Stress test E2E flake fix
env:
DISPLAY: ""
MB_RUN_MODE: e2e
METASTORE_DEV_SERVER_URL: ${{ secrets.METASTORE_DEV_SERVER_URL }}
DISPLAY: "" # https://github.com/cypress-io/cypress/issues/4034
TERM: xterm
TZ: US/Pacific # to make Node match the instance tz
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN: ${{ secrets.STAGING_MB_PRO_SELF_HOSTED_TOKEN }}
MB_SNOWPLOW_AVAILABLE: true
MB_SNOWPLOW_URL: "http://localhost:9090" # Snowplow micro
MB_EDITION: ${{ inputs.mb_edition }}
CYPRESS_ENABLE_NETWORK_THROTTLING: ${{ inputs.enable_network_throttling }}
TERM: xterm
TZ: US/Pacific # to make node match the instance tz
steps:
- uses: actions/checkout@v4
with:
@@ -114,7 +110,6 @@ jobs:
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend

View File

@@ -29,6 +29,15 @@ on:
required: false
type: number
env:
DISPLAY: "" # https://github.com/cypress-io/cypress/issues/4034
TERM: xterm
TZ: US/Pacific # to make Node match the instance tz
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
JOB_NAME: ${{ inputs.name }}
jobs:
e2e-tests:
runs-on: ${{ inputs.runner }}
@@ -36,21 +45,12 @@ jobs:
name: e2e-tests-${{ inputs.name }}-${{ inputs.edition }}
env:
MB_EDITION: ${{ inputs.edition }}
DISPLAY: ""
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
JOB_NAME: ${{ inputs.name }}
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN: ${{ secrets.STAGING_MB_PRO_SELF_HOSTED_TOKEN }}
CYPRESS_PULL_REQUEST_ID: ${{ github.event.pull_request.number || '' }}
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
TZ: US/Pacific # to make node match the instance tz
CYPRESS_CI: true
steps:
- uses: actions/checkout@v4
with:
@@ -113,6 +113,7 @@ jobs:
run: node e2e/runner/run_cypress_ci.js snapshot
- name: Run auto-split Cypress tests on ${{ inputs.name }}
id: split-e2e
if: ${{ !inputs.specs }}
env:
SPLIT: ${{ inputs.total_chunks }}
@@ -136,6 +137,7 @@ jobs:
continue-on-error: true
- name: Run Tagged EE Cypress tests on ${{ inputs.name }}
id: tagged-e2e
if: ${{ inputs.specs }}
shell: bash
env:
@@ -165,10 +167,12 @@ jobs:
# Related to Trunk uploader
variant: e2e-tests
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ inputs.specs && steps.tagged-e2e.outcome || steps.split-e2e.outcome }}
- name: Upload Cypress Artifacts upon failure
uses: actions/upload-artifact@v4
if: failure()
if: |
!cancelled() && (steps.split-e2e.outcome == 'failure' || steps.tagged-e2e.outcome == 'failure')
with:
name: cypress-recording-${{ inputs.name }}-${{ inputs.edition }}
path: |
@@ -178,10 +182,12 @@ jobs:
- name: Upload Failed Tests
uses: actions/upload-artifact@v4
if: failure()
if: |
!cancelled() && (steps.split-e2e.outcome == 'failure' || steps.tagged-e2e.outcome == 'failure')
with:
name: failed-tests-${{ inputs.name }}-${{ inputs.edition }}
path: ./cypress/test-results
if-no-files-found: ignore
- name: Extract chunk-specific changed timings
id: extract-timings

View File

@@ -3,6 +3,12 @@ name: Embedding SDK Component Tests
on:
workflow_call:
env:
DISPLAY: "" # https://github.com/cypress-io/cypress/issues/4034
TERM: xterm
TZ: US/Pacific # to make Node match the instance tz
MB_EDITION: "ee"
jobs:
sdk-component-tests:
name: "SDK component tests (React ${{ matrix.react-version }})"
@@ -13,17 +19,12 @@ jobs:
react-version: [18, 19]
fail-fast: false
env:
MB_EDITION: ee
DISPLAY: ""
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN: ${{ secrets.STAGING_MB_PRO_SELF_HOSTED_TOKEN }}
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
TZ: US/Pacific # to make node match the instance tz
CYPRESS_CI: true
steps:
- uses: actions/checkout@v4
@@ -79,6 +80,7 @@ jobs:
run: ./bin/embedding-sdk/change-react-version.bash ${{ matrix.react-version }}
- name: Run component tests for Embedding SDK
id: run-tests
env:
CYPRESS_BROWSER: ${{ steps.cypress-prep.outputs.chrome-path }}
run: node e2e/runner/run_cypress_ci.js component
@@ -94,6 +96,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
- name: "SDK component tests > Upload Cypress Artifacts upon failure"
uses: actions/upload-artifact@v4
@@ -149,8 +152,6 @@ jobs:
runs-on: ubuntu-22.04
timeout-minutes: 45
env:
MB_EDITION: ee
DISPLAY: ""
MB_RUN_MODE: "e2e"
METASTORE_DEV_SERVER_URL: ${{ secrets.METASTORE_DEV_SERVER_URL }}
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
@@ -159,9 +160,6 @@ jobs:
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
CYPRESS_MB_PRO_SELF_HOSTED_TOKEN: ${{ secrets.STAGING_MB_PRO_SELF_HOSTED_TOKEN }}
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
TZ: US/Pacific # to make node match the instance tz
CYPRESS_CI: true
steps:
- name: Check out the code from the previous commit
@@ -232,6 +230,7 @@ jobs:
--spec "e2e/snapshot-creators/default.cy.snap.js"
- name: Run component tests for Embedding SDK
id: run-tests
env:
CYPRESS_BROWSER: ${{ steps.cypress-prep.outputs.chrome-path }}
run: |
@@ -249,6 +248,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
- name: Upload Cypress Artifacts upon failure
uses: actions/upload-artifact@v4

View File

@@ -3,6 +3,14 @@ name: "[NOT REQUIRED] SDK Compatibility tests"
on:
workflow_call:
env:
DISPLAY: "" # https://github.com/cypress-io/cypress/issues/4034
TERM: xterm
TZ: US/Pacific # to make Node match the instance tz
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
MB_EDITION: ee
jobs:
get-sample-apps-data:
runs-on: ubuntu-22.04
@@ -100,15 +108,9 @@ jobs:
name: e2e-sample-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
env:
MB_EDITION: ee
DISPLAY: ""
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
MB_RUN_MODE: e2e
METASTORE_DEV_SERVER_URL: ${{ secrets.METASTORE_DEV_SERVER_URL }}
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
TZ: US/Pacific # to make node match the instance tz
CYPRESS_CI: true
SAMPLE_APP_BRANCH_NAME: ${{ needs.get-sample-apps-data.outputs.branch_name }}
SAMPLE_APP_ENVIRONMENT: ${{ matrix.environment }}
permissions:
@@ -117,6 +119,8 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/maximize-disk-space
# We have to use the latest version that does not have this issue https://github.com/docker/compose/pull/12752
- name: Set up Docker Compose
uses: docker/setup-compose-action@v1
@@ -187,6 +191,12 @@ jobs:
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && matrix.test_suite != 'shoppy-e2e' }}
run: npx tsx ./e2e/runner/embedding-sdk/sample-apps/start-ci.ts ${{ matrix.test_suite }}
- name: Prune build cache
run: docker builder prune -af
- name: Log free disk space
run: df -h /
- name: Run e2e tests for Sample App
id: run-e2e-tests
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' }}
@@ -231,14 +241,7 @@ jobs:
timeout-minutes: 45
name: e2e-host-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
env:
MB_EDITION: ee
DISPLAY: ""
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
TZ: US/Pacific # to make node match the instance tz
CYPRESS_CI: true
HOST_APP_ENVIRONMENT: ${{ matrix.environment }}
permissions:
id-token: write

View File

@@ -90,6 +90,7 @@ jobs:
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests
id: fe-tests
run: yarn run test-unit --silent --shard=${{ matrix.shard }}/${{ env.SHARDS }}
# Trunk Quarantine controls the final state of the run in the CI!
# Even if this step fails we let it pass, and then `trunk-io/analytics-uploader` determines
@@ -106,6 +107,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.fe-tests.outcome }}
fe-tests-timezones:
if: ${{ !inputs.skip }}

View File

@@ -1,56 +0,0 @@
name: Fuzzing
on:
workflow_dispatch:
push:
branches:
- "master"
- "release-**"
paths:
- "frontend/src/metabase/querying/expressions/**"
pull_request:
paths:
- "frontend/src/metabase/querying/expressions/**"
jobs:
fe-fuzz-lexifier:
runs-on: ubuntu-22.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- run: yarn test-unit frontend/src/metabase/querying/expressions/pratt/fuzz.lexifier.unit.spec.ts
env:
MB_FUZZ: 1
name: Run fuzz testing on the lexifier
fe-fuzz-compiler:
runs-on: ubuntu-22.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- run: yarn test-unit frontend/src/metabase/querying/expressions/fuzz.compiler.unit.spec.ts
env:
MB_FUZZ: 1
name: Run fuzz testing on the custom expression compiler
fe-fuzz-string-quoting:
runs-on: ubuntu-22.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- run: yarn test-unit frontend/src/metabase/querying/expressions/fuzz.string.unit.spec.ts
env:
MB_FUZZ: 1
name: Run fuzz testing on the custom expression string quoter

View File

@@ -32,7 +32,7 @@ jobs:
runs-on: ubuntu-22.04
timeout-minutes: 60
env:
CI: 'true'
CI: "true"
DRIVERS: postgres
MB_DB_TYPE: postgres
MB_DB_PORT: 5432
@@ -53,10 +53,11 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test Postgres App DB
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: true
junit-name: 'minimal-be-tests-postgres-ee'
junit-name: "minimal-be-tests-postgres-ee"
test-args: >-
:only '["test" "enterprise/backend/test"]'
:exclude-tags '[:mb/driver-tests :mb/transforms-python-test]'
@@ -73,6 +74,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
# Postgres driver tests
postgres-driver-test:
@@ -81,7 +83,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
CI: 'true'
CI: "true"
DRIVERS: postgres
MB_DB_TYPE: postgres
MB_DB_PORT: 5432
@@ -102,9 +104,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test Postgres Driver
id: test-driver
uses: ./.github/actions/test-driver
with:
junit-name: 'minimal-be-tests-postgres-driver-ee'
junit-name: "minimal-be-tests-postgres-driver-ee"
test-args: >-
:only-tags [:mb/driver-tests]
:exclude-tags [:mb/transforms-python-test]
@@ -119,6 +122,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
# Frontend unit tests
frontend-unit-tests:
@@ -137,6 +141,7 @@ jobs:
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests
id: run-tests
run: yarn run test-unit --silent
continue-on-error: true
- name: Upload Test Results
@@ -150,6 +155,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
# Summary job
minimal-tests-result:

44
.github/workflows/openapi-check.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: OpenAPI Check
on:
pull_request:
types: [opened, synchronize, reopened, labeled, unlabeled]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
check-openapi-specs:
runs-on: ubuntu-22.04
timeout-minutes: 5
if: contains(github.event.pull_request.labels.*.name, 'openapi-self-healing')
steps:
- uses: actions/checkout@v4
with:
# we're intentionally using METABASE_AUTOMATION_USER_TOKEN to trigger the whole CI pipeline again
# after the self-healing commit is created
# if we used GITHUB_TOKEN, the self-healing commit would not trigger the CI pipeline again
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
# fetch full git history to allow fetching the latest base branch commit and comparing changes
fetch-depth: 0
- name: Setup Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22.x
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate version.properties
run: ./bin/build.sh :steps [:version]
- name: Get latest base branch commit
run: |
git fetch origin ${{ github.event.pull_request.base.ref }}
echo "LATEST_BASE_SHA=$(git rev-parse origin/${{ github.event.pull_request.base.ref }})" >> $GITHUB_ENV
- name: Check OpenAPI specs are up to date
env:
AUTO_COMMIT: "true"
PR_BRANCH: ${{ github.event.pull_request.head.ref }}
BASE_SHA: ${{ env.LATEST_BASE_SHA }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
GITHUB_SHA: ${{ github.sha }}
run: ./bin/openapi-check.sh

View File

@@ -8,9 +8,9 @@ on:
description: "Branch we want to release the SDK from (to release from other branches use the workflow from those branches)"
type: choice
required: true
default: "master"
default: "release-x.58.x"
options:
- master
- release-x.58.x
concurrency:
# We want to ensure only one job is running at a time per branch because
@@ -369,42 +369,11 @@ jobs:
name: metabase-sdk
path: sdk
- name: Compute master tag
id: compute-tag
run: |
if [ -n "${{ needs.determine-sdk-version.outputs.pre_release_label }}" ]; then
echo "masterTag=${{ needs.determine-sdk-version.outputs.pre_release_label }}" >> $GITHUB_OUTPUT
else
echo "masterTag=nightly" >> $GITHUB_OUTPUT
fi
- name: Publish to NPM
working-directory: sdk
run: |
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
TAG=$(jq -r --null-input \
--arg branch "${{ inputs.branch }}" \
--arg masterTag "${{ steps.compute-tag.outputs.masterTag }}" '
{
"master": $masterTag,
"release-x.51.x": "51-stable",
"release-x.52.x": "52-stable",
"release-x.53.x": "53-stable",
"release-x.54.x": "54-stable",
"release-x.55.x": "55-stable",
"release-x.56.x": "56-stable"
}[$branch]'
)
echo "Resolved npm tag: $TAG"
npm publish --tag "$TAG"
- name: Add `latest` tag to the latest release branch (`release-x.55.x`) deployment
if: ${{ inputs.branch == 'release-x.56.x' }}
working-directory: sdk
run: |
npm dist-tag add @metabase/embedding-sdk-react@${{ env.sdk_version }} latest
npm publish --tag 58-stable
git-tag:
needs: [publish-npm, determine-sdk-version]

View File

@@ -11,13 +11,13 @@ on:
workflow_dispatch:
inputs:
version:
description: 'Major Metabase version (e.g. 45, 52, 68)'
description: "Major Metabase version (e.g. 45, 52, 68)"
type: number
required: true
workflow_call:
inputs:
version:
description: 'Major Metabase version (e.g. 45, 52, 68)'
description: "Major Metabase version (e.g. 45, 52, 68)"
type: number # needs to be a number to pass variables
required: true
@@ -38,10 +38,10 @@ jobs:
with:
ref: master # this only works on master
fetch-depth: 0 # we want all branches and tags
- name: Install Dependencies
run: yarn --cwd release --frozen-lockfile && npm i -g tsx
- name: Build release scripts
run: yarn --cwd release build
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Install tsx
run: npm i -g tsx
- name: Get version number
uses: actions/github-script@v7
with:

View File

@@ -46,6 +46,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -64,6 +65,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-mariadb:
if: ${{ !inputs.skip }}
@@ -118,6 +120,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -136,6 +139,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-mysql:
if: ${{ !inputs.skip }}
@@ -190,6 +194,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -208,6 +213,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-postgres:
if: ${{ !inputs.skip }}
@@ -263,6 +269,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -281,6 +288,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-result:
needs:

View File

@@ -3,15 +3,15 @@ name: "Snyk"
on:
push:
branches:
- 'master'
- 'release-**'
- "master"
- "release-**"
paths:
- '**/deps.edn'
- '**/package.json'
- '.github/workflows/snyk.yml'
- '.github/scripts/write-poms.sh'
- "**/deps.edn"
- "**/package.json"
- ".github/workflows/snyk.yml"
- ".github/scripts/write-poms.sh"
schedule:
- cron: '0 5 * * *'
- cron: "0 5 * * *"
jobs:
# Generate pom.xml files for all Maven projects
@@ -45,26 +45,6 @@ jobs:
file: yarn.lock
package-manager: yarn
category: main-frontend-yarn
- name: Embedding SDK Template
file: bin/embedding-sdk/templates/yarn.lock
package-manager: yarn
category: embedding-sdk-template
- name: E2E Angular 20 Host App
file: e2e/embedding-sdk-host-apps/angular-20-host-app/package-lock.json
package-manager: npm
category: e2e-angular-host
- name: E2E Next 15 App Router
file: e2e/embedding-sdk-host-apps/next-15-app-router-host-app/package-lock.json
package-manager: npm
category: e2e-next-app-router
- name: E2E Next 15 Pages Router
file: e2e/embedding-sdk-host-apps/next-15-pages-router-host-app/package-lock.json
package-manager: npm
category: e2e-next-pages-router
- name: E2E Vite 6 Host App
file: e2e/embedding-sdk-host-apps/vite-6-host-app/package-lock.json
package-manager: npm
category: e2e-vite-host
- name: Release Helper
file: release/yarn.lock
package-manager: yarn

4
.gitignore vendored
View File

@@ -21,7 +21,8 @@
/*.mv.db
/*.trace.db
/.babel_cache
/.env
/.env*
!/.env.example
/.envrc
/.lein-env
/.lein-failures
@@ -104,6 +105,7 @@ dev/serialization_deltas/
*.tsbuildinfo
/trace-output/
/temp-types/
/frontend/src/metabase-types/openapi
**/cypress_sample_database.json
**/cypress_sample_instance_data.json

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Some files were not shown because too many files have changed in this diff Show More