Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
c45473d
fix: render SQL Server table functions as inline TVFs and list wareho…
kvlonge Nov 7, 2026
bc86f06
feat(lint): warn when SQL lint is unavailable for a dialect
kvlonge Nov 7, 2026
15b863e
fix(sqlserver): quote schema names in EXEC, end MERGE with a semicolo…
kvlonge Nov 7, 2026
57b0c20
refactor(analysis): read B101 spellings from a recorded table instead…
kvlonge Nov 7, 2026
7edf70d
feat(lint): keep L007 out of every exit decision and show it in compi…
kvlonge Nov 7, 2026
2fb4547
fix(lint): keep L007 out of rule exceptions and the plan rules gate
kvlonge Nov 7, 2026
3572408
docs(rules): name plan and build, not format, in the L007 exit note
kvlonge Nov 7, 2026
c03cec2
Merge remote-tracking branch 'origin/main' into wip/b101-function-cat…
kvlonge Nov 7, 2026
bc89e18
Merge branch 'main' into feat/lint-unavailable-warning
kvlonge Nov 7, 2026
ff7e1b9
Merge branch 'main' into fix/clickhouse-recall-sqlserver-tvf
kvlonge Nov 7, 2026
47c7a6b
test(orchestration): count the store statements a wide catalog listin…
kvlonge Nov 7, 2026
c00a9da
refactor(analysis): share diagnostic location and the catalog's optio…
kvlonge Nov 7, 2026
5aea666
Merge branch 'main' into feat/lint-unavailable-warning
kvlonge Nov 7, 2026
b620a2f
Merge branch 'main' into fix/clickhouse-recall-sqlserver-tvf
kvlonge Nov 7, 2026
355219b
Merge branch 'main' into test/catalog-statement-count
kvlonge Nov 7, 2026
2436dc7
Merge branch 'main' into refactor/b101-recorded-spellings
kvlonge Nov 7, 2026
3cd6dff
feat(contracts): prove dynamic pivots from SQLQuack parse trees
kvlonge Nov 8, 2026
db2387f
fix(contracts): refuse pivot SQL nested deeper than 512 levels before…
kvlonge Nov 8, 2026
630b2d8
wip: read rule facts with SQLQuack
kvlonge Nov 8, 2026
d9e86d0
wip: locate cast types and Snowflake date parts without a generator
kvlonge Nov 8, 2026
27e4cb4
Merge remote-tracking branch 'origin/feat/lint-unavailable-warning' i…
kvlonge Nov 8, 2026
a2909a3
wip: report built-in rules unavailable for unparsed dialects
kvlonge Nov 8, 2026
7a85582
wip: e2e for built-in rules on unparsed dialects
kvlonge Nov 8, 2026
4fad955
chore(deps): bump sqlquack to a9dde6a0
kvlonge Nov 8, 2026
adc7984
wip: docs and tests for built-in rules on unparsed dialects
kvlonge Nov 8, 2026
088bd97
wip: format tests
kvlonge Nov 8, 2026
8b2a9d3
fix(rules): refuse rule facts for statements deeper than 512 levels
kvlonge Nov 8, 2026
d9fa004
fix(rules): anchor nested comparisons and Snowflake LAST_DAY date parts
kvlonge Nov 8, 2026
449de8d
feat(scenario): map scenario column types with SQLQuack's type parsers
kvlonge Nov 8, 2026
7655ef3
fix(scenario): map SQL Server date, time, uuid and money types locally
kvlonge Nov 8, 2026
5ad2d42
Merge branch 'main' into feat/sqlquack-type-and-local-sql
kvlonge Nov 8, 2026
4637fb4
chore(fensu): allow the cast-target walk next to the other JSON tree …
kvlonge Nov 8, 2026
0352b44
refactor(rules): name the date-part and unavailable-rule loops
kvlonge Nov 8, 2026
e9221bc
Merge remote-tracking branch 'origin/main' into feat/rule-facts-sqlquack
kvlonge Nov 8, 2026
5f253c1
docs(analysis): keep the warehouse type binding's doc comment to one …
kvlonge Nov 8, 2026
28a28c5
Merge remote-tracking branch 'origin/main' into feat/sqlquack-type-an…
kvlonge Nov 8, 2026
2d146f5
feat(types): normalize adapter types without Polyglot
kvlonge Nov 8, 2026
d2e1fb8
fix(ui): stop a burst of control API requests on every live refresh
kvlonge Nov 8, 2026
9c09e54
fix(types): read only shipped dialects and ClickHouse nested parameters
kvlonge Nov 8, 2026
e0638cd
refactor(rules): read the shared-parser dialect from one lookup
kvlonge Nov 8, 2026
cb84e52
Merge main into the sqlquack bump
kvlonge Nov 8, 2026
fea889c
chore(deps): bump sqlquack to 19c51fa2
kvlonge Nov 8, 2026
183b210
build(deps): pin SQLQuack before its Snowflake grammar checks
kvlonge Nov 8, 2026
36342ee
Merge branch 'feat/sqlquack-type-and-local-sql' into feat/sqlquack-ty…
kvlonge Nov 8, 2026
7d1ef9a
fix(rules): read relation markers as tables in custom-rule syntax trees
kvlonge Nov 8, 2026
fd5faf5
Merge branch 'main' into fix/ui-refresh-burst
kvlonge Nov 8, 2026
de3cdc8
Merge fix/sql-tree-placeholder-relations (#1370)
kvlonge Nov 8, 2026
2d2eaa5
Merge feat/rule-facts-sqlquack (#1361)
kvlonge Nov 8, 2026
2a8cfa2
Merge feat/sqlquack-type-normalization (#1366)
kvlonge Nov 8, 2026
cff088f
Merge chore/sqlquack-rev-bump (#1368)
kvlonge Nov 8, 2026
a1e6b0f
build(deps): keep Windows windows-sys edges at main's resolution
kvlonge Nov 8, 2026
9d01621
docs(types): keep the ClickHouse type parameter doc comment to one line
kvlonge Nov 8, 2026
1e4aa20
feat(ui): wire the lineage and changes pages to the live control API
kvlonge Nov 8, 2026
0793704
feat(server): page the security audit newest first with actor names
kvlonge Nov 8, 2026
eb7c880
feat(ui): wire the audit log to the security audit read
kvlonge Nov 8, 2026
96ad1ba
feat(server): list people and role holdings for administrators
kvlonge Nov 8, 2026
5fa1089
feat(ui): wire the people page to the people and role reads
kvlonge Nov 8, 2026
118d6d3
fix(server): count no active sessions for a disabled person
kvlonge Nov 8, 2026
19ba7be
Merge the SQLQuack parser train into the pivot proof
kvlonge Nov 8, 2026
d27158a
fix(contracts): read relation markers as relations in dynamic pivot p…
kvlonge Nov 8, 2026
9b3282c
refactor(analysis): share the statement depth guard between pivot pro…
kvlonge Nov 8, 2026
87b8bd9
fix(contracts): keep non-dependency markers out of pivot relations
kvlonge Nov 8, 2026
42579ef
fix(types): spell ClickHouse Nullable and BINARY as the engine does
kvlonge Nov 8, 2026
6a32d49
Merge main into the SQLQuack parser train
kvlonge Nov 8, 2026
c9fa2ad
Merge main into test/catalog-statement-count
kvlonge Nov 8, 2026
1b1d0b3
Merge branch 'main' into fix/ui-refresh-burst
kvlonge Nov 8, 2026
7c64f85
Merge the SQLQuack parser train into the pivot proof
kvlonge Nov 8, 2026
5494e24
feat(server): let people read a target's location health
kvlonge Nov 8, 2026
fd39408
feat(ui): show live location health on the Locations page
kvlonge Nov 8, 2026
8dc27f1
fix(server): limit a target's health read to its own observations
kvlonge Nov 8, 2026
1f04a86
feat(server): let people read live platform problems
kvlonge Nov 8, 2026
8929fae
feat(ui): show live platform problems in the alert banner
kvlonge Nov 8, 2026
58de3d6
docs(ui): keep the locations doc comment on listLocations
kvlonge Nov 8, 2026
35f7a3a
feat(server): let role administrators read a target's role definitions
kvlonge Nov 8, 2026
a49d346
feat(ui): show role definitions on the Roles pages
kvlonge Nov 8, 2026
d220b21
feat(ui): show warehouse sync status in the top bar
kvlonge Nov 8, 2026
b12327f
fix(ui): stop rereading warehouse sync after a refused read
kvlonge Nov 8, 2026
03b49ca
fix(rules): wrap Snowflake table functions in TABLE( ) before parsing
kvlonge Nov 8, 2026
a84c6ea
Merge origin/main into the platform and admin slices
kvlonge Nov 8, 2026
689deba
fix(rules): read Snowflake table function markers inside TABLE( ) in …
kvlonge Nov 8, 2026
5974f71
feat(ui): show catalog node detail from the control API and finish li…
kvlonge Nov 8, 2026
a1d030b
Merge remote-tracking branch 'origin/main' into fix/ui-refresh-burst
kvlonge Nov 8, 2026
f729c4c
fix(ui): ask for refused node SQL once until reload
kvlonge Nov 8, 2026
5b2b272
fix(rules): keep columns after a wrapped table function in rule trees
kvlonge Nov 8, 2026
001d78c
fix(ui): wrap SQL previews and drop the kind prefix from SQL file labels
kvlonge Nov 8, 2026
2994b2a
feat: publish column lineage and show it on catalog node pages
kvlonge Nov 8, 2026
2c59909
fix(ui): show full names and transform kinds in column lineage
kvlonge Nov 8, 2026
2ff5a9e
refactor: move column lineage to its own change
kvlonge Nov 8, 2026
c8e186b
Merge branch 'main' into test/catalog-statement-count
kvlonge Nov 8, 2026
2cd8757
feat: show per-node run history and selecting jobs on catalog node pages
kvlonge Nov 8, 2026
b5f41d4
feat(orchestration): gzip location snapshot publishes
kvlonge Nov 8, 2026
e9a8dde
feat: show run events, statements, SQL and output to people
kvlonge Nov 8, 2026
bff5f8c
feat: require run.prioritise for runs above priority 0
kvlonge Nov 8, 2026
d10bd28
fix(orchestration): report the server's refusal of a snapshot too lar…
kvlonge Nov 8, 2026
19a4005
fix(orchestration): bound decompressed publish bodies at 320 MiB
kvlonge Nov 8, 2026
32abf51
fix: keep run cancellation independent of run.prioritise
kvlonge Nov 8, 2026
58abe6f
test: wait for every trigger to reach the latest due time after sched…
kvlonge Nov 8, 2026
6abe6a0
test: count ticks scheduled after their own evaluation as off schedule
kvlonge Nov 8, 2026
e8df6e4
ci: run the full Verify matrix only on pull requests labelled full-ve…
kvlonge Nov 8, 2026
deed388
Merge feat/gzip-location-publish into the combined delivery
kvlonge Nov 8, 2026
0ba6b92
Merge fix/scheduler-fault-catch-up into the combined delivery
kvlonge Nov 8, 2026
b072d05
Merge test/catalog-statement-count into the combined delivery
kvlonge Nov 8, 2026
6f4ec9c
Merge fix/clickhouse-recall-sqlserver-tvf into the combined delivery
kvlonge Nov 8, 2026
6639e64
Merge chore/sqlquack-parser-train into the combined delivery
kvlonge Nov 8, 2026
7fc70b1
Merge refactor/b101-recorded-spellings into the combined delivery
kvlonge Nov 8, 2026
bfd5cfc
Merge feat/pivot-sqlquack into the combined delivery
kvlonge Nov 8, 2026
30914da
Merge feat/run-prioritise into the combined delivery
kvlonge Nov 8, 2026
ffe352d
Merge feat/ui-warehouse-sync into the combined delivery
kvlonge Nov 8, 2026
24aba79
Merge fix/ui-refresh-burst into the combined delivery
kvlonge Nov 8, 2026
ef60acc
feat: run ad-hoc sqb commands from the web UI
kvlonge Nov 8, 2026
05cd1ab
ci: keep the Verify aggregate on always()
kvlonge Nov 8, 2026
096dbdb
Merge feat/adhoc-commands into the combined delivery
kvlonge Nov 8, 2026
5f82f19
refactor(orchestration): page security audit facts beside the audit w…
kvlonge Nov 8, 2026
aeed1ce
test(ci): prove a fast-core or label-only Verify run cannot satisfy t…
kvlonge Nov 8, 2026
ac8c917
Merge origin/main into the combined delivery
kvlonge Nov 8, 2026
304af88
Merge feat/ui-run-reads into the combined delivery
kvlonge Nov 8, 2026
f757fa2
fix(ui): find an ad-hoc run launched while a runs listing is in flight
kvlonge Nov 8, 2026
3a75079
Merge origin/main into the combined delivery
kvlonge Nov 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
130 changes: 112 additions & 18 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,34 @@ name: Verify

on:
pull_request:
# Labelling a pull request `full-verify` (or removing the label) changes how much it runs.
types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled]
merge_group:
workflow_dispatch:

permissions:
contents: read

# Each merge group has its own gh-readonly-queue ref, so queued groups never cancel each other; the
# queue itself discards a group's run when it rebuilds the group.
# queue itself discards a group's run when it rebuilds the group. A push to a pull request cancels
# its older run. Adding or removing any label other than `full-verify` starts a run in a group of its
# own that verifies nothing, so it never cancels the pull request's real run.
concurrency:
group: verify-${{ github.workflow }}-${{ github.event.merge_group.head_ref || github.ref }}
group: >-
verify-${{ github.workflow }}-${{ github.event.merge_group.head_ref || github.ref }}${{
(github.event.action == 'labeled' || github.event.action == 'unlabeled')
&& github.event.label.name != 'full-verify' && format('-label-{0}', github.run_id) || '' }}
cancel-in-progress: ${{ github.event_name != 'merge_group' }}

jobs:
changes:
name: Classify verification scope
# A label other than `full-verify` changes nothing this workflow verifies.
if: ${{ !((github.event.action == 'labeled' || github.event.action == 'unlabeled') && github.event.label.name != 'full-verify') }}
runs-on: ubuntu-24.04
outputs:
full: ${{ steps.depth.outputs.full }}
partial: ${{ steps.depth.outputs.partial }}
checks: ${{ steps.scope.outputs.checks }}
compiler_differential: ${{ steps.scope.outputs.compiler_differential }}
duckdb: ${{ steps.scope.outputs.duckdb }}
Expand Down Expand Up @@ -138,6 +149,9 @@ jobs:
# skill pages generated from the website docs skips the Python checks and test suites.
# The website builds in its own workflow.
docs_only=true
# A change that only touches the web UI (and documentation) runs the UI checks and the
# wheels that embed its build, but not the Python and native checks it cannot affect.
ui_only=true
while IFS= read -r -d '' path; do
changed=true
case "${path}" in
Expand All @@ -147,6 +161,13 @@ jobs:
*.md) ;;
*) docs_only=false ;;
esac
case "${path}" in
ui/*|website/*|.github/workflows/website.yml|.github/demos/*) ;;
src/sqlbuild/.agents/skills/sqlbuild/references/docs/*.md) ;;
*/*) ui_only=false ;;
*.md) ;;
*) ui_only=false ;;
esac
case "${path}" in
crates/*|ui/*|Cargo.toml|Cargo.lock|pyproject.toml|.github/workflows/verify.yml|.github/workflows/build-distributions.yml|deploy/Dockerfile|deploy/project/*|deploy/compose*|compose.yml|.dockerignore|Makefile|tests/integration/src/sqlbuild/compiler/compiled_project/publication/test_compose.py|tests/integration/src/sqlbuild/compiler/compiled_project/publication/docker/compose/*|benchmarks/duckshop/edge_cases/orchestration/container_deployment.json)
wheels=true
Expand Down Expand Up @@ -232,7 +253,7 @@ jobs:
fi

checks=true
if [[ "${docs_only}" == "true" ]]; then
if [[ "${docs_only}" == "true" || "${ui_only}" == "true" ]]; then
checks=false
fi

Expand All @@ -256,8 +277,36 @@ jobs:
"${recovery}" \
"${ui}"

# Pull requests run the fast Linux core: static checks, unit and integration tests, native
# workspace checks and the UI checks. The rest of the matrix (wheels, Compose, Windows, macOS,
# DuckDB E2E, warehouse, compiler-golden and timing jobs) runs only once a pull request is
# labelled `full-verify` and is not a draft, and always on merge groups and manual runs. A
# run that leaves out suites its change needs reports under another name, so the required
# Verify stays missing and blocks the merge until the full matrix has passed.
- name: Choose the fast core or the full matrix
id: depth
env:
FULL: >-
${{ github.event_name != 'pull_request'
|| (contains(github.event.pull_request.labels.*.name, 'full-verify')
&& !github.event.pull_request.draft) }}
HEAVY_SELECTED: >-
${{ steps.scope.outputs.duckdb == 'true' || steps.scope.outputs.postgres == 'true' || steps.scope.outputs.clickhouse == 'true' || steps.scope.outputs.performance == 'true' || steps.scope.outputs.format_performance == 'true' || steps.scope.outputs.rules_performance == 'true' || steps.scope.outputs.wheels == 'true' || steps.scope.outputs.compiler_differential == 'true' || steps.scope.outputs.recovery == 'true' }}
run: |
partial=false
if [[ "${FULL}" != "true" && "${HEAVY_SELECTED}" == "true" ]]; then
partial=true
echo "Fast core only: label the pull request full-verify to run the full matrix Verify needs" \
| tee -a "${GITHUB_STEP_SUMMARY}"
fi
{
echo "full=${FULL}"
echo "partial=${partial}"
} >> "${GITHUB_OUTPUT}"

lockfile:
name: Lockfile consistency
if: ${{ !((github.event.action == 'labeled' || github.event.action == 'unlabeled') && github.event.label.name != 'full-verify') }}
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -365,7 +414,7 @@ jobs:
e2e_shards:
name: DuckDB E2E (${{ matrix.name }})
needs: [changes, lockfile]
if: needs.changes.outputs.duckdb == 'true'
if: needs.changes.outputs.duckdb == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
Expand Down Expand Up @@ -442,7 +491,7 @@ jobs:
compiler_differential:
name: Compiler golden outputs
needs: [changes, lockfile]
if: needs.changes.outputs.compiler_differential == 'true'
if: needs.changes.outputs.compiler_differential == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
Expand Down Expand Up @@ -483,7 +532,7 @@ jobs:
compiler_differential_python_versions:
name: Native compiler on Python ${{ matrix.python }}
needs: [changes, lockfile]
if: needs.changes.outputs.compiler_differential == 'true'
if: needs.changes.outputs.compiler_differential == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
Expand Down Expand Up @@ -523,7 +572,7 @@ jobs:
native_discovery_windows:
name: Native compiler on Windows
needs: [changes, lockfile]
if: needs.changes.outputs.compiler_differential == 'true'
if: needs.changes.outputs.compiler_differential == 'true' && needs.changes.outputs.full == 'true'
runs-on: windows-2025
timeout-minutes: 45
defaults:
Expand Down Expand Up @@ -580,7 +629,7 @@ jobs:
scheduler_recovery:
name: Scheduler recovery (${{ matrix.name }})
needs: [changes, lockfile]
if: needs.changes.outputs.recovery == 'true'
if: needs.changes.outputs.recovery == 'true' && needs.changes.outputs.full == 'true'
runs-on: ${{ matrix.runner }}
timeout-minutes: 75
strategy:
Expand Down Expand Up @@ -632,7 +681,7 @@ jobs:
format_performance:
name: Formatter performance guards
needs: [changes, lockfile]
if: needs.changes.outputs.format_performance == 'true'
if: needs.changes.outputs.format_performance == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
Expand Down Expand Up @@ -696,7 +745,7 @@ jobs:
cold_compile_performance:
name: Fresh-process compile (${{ matrix.models }} models)
needs: [changes, lockfile]
if: needs.changes.outputs.performance == 'true'
if: needs.changes.outputs.performance == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
Expand Down Expand Up @@ -747,7 +796,7 @@ jobs:
dense_compile_performance:
name: Dense all-rules compile (${{ matrix.models }} models)
needs: [changes, lockfile]
if: needs.changes.outputs.performance == 'true'
if: needs.changes.outputs.performance == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
# The 3k and 10k cells also run the delta edit-loop guard, about five minutes at 10k.
timeout-minutes: 45
Expand Down Expand Up @@ -791,7 +840,7 @@ jobs:
compile_performance_ratio:
name: Same-runner compile ratio (${{ matrix.label || matrix.kind }} 3000 models)
needs: [changes, lockfile]
if: needs.changes.outputs.performance == 'true'
if: needs.changes.outputs.performance == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
Expand Down Expand Up @@ -894,7 +943,7 @@ jobs:
cache_compile_performance:
name: Fresh-process compile cache (${{ matrix.models }} models)
needs: [changes, lockfile]
if: needs.changes.outputs.performance == 'true'
if: needs.changes.outputs.performance == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
Expand Down Expand Up @@ -1019,7 +1068,7 @@ jobs:
postgres:
name: PostgreSQL integration and E2E tests
needs: [changes, lockfile]
if: needs.changes.outputs.postgres == 'true'
if: needs.changes.outputs.postgres == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
Expand Down Expand Up @@ -1056,7 +1105,7 @@ jobs:
clickhouse:
name: ClickHouse integration and E2E tests
needs: [changes, lockfile]
if: needs.changes.outputs.clickhouse == 'true'
if: needs.changes.outputs.clickhouse == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
Expand Down Expand Up @@ -1093,7 +1142,7 @@ jobs:
wheels:
name: Wheels
needs: [changes]
if: needs.changes.outputs.wheels == 'true'
if: needs.changes.outputs.wheels == 'true' && needs.changes.outputs.full == 'true'
uses: ./.github/workflows/build-distributions.yml
with:
sdist: false
Expand All @@ -1105,7 +1154,7 @@ jobs:
compose:
name: Packaged Compose lifecycle
needs: [changes, lockfile, wheels]
if: needs.changes.outputs.wheels == 'true'
if: needs.changes.outputs.wheels == 'true' && needs.changes.outputs.full == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
Expand Down Expand Up @@ -1158,11 +1207,16 @@ jobs:
# metadata-only pass can never satisfy Verify first; a skipped job would count as passing, so
# the job always runs and only its name changes. Until those checks post Verify on the head,
# the pull request waits for an expected check, and every new push to the branch waits again.
# The same holds for a fast-core run that leaves out suites its change needs, and for a run
# started by an unrelated label: neither reports as Verify.
name: >-
${{ (github.event_name == 'pull_request'
&& github.event.pull_request.head.repo.full_name == github.repository
&& startsWith(github.event.pull_request.head.ref, 'release-please--branches--'))
&& 'Release pull request suites' || 'Verify' }}
&& 'Release pull request suites'
|| ((github.event.action == 'labeled' || github.event.action == 'unlabeled') && github.event.label.name != 'full-verify') && 'Label change (nothing verified)'
|| needs.changes.outputs.partial == 'true' && 'Fast core (label full-verify for Verify)'
|| 'Verify' }}
if: always()
needs:
[
Expand Down Expand Up @@ -1215,7 +1269,21 @@ jobs:
COMPOSE_RESULT: ${{ needs.compose.result }}
UI_SELECTED: ${{ needs.changes.outputs.ui }}
UI_RESULT: ${{ needs.ui.result }}
LABEL_ONLY: ${{ (github.event.action == 'labeled' || github.event.action == 'unlabeled') && github.event.label.name != 'full-verify' }}
PARTIAL: ${{ needs.changes.outputs.partial }}
DUCKDB_SELECTED: ${{ needs.changes.outputs.duckdb }}
COMPILER_DIFFERENTIAL_SELECTED: ${{ needs.changes.outputs.compiler_differential }}
RECOVERY_SELECTED: ${{ needs.changes.outputs.recovery }}
FORMAT_PERFORMANCE_SELECTED: ${{ needs.changes.outputs.format_performance }}
PERFORMANCE_SELECTED: ${{ needs.changes.outputs.performance }}
POSTGRES_SELECTED: ${{ needs.changes.outputs.postgres }}
CLICKHOUSE_SELECTED: ${{ needs.changes.outputs.clickhouse }}
WHEELS_SELECTED: ${{ needs.changes.outputs.wheels }}
run: |
if [[ "${LABEL_ONLY}" == "true" ]]; then
echo "A label other than full-verify changed; this run verifies nothing"
exit 0
fi
if [[ "${CHANGES_RESULT}" != "success" || "${LOCKFILE_RESULT}" != "success" ]]; then
echo "Required classification or lockfile checks did not pass" >&2
exit 1
Expand Down Expand Up @@ -1258,4 +1326,30 @@ jobs:
echo "Required UI checks did not pass: ${UI_RESULT}" >&2
exit 1
fi
# A full run must have run every suite its change selected; a skip here is never a pass.
if [[ "${PARTIAL}" != "true" ]]; then
for pair in \
"${DUCKDB_SELECTED}:${E2E_SHARDS_RESULT}" \
"${COMPILER_DIFFERENTIAL_SELECTED}:${COMPILER_DIFFERENTIAL_RESULT}" \
"${COMPILER_DIFFERENTIAL_SELECTED}:${COMPILER_DIFFERENTIAL_PYTHON_VERSIONS_RESULT}" \
"${COMPILER_DIFFERENTIAL_SELECTED}:${NATIVE_DISCOVERY_WINDOWS_RESULT}" \
"${RECOVERY_SELECTED}:${SCHEDULER_RECOVERY_RESULT}" \
"${FORMAT_PERFORMANCE_SELECTED}:${FORMAT_PERFORMANCE_RESULT}" \
"${PERFORMANCE_SELECTED}:${COLD_COMPILE_PERFORMANCE_RESULT}" \
"${PERFORMANCE_SELECTED}:${DENSE_COMPILE_PERFORMANCE_RESULT}" \
"${PERFORMANCE_SELECTED}:${COMPILE_PERFORMANCE_RATIO_RESULT}" \
"${PERFORMANCE_SELECTED}:${CACHE_COMPILE_PERFORMANCE_RESULT}" \
"${POSTGRES_SELECTED}:${POSTGRES_RESULT}" \
"${CLICKHOUSE_SELECTED}:${CLICKHOUSE_RESULT}" \
"${WHEELS_SELECTED}:${WHEELS_RESULT}" \
"${WHEELS_SELECTED}:${COMPOSE_RESULT}"; do
if [[ "${pair%%:*}" == "true" && "${pair#*:}" != "success" ]]; then
echo "A suite this change needs did not run to success: ${pair#*:}" >&2
exit 1
fi
done
else
echo "Fast core passed; the full matrix runs once the pull request is labelled full-verify"
exit 0
fi
echo "All path-relevant verification jobs passed"
8 changes: 8 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ For broader validation, run:
make verify
```

In CI, every push to a pull request runs a fast Linux core: static checks, unit and integration
tests and native workspace checks, plus the UI checks for UI changes. A change confined to the web
UI and documentation runs only the UI checks. The full matrix (wheels, Compose, Windows, macOS,
DuckDB end-to-end, warehouse, compiler-golden and timing jobs) runs once a maintainer labels a
pull request that is not a draft `full-verify`, normally when it is next to merge. The required
`Verify` check only reports after every suite the change needs has passed, so a pull request that
needs the full matrix cannot merge until it has run.

For focused iteration, run the narrowest relevant pytest target, for example:

```bash
Expand Down
Loading
Loading