Skip to content

ci(perf): gate LintRW, LintRule L007/L010 and ParseError in the shadow suite - #927

Merged
ajitpratap0 merged 4 commits into
mainfrom
perf/gate-suite-lint
Nov 3, 2026
Merged

ajitpratap0 merged 4 commits into
mainfrom
perf/gate-suite-lint

Conversation

@ajitpratap0

@ajitpratap0 ajitpratap0 commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Summary

Adds three lines to scripts/perf/gate-suite.txt so the PR-run gate measures benchmarks that open PRs target:

Without these lines, none of those PRs can be accepted or closed on an amd64 verdict (PLAN 5.3 rule 5).

Test Plan

  • go test -count=1 ./scripts/perf/... passes.
  • Every regex was checked to match existing sub-benchmarks with -benchtime 1x.
  • The CI shadow gate on this PR should list the new rows.

Breaking Changes

None (CI configuration only).

🤖 Generated with Claude Code

https://claude.ai/code/session_01DnbRnTFErhoMJdAjVEeCg2

PR #906's gate run moved 0 of 26 benchmarks because no linter benchmark was
gated. Add it so W6-05b, W6-06 and W6-07 are measured by the PR-run gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DnbRnTFErhoMJdAjVEeCg2
@vercel

vercel Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
gosqlx-website Ready Ready Preview Nov 3, 2026 4:53am UTC

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Claude finished @ajitpratap0's task in 20s —— View job


Review of PR #927

Verdict: LGTM.

The change adds one line to scripts/perf/gate-suite.txt: ./pkg/linter ^BenchmarkLintRW$. I read the diff and the benchmark. I didn't run the tests or the gate.

  • Benchmark exists: BenchmarkLintRW is at pkg/linter/bench_matrix_test.go:156. The regex is anchored with ^...$, so it won't also match BenchmarkLintPhase or other benchmarks with the same prefix.
  • Format: The line matches the existing <package> <regex> convention. Using only the top-level name runs every dialect sub-benchmark. The ParseRW line instead restricts to the medium bucket.
  • Cost: It runs all dialects over every real-world statement, so it adds more CI time per round than a narrowed filter would. If the shadow gate gets slow, you could narrow it to a subset of dialects, as ParseRW does. That isn't needed for this PR.
  • Noise: BenchmarkLintRW calls gosqlx.LintWithDialect on each statement, which includes tokenizing and parsing. Parse regressions will therefore also move this benchmark, in addition to ParseRW. That's intended for measuring W6-05b/06/07, but remember it when you triage a gate failure.
  • Suite header: The header comment says "first slice of the PLAN section 2.6 suite: parse end to end, tokenizer…". It doesn't mention the linter. You could update it, but this is optional.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Perf gate: PASS (shadow mode: report only, this check never fails)

Base a0905bf500ab, head 3efc5f61395e. 10 interleaved rounds, benchtime 200ms, -cpu 1, pinned to CPU 3 (SMT siblings 2-3) with taskset.

  • no gated metric moved past its threshold

Rules: time regresses at >= +3% with p < 0.01 (Mann-Whitney U), or a suite geomean >= +1.5% (per-round geomeans, same test); allocs/op must not increase; B/op must not rise more than 2%; instructions/op must not rise more than 1.5%. An A/A control with more than 10% of benchmarks moving over 3% is noisy: re-run once, then inconclusive (neutral).

Gated suite (GOGC=off, GOMAXPROCS=1)

benchmark time p A/A B/op allocs/op status
ParseE2E/simple_select +0.31% 0.470 +0.21% +0.00% 5 → 5 ok
ParseE2E/select_where +0.85% 0.049 -0.18% +0.00% 18 → 18 ok
ParseE2E/join +0.07% 0.734 -0.65% +0.00% 17 → 17 ok
ParseE2E/aggregate +0.48% 0.734 -0.20% +0.00% 18 → 18 ok
ParseE2E/subquery -0.13% 0.677 -0.22% +0.00% 14 → 14 ok
ParseE2E/cte +0.61% 0.054 +0.58% +0.00% 21 → 21 ok
ParseE2E/window +0.60% 0.130 +0.08% +0.00% 11 → 11 ok
ParseE2E/complex +0.39% 0.393 -0.46% +0.00% 50 → 50 ok
ParseE2E/insert +0.24% 0.212 +0.33% +0.00% 17 → 17 ok
ParseE2E/update +0.13% 0.472 +0.15% +0.00% 13 → 13 ok
ParseE2E/delete +0.91% 0.198 +0.12% +0.00% 5 → 5 ok
ParseRW/postgresql/medium +2.09% 0.011 +0.75% +0.00% 646 → 646 ok
ParseRW/mysql/medium +1.08% 0.218 +1.07% +0.00% 365 → 365 ok
ParseRW/mariadb/medium -0.16% 0.529 -0.11% +0.00% 523 → 523 ok
ParseRW/sqlserver/medium -0.38% 0.739 -0.54% +0.00% 928 → 928 ok
ParseRW/oracle/medium +0.51% 0.393 +0.36% +0.00% 1093 → 1093 ok
ParseRW/sqlite/medium +0.49% 0.393 +0.65% +0.00% 346 → 346 ok
ParseRW/snowflake/medium +0.33% 0.353 +0.84% +0.00% 777 → 777 ok
ParseRW/clickhouse/medium -0.50% 0.739 +0.33% +0.00% 384 → 384 ok
ParseFresh/simple_select +0.82% 0.006 -0.29% +0.00% 6 → 6 ok
ParseFresh/join +0.49% 0.579 +0.03% +0.00% 18 → 18 ok
ParseFresh/complex -0.17% 1.000 +0.02% +0.00% 51 → 51 ok
PoolGetPut/serial +0.19% 0.449 -0.05% +0.00% 0 → 0 ok
Tokenize/scratch/join -0.07% 0.404 -0.03% +0.00% 0 → 0 ok
Tokenize/scratch/complex -0.43% 0.063 -0.19% +0.00% 0 → 0 ok
Tokenize/scratch/insert -0.91% 0.002 +0.07% +0.00% 0 → 0 ok
Normalize/simple_select -0.57% 0.021 +0.28% +0.00% 7 → 7 ok
Normalize/join +0.08% 0.739 +0.22% +0.00% 23 → 23 ok
Normalize/complex -0.03% 0.597 -0.13% +0.00% 69 → 69 ok
TransformParse/simple_select -0.25% 0.240 +0.44% +0.00% 5 → 5 ok
TransformParse/join +0.31% 0.850 +0.28% +0.00% 17 → 17 ok
TransformParse/complex -0.03% 0.940 +0.06% +0.00% 50 → 50 ok
LintRW/postgresql +0.95% 0.481 -0.45% +0.00% 36481 → 36481 ok
LintRW/mysql +0.65% 0.631 +0.24% -0.00% 44192 → 44192 ok
LintRW/mariadb +1.76% 0.353 -0.67% -0.00% 40735 → 40735 ok
LintRW/sqlserver +1.16% 0.190 +0.35% +0.00% 36897 → 36897 ok
LintRW/oracle +1.52% 0.075 +1.93% +0.00% 45294 → 45293.5 ok
LintRW/sqlite -0.19% 0.971 -0.45% -0.00% 40582 → 40582 ok
LintRW/snowflake -0.14% 0.912 -0.93% +0.00% 39843 → 39844 ok
LintRW/clickhouse +1.49% 0.280 +0.14% -0.00% 44998 → 44998 ok
LintRule/L007 +0.52% 0.529 +0.24% +0.00% 72565 → 72565 ok
LintRule/L010 +0.37% 0.353 +0.55% +0.00% 20758 → 20758 ok
ParseError/syntax_mid/parse +1.36% 0.075 +0.72% +0.00% 21 → 21 ok
ParseError/syntax_mid/validate +0.73% 0.226 +0.65% +0.00% 21 → 21 ok
ParseError/syntax_end/parse +1.22% 0.140 +0.51% +0.00% 25 → 25 ok
ParseError/syntax_end/validate +1.46% 0.029 +1.15% +0.00% 25 → 25 ok
ParseError/tokenize/parse +0.49% 0.173 -0.26% +0.00% 19 → 19 ok
ParseError/tokenize/validate +0.18% 0.545 +0.26% +0.00% 30 → 30 ok
ParseError/long_prefix/parse +0.02% 0.912 +0.17% -0.00% 229 → 229 ok
ParseError/long_prefix/validate +0.27% 0.280 +0.25% +0.00% 229 → 229 ok
geomean +0.42% 0.393 +0.16%

A/A control: 0 of 50 benchmarks moved more than 3%.

Instructions per operation (cmd/perfdriver)

case instructions/op status
e2e/aggregate -0.01% ok
e2e/complex +0.01% ok
e2e/cte +0.02% ok
e2e/delete -0.06% ok
e2e/insert +0.02% ok
e2e/join +0.03% ok
e2e/select_where -0.02% ok
e2e/simple_select +0.22% ok
e2e/subquery -0.13% ok
e2e/update -0.07% ok
e2e/window -0.03% ok
rw/postgresql/medium -0.05% ok
Secondary metric: default GC, GOMAXPROCS=1 (informational)
benchmark time p
ParseE2E/simple_select +2.58% 0.280
ParseE2E/select_where +0.68% 0.290
ParseE2E/join +3.02% 0.739
ParseE2E/aggregate +1.00% 0.450
ParseE2E/subquery +0.63% 0.436
ParseE2E/cte +0.68% 0.650
ParseE2E/window +1.21% 0.450
ParseE2E/complex +0.25% 0.971
ParseE2E/insert -0.14% 0.970
ParseE2E/update -1.11% 0.481
ParseE2E/delete +0.26% 0.910
ParseRW/postgresql/medium -2.25% 0.796
ParseRW/mysql/medium -1.20% 0.315
ParseRW/mariadb/medium -1.08% 0.436
ParseRW/sqlserver/medium -0.35% 1.000
ParseRW/oracle/medium +0.48% 0.353
ParseRW/sqlite/medium -0.47% 0.481
ParseRW/snowflake/medium +1.33% 0.315
ParseRW/clickhouse/medium +1.51% 0.247
ParseFresh/simple_select +1.18% 0.011
ParseFresh/join -0.05% 0.739
ParseFresh/complex -1.32% 0.739
PoolGetPut/serial -0.04% 0.739
Tokenize/scratch/join -0.17% 0.402
Tokenize/scratch/complex -0.51% 0.037
Tokenize/scratch/insert -0.74% <0.001
Normalize/simple_select -0.87% 0.218
Normalize/join +1.78% 0.315
Normalize/complex +0.08% 0.912
TransformParse/simple_select -1.23% 0.623
TransformParse/join -0.16% 0.912
TransformParse/complex -0.73% 0.143
LintRW/postgresql +0.76% 0.912
LintRW/mysql +1.81% 0.218
LintRW/mariadb +1.56% 0.912
LintRW/sqlserver +1.20% 0.481
LintRW/oracle +2.01% 0.684
LintRW/sqlite -0.34% 0.684
LintRW/snowflake +2.85% 0.190
LintRW/clickhouse -0.19% 0.853
LintRule/L007 +0.27% 0.912
LintRule/L010 +0.70% 0.165
ParseError/syntax_mid/parse +0.83% 0.273
ParseError/syntax_mid/validate +0.17% 0.910
ParseError/syntax_end/parse +2.98% 0.038
ParseError/syntax_end/validate +2.68% 0.307
ParseError/tokenize/parse -0.21% 0.910
ParseError/tokenize/validate +0.38% 0.579
ParseError/long_prefix/parse -0.11% 0.393
ParseError/long_prefix/validate -0.63% 0.971
geomean +0.41%
Environment
date:        2026-11-03T04:53:36Z
base:        a0905bf500ab2ba307d743f680c9f4dacddc23a3
head:        working tree of 3efc5f61395e7b1fd0e2cad15590e73dabc1cdd9
go:          go version go1.26.1 linux/amd64
kernel:      Linux 7.0.0-1017-azure x86_64
pinning:     pinned to CPU 3 (SMT siblings 2-3) with taskset
clocksource: tsc
load:        2.24, 0.66, 0.23
instr count: cachegrind
perf probe:  Error: No supported events found. The instructions:u event is not supported. 

Architecture:                            x86_64
CPU(s):                                  4
Model name:                              AMD EPYC 7763 64-Core Processor
Thread(s) per core:                      2
Core(s) per socket:                      2
Socket(s):                               1
Hypervisor vendor:                       Microsoft
L1d cache:                               64 KiB (2 instances)
L1i cache:                               64 KiB (2 instances)
L2 cache:                                1 MiB (2 instances)
L3 cache:                                32 MiB (1 instance)
benchstat (primary metric)
goos: linux
goarch: amd64
pkg: github.com/ajitpratap0/GoSQLX/pkg/fingerprint
cpu: AMD EPYC 7763 64-Core Processor                
                        │    base     │                head                │
                        │   sec/op    │   sec/op     vs base               │
Normalize/simple_select   2.350µ ± 1%   2.337µ ± 1%       ~ (p=0.018 n=10)
Normalize/join            7.567µ ± 1%   7.573µ ± 1%       ~ (p=0.739 n=10)
Normalize/complex         18.80µ ± 1%   18.79µ ± 1%       ~ (p=0.592 n=10)
geomean                   6.941µ        6.928µ       -0.18%

                        │     base     │                 head                  │
                        │     B/op     │     B/op      vs base                 │
Normalize/simple_select     896.0 ± 0%     896.0 ± 0%       ~ (p=1.000 n=10) ¹
Normalize/join            2.680Ki ± 0%   2.680Ki ± 0%       ~ (p=1.000 n=10) ¹
Normalize/complex         7.492Ki ± 0%   7.492Ki ± 0%       ~ (p=1.000 n=10) ¹
geomean                   2.600Ki        2.600Ki       +0.00%
¹ all samples are equal

                        │    base    │                head                 │
                        │ allocs/op  │ allocs/op   vs base                 │
Normalize/simple_select   7.000 ± 0%   7.000 ± 0%       ~ (p=1.000 n=10) ¹
Normalize/join            23.00 ± 0%   23.00 ± 0%       ~ (p=1.000 n=10) ¹
Normalize/complex         69.00 ± 0%   69.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                   22.31        22.31       +0.00%
¹ all samples are equal

pkg: github.com/ajitpratap0/GoSQLX/pkg/gosqlx
                                │    base     │                head                │
                                │   sec/op    │   sec/op     vs base               │
ParseE2E/simple_select            1.630µ ± 1%   1.635µ ± 1%       ~ (p=0.467 n=10)
ParseE2E/select_where             3.249µ ± 1%   3.276µ ± 1%       ~ (p=0.046 n=10)
ParseE2E/join                     4.613µ ± 8%   4.615µ ± 1%       ~ (p=0.725 n=10)
ParseE2E/aggregate                3.432µ ± 3%   3.448µ ± 1%       ~ (p=0.724 n=10)
ParseE2E/subquery                 3.003µ ± 1%   2.999µ ± 1%       ~ (p=0.671 n=10)
ParseE2E/cte                      4.132µ ± 0%   4.157µ ± 1%       ~ (p=0.050 n=10)
ParseE2E/window                   2.585µ ± 1%   2.600µ ± 1%       ~ (p=0.127 n=10)
ParseE2E/complex                  11.97µ ± 2%   12.01µ ± 2%       ~ (p=0.393 n=10)
ParseE2E/insert                   2.121µ ± 1%   2.126µ ± 1%       ~ (p=0.210 n=10)
ParseE2E/update                   1.950µ ± 1%   1.953µ ± 0%       ~ (p=0.469 n=10)
ParseE2E/delete                   1.215µ ± 1%   1.226µ ± 2%       ~ (p=0.196 n=10)
ParseRW/postgresql/medium         163.8µ ± 2%   167.2µ ± 2%       ~ (p=0.011 n=10)
ParseRW/mysql/medium              88.04µ ± 2%   88.99µ ± 1%       ~ (p=0.218 n=10)
ParseRW/mariadb/medium            127.2µ ± 2%   127.0µ ± 2%       ~ (p=0.529 n=10)
ParseRW/sqlserver/medium          271.8µ ± 2%   270.8µ ± 1%       ~ (p=0.739 n=10)
ParseRW/oracle/medium             325.4µ ± 1%   327.0µ ± 1%       ~ (p=0.393 n=10)
ParseRW/sqlite/medium             76.20µ ± 1%   76.58µ ± 1%       ~ (p=0.393 n=10)
ParseRW/snowflake/medium          179.5µ ± 1%   180.1µ ± 2%       ~ (p=0.353 n=10)
ParseRW/clickhouse/medium         85.61µ ± 1%   85.17µ ± 1%       ~ (p=0.739 n=10)
ParseFresh/simple_select          6.978µ ± 1%   7.035µ ± 1%  +0.82% (p=0.004 n=10)
ParseFresh/join                   11.09µ ± 1%   11.14µ ± 4%       ~ (p=0.579 n=10)
ParseFresh/complex                20.15µ ± 0%   20.11µ ± 2%       ~ (p=1.000 n=10)
PoolGetPut/serial                 67.32n ± 4%   67.45n ± 2%       ~ (p=0.447 n=10)
ParseError/syntax_mid/parse       3.706µ ± 2%   3.756µ ± 1%       ~ (p=0.072 n=10)
ParseError/syntax_mid/validate    3.228µ ± 1%   3.251µ ± 1%       ~ (p=0.225 n=10)
ParseError/syntax_end/parse       3.699µ ± 2%   3.744µ ± 2%       ~ (p=0.138 n=10)
ParseError/syntax_end/validate    3.422µ ± 2%   3.472µ ± 2%       ~ (p=0.029 n=10)
ParseError/tokenize/parse         2.465µ ± 2%   2.477µ ± 3%       ~ (p=0.172 n=10)
ParseError/tokenize/validate      4.349µ ± 1%   4.356µ ± 1%       ~ (p=0.541 n=10)
ParseError/long_prefix/parse      60.51µ ± 1%   60.53µ ± 1%       ~ (p=0.912 n=10)
ParseError/long_prefix/validate   59.86µ ± 1%   60.02µ ± 1%       ~ (p=0.280 n=10)
geomean                           10.21µ        10.26µ       +0.48%

                                │     base      │                head                 │
                                │      B/s      │     B/s       vs base               │
ParseE2E/simple_select             15.21Mi ± 1%   15.16Mi ± 1%       ~ (p=0.423 n=10)
ParseE2E/select_where              30.24Mi ± 1%   29.98Mi ± 1%       ~ (p=0.050 n=10)
ParseE2E/join                      26.05Mi ± 7%   26.04Mi ± 1%       ~ (p=0.698 n=10)
ParseE2E/aggregate                 23.35Mi ± 3%   23.24Mi ± 1%       ~ (p=0.726 n=10)
ParseE2E/subquery                  26.04Mi ± 1%   26.08Mi ± 1%       ~ (p=0.617 n=10)
ParseE2E/cte                       28.61Mi ± 0%   28.45Mi ± 1%       ~ (p=0.055 n=10)
ParseE2E/window                    34.69Mi ± 1%   34.48Mi ± 1%       ~ (p=0.101 n=10)
ParseE2E/complex                   30.12Mi ± 2%   30.00Mi ± 2%       ~ (p=0.393 n=10)
ParseE2E/insert                    34.17Mi ± 1%   34.08Mi ± 1%       ~ (p=0.210 n=10)
ParseE2E/update                    26.90Mi ± 1%   26.86Mi ± 1%       ~ (p=0.404 n=10)
ParseE2E/delete                    40.82Mi ± 1%   40.45Mi ± 2%       ~ (p=0.183 n=10)
ParseRW/postgresql/medium          21.90Mi ± 2%   21.45Mi ± 2%       ~ (p=0.012 n=10)
ParseRW/mysql/medium               30.74Mi ± 2%   30.41Mi ± 1%       ~ (p=0.218 n=10)
ParseRW/mariadb/medium             27.88Mi ± 2%   27.92Mi ± 1%       ~ (p=0.517 n=10)
ParseRW/sqlserver/medium           24.48Mi ± 2%   24.57Mi ± 1%       ~ (p=0.739 n=10)
ParseRW/oracle/medium              25.76Mi ± 1%   25.63Mi ± 1%       ~ (p=0.382 n=10)
ParseRW/sqlite/medium              27.11Mi ± 1%   26.97Mi ± 1%       ~ (p=0.393 n=10)
ParseRW/snowflake/medium           28.33Mi ± 1%   28.24Mi ± 2%       ~ (p=0.362 n=10)
ParseRW/clickhouse/medium          26.32Mi ± 1%   26.45Mi ± 1%       ~ (p=0.724 n=10)
ParseError/syntax_mid/parse        12.35Mi ± 2%   12.19Mi ± 1%       ~ (p=0.078 n=10)
ParseError/syntax_mid/validate     14.18Mi ± 1%   14.08Mi ± 1%       ~ (p=0.225 n=10)
ParseError/syntax_end/parse       10.056Mi ± 2%   9.933Mi ± 2%       ~ (p=0.108 n=10)
ParseError/syntax_end/validate     10.87Mi ± 2%   10.71Mi ± 2%       ~ (p=0.022 n=10)
ParseError/tokenize/parse          17.80Mi ± 2%   17.71Mi ± 3%       ~ (p=0.172 n=10)
ParseError/tokenize/validate       10.09Mi ± 1%   10.07Mi ± 1%       ~ (p=0.566 n=10)
ParseError/long_prefix/parse       38.18Mi ± 1%   38.16Mi ± 1%       ~ (p=0.912 n=10)
ParseError/long_prefix/validate    38.59Mi ± 1%   38.48Mi ± 1%       ~ (p=0.271 n=10)
geomean                            23.45Mi        23.34Mi       -0.50%

                                │      base      │                 head                  │
                                │      B/op      │     B/op      vs base                 │
ParseE2E/simple_select              816.0 ± 0%       816.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/select_where             1.523Ki ± 0%     1.523Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/join                     2.305Ki ± 0%     2.305Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/aggregate                1.812Ki ± 0%     1.812Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/subquery                 1.828Ki ± 0%     1.828Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/cte                      2.336Ki ± 0%     2.336Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/window                   1.281Ki ± 0%     1.281Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/complex                  6.399Ki ± 0%     6.399Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/insert                     824.0 ± 0%       824.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/update                     736.0 ± 0%       736.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/delete                     400.0 ± 0%       400.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/postgresql/medium         70.51Ki ± 0%     70.51Ki ± 0%  +0.00% (p=0.002 n=10)
ParseRW/mysql/medium              43.73Ki ± 0%     43.73Ki ± 0%       ~ (p=1.000 n=10)
ParseRW/mariadb/medium            64.84Ki ± 0%     64.84Ki ± 0%       ~ (p=0.930 n=10)
ParseRW/sqlserver/medium          90.49Ki ± 0%     90.49Ki ± 0%       ~ (p=0.474 n=10)
ParseRW/oracle/medium             113.8Ki ± 0%     113.8Ki ± 0%       ~ (p=1.000 n=10)
ParseRW/sqlite/medium             39.89Ki ± 0%     39.89Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/snowflake/medium          83.38Ki ± 0%     83.38Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/clickhouse/medium         37.13Ki ± 0%     37.13Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/simple_select            896.0 ± 0%       896.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/join                   2.383Ki ± 0%     2.383Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/complex                6.477Ki ± 0%     6.477Ki ± 0%       ~ (p=1.000 n=10) ¹
PoolGetPut/serial                   0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_mid/parse       1.477Ki ± 0%     1.477Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_mid/validate    1.477Ki ± 0%     1.477Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_end/parse       2.227Ki ± 0%     2.227Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_end/validate    2.227Ki ± 0%     2.227Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/tokenize/parse         1.570Ki ± 0%     1.570Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/tokenize/validate      3.789Ki ± 0%     3.789Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseError/long_prefix/parse      23.52Ki ± 0%     23.52Ki ± 0%       ~ (p=0.725 n=10)
ParseError/long_prefix/validate   23.48Ki ± 0%     23.48Ki ± 0%       ~ (p=1.000 n=10) ¹
geomean                                        ²                 +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                │     base      │                 head                 │
                                │   allocs/op   │  allocs/op   vs base                 │
ParseE2E/simple_select             5.000 ± 0%      5.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/select_where              18.00 ± 0%      18.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/join                      17.00 ± 0%      17.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/aggregate                 18.00 ± 0%      18.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/subquery                  14.00 ± 0%      14.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/cte                       21.00 ± 0%      21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/window                    11.00 ± 0%      11.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/complex                   50.00 ± 0%      50.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/insert                    17.00 ± 0%      17.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/update                    13.00 ± 0%      13.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseE2E/delete                    5.000 ± 0%      5.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/postgresql/medium          646.0 ± 0%      646.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/mysql/medium               365.0 ± 0%      365.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/mariadb/medium             523.0 ± 0%      523.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/sqlserver/medium           928.0 ± 0%      928.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/oracle/medium             1.093k ± 0%     1.093k ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/sqlite/medium              346.0 ± 0%      346.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/snowflake/medium           777.0 ± 0%      777.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseRW/clickhouse/medium          384.0 ± 0%      384.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/simple_select           6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/join                    18.00 ± 0%      18.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseFresh/complex                 51.00 ± 0%      51.00 ± 0%       ~ (p=1.000 n=10) ¹
PoolGetPut/serial                  0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_mid/parse        21.00 ± 0%      21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_mid/validate     21.00 ± 0%      21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_end/parse        25.00 ± 0%      25.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/syntax_end/validate     25.00 ± 0%      25.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/tokenize/parse          19.00 ± 0%      19.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/tokenize/validate       30.00 ± 0%      30.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/long_prefix/parse       229.0 ± 0%      229.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseError/long_prefix/validate    229.0 ± 0%      229.0 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                       ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                          │    base     │                head                │
                          │  sec/stmt   │  sec/stmt    vs base               │
ParseRW/postgresql/medium   13.65µ ± 2%   13.93µ ± 2%       ~ (p=0.012 n=10)
ParseRW/mysql/medium        11.00µ ± 2%   11.12µ ± 1%       ~ (p=0.218 n=10)
ParseRW/mariadb/medium      14.13µ ± 2%   14.11µ ± 2%       ~ (p=0.529 n=10)
ParseRW/sqlserver/medium    12.94µ ± 2%   12.89µ ± 1%       ~ (p=0.739 n=10)
ParseRW/oracle/medium       13.56µ ± 1%   13.63µ ± 1%       ~ (p=0.393 n=10)
ParseRW/sqlite/medium       12.70µ ± 1%   12.76µ ± 1%       ~ (p=0.393 n=10)
ParseRW/snowflake/medium    13.81µ ± 1%   13.85µ ± 2%       ~ (p=0.363 n=10)
ParseRW/clickhouse/medium   12.23µ ± 1%   12.17µ ± 1%       ~ (p=0.739 n=10)
geomean                     12.97µ        13.02µ       +0.43%

pkg: github.com/ajitpratap0/GoSQLX/pkg/linter
                  │    base     │                head                │
                  │   sec/op    │   sec/op     vs base               │
LintRW/postgresql   7.678m ± 2%   7.751m ± 3%       ~ (p=0.481 n=10)
LintRW/mysql        7.796m ± 3%   7.847m ± 2%       ~ (p=0.631 n=10)
LintRW/mariadb      6.796m ± 3%   6.915m ± 3%       ~ (p=0.353 n=10)
LintRW/sqlserver    6.807m ± 3%   6.886m ± 2%       ~ (p=0.190 n=10)
LintRW/oracle       7.632m ± 2%   7.748m ± 5%       ~ (p=0.075 n=10)
LintRW/sqlite       6.458m ± 9%   6.446m ± 3%       ~ (p=0.971 n=10)
LintRW/snowflake    7.039m ± 3%   7.029m ± 1%       ~ (p=0.912 n=10)
LintRW/clickhouse   7.306m ± 4%   7.415m ± 3%       ~ (p=0.280 n=10)
LintRule/L007       7.888m ± 3%   7.929m ± 1%       ~ (p=0.529 n=10)
LintRule/L010       2.894m ± 1%   2.904m ± 2%       ~ (p=0.353 n=10)
geomean             6.614m        6.667m       +0.81%

                  │     base     │                head                 │
                  │     B/s      │     B/s       vs base               │
LintRW/postgresql   3.691Mi ± 3%   3.657Mi ± 3%       ~ (p=0.494 n=10)
LintRW/mysql        4.196Mi ± 3%   4.172Mi ± 2%       ~ (p=0.566 n=10)
LintRW/mariadb      4.487Mi ± 3%   4.411Mi ± 3%       ~ (p=0.323 n=10)
LintRW/sqlserver    4.549Mi ± 4%   4.497Mi ± 2%       ~ (p=0.171 n=10)
LintRW/oracle       5.202Mi ± 2%   5.126Mi ± 4%       ~ (p=0.075 n=10)
LintRW/sqlite       4.444Mi ± 8%   4.449Mi ± 3%       ~ (p=0.956 n=10)
LintRW/snowflake    4.430Mi ± 3%   4.435Mi ± 1%       ~ (p=0.926 n=10)
LintRW/clickhouse   4.439Mi ± 4%   4.377Mi ± 3%       ~ (p=0.254 n=10)
geomean             4.413Mi        4.374Mi       -0.87%

                  │     base     │                 head                  │
                  │     B/op     │     B/op      vs base                 │
LintRW/postgresql   3.508Mi ± 0%   3.508Mi ± 0%       ~ (p=0.403 n=10)
LintRW/mysql        4.369Mi ± 0%   4.369Mi ± 0%       ~ (p=0.725 n=10)
LintRW/mariadb      4.046Mi ± 0%   4.046Mi ± 0%       ~ (p=0.956 n=10)
LintRW/sqlserver    3.608Mi ± 0%   3.608Mi ± 0%       ~ (p=0.425 n=10)
LintRW/oracle       4.402Mi ± 0%   4.402Mi ± 0%       ~ (p=0.280 n=10)
LintRW/sqlite       3.831Mi ± 0%   3.831Mi ± 0%       ~ (p=0.210 n=10)
LintRW/snowflake    3.862Mi ± 0%   3.862Mi ± 0%       ~ (p=0.055 n=10)
LintRW/clickhouse   4.308Mi ± 0%   4.308Mi ± 0%       ~ (p=0.726 n=10)
LintRule/L007       2.942Mi ± 0%   2.942Mi ± 0%       ~ (p=1.000 n=10) ¹
LintRule/L010       859.6Ki ± 0%   859.6Ki ± 0%       ~ (p=0.582 n=10)
geomean             3.304Mi        3.304Mi       +0.00%
¹ all samples are equal

                  │    base     │                 head                 │
                  │  allocs/op  │  allocs/op   vs base                 │
LintRW/postgresql   36.48k ± 0%   36.48k ± 0%       ~ (p=1.000 n=10)
LintRW/mysql        44.19k ± 0%   44.19k ± 0%       ~ (p=1.000 n=10) ¹
LintRW/mariadb      40.73k ± 0%   40.73k ± 0%       ~ (p=1.000 n=10)
LintRW/sqlserver    36.90k ± 0%   36.90k ± 0%       ~ (p=1.000 n=10) ¹
LintRW/oracle       45.29k ± 0%   45.29k ± 0%       ~ (p=0.350 n=10)
LintRW/sqlite       40.58k ± 0%   40.58k ± 0%       ~ (p=1.000 n=10) ¹
LintRW/snowflake    39.84k ± 0%   39.84k ± 0%       ~ (p=0.370 n=10)
LintRW/clickhouse   45.00k ± 0%   45.00k ± 0%       ~ (p=1.000 n=10) ¹
LintRule/L007       72.56k ± 0%   72.56k ± 0%       ~ (p=1.000 n=10) ¹
LintRule/L010       20.76k ± 0%   20.76k ± 0%       ~ (p=1.000 n=10) ¹
geomean             40.55k        40.55k       +0.00%
¹ all samples are equal

                  │    base     │                head                │
                  │  sec/stmt   │  sec/stmt    vs base               │
LintRW/postgresql   25.18µ ± 2%   25.41µ ± 3%       ~ (p=0.481 n=10)
LintRW/mysql        18.83µ ± 3%   18.95µ ± 2%       ~ (p=0.631 n=10)
LintRW/mariadb      17.88µ ± 3%   18.20µ ± 3%       ~ (p=0.353 n=10)
LintRW/sqlserver    24.57µ ± 3%   24.86µ ± 2%       ~ (p=0.183 n=10)
LintRW/oracle       20.74µ ± 2%   21.05µ ± 5%       ~ (p=0.075 n=10)
LintRW/sqlite       18.56µ ± 9%   18.52µ ± 3%       ~ (p=0.971 n=10)
LintRW/snowflake    21.53µ ± 3%   21.50µ ± 1%       ~ (p=0.912 n=10)
LintRW/clickhouse   18.54µ ± 4%   18.82µ ± 3%       ~ (p=0.280 n=10)
LintRule/L007       2.804µ ± 3%   2.819µ ± 1%       ~ (p=0.529 n=10)
LintRule/L010       1.028µ ± 1%   1.033µ ± 2%       ~ (p=0.305 n=10)
geomean             12.49µ        12.59µ       +0.81%

pkg: github.com/ajitpratap0/GoSQLX/pkg/sql/tokenizer
                         │    base     │                head                │
                         │   sec/op    │   sec/op     vs base               │
Tokenize/scratch/join      1.476µ ± 2%   1.475µ ± 0%       ~ (p=0.402 n=10)
Tokenize/scratch/complex   3.953µ ± 1%   3.936µ ± 0%       ~ (p=0.063 n=10)
Tokenize/scratch/insert    741.2n ± 1%   734.5n ± 0%  -0.91% (p=0.001 n=10)
geomean                    1.629µ        1.622µ       -0.47%

                         │     base     │                head                 │
                         │     B/s      │     B/s       vs base               │
Tokenize/scratch/join      81.41Mi ± 2%   81.49Mi ± 0%       ~ (p=0.382 n=10)
Tokenize/scratch/complex   91.20Mi ± 1%   91.60Mi ± 0%       ~ (p=0.063 n=10)
Tokenize/scratch/insert    97.78Mi ± 1%   98.68Mi ± 0%  +0.92% (p=0.001 n=10)
geomean                    89.88Mi        90.31Mi       +0.48%

                         │     base     │                head                 │
                         │     B/op     │    B/op     vs base                 │
Tokenize/scratch/join      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Tokenize/scratch/complex   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Tokenize/scratch/insert    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                               ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                         │     base     │                head                 │
                         │  allocs/op   │ allocs/op   vs base                 │
Tokenize/scratch/join      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Tokenize/scratch/complex   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Tokenize/scratch/insert    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                               ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/ajitpratap0/GoSQLX/pkg/transform
                             │    base     │                head                │
                             │   sec/op    │   sec/op     vs base               │
TransformParse/simple_select   1.587µ ± 1%   1.583µ ± 1%       ~ (p=0.239 n=10)
TransformParse/join            4.916µ ± 1%   4.931µ ± 1%       ~ (p=0.839 n=10)
TransformParse/complex         13.21µ ± 1%   13.21µ ± 1%       ~ (p=0.927 n=10)
geomean                        4.688µ        4.689µ       +0.01%

                             │     base     │                 head                  │
                             │     B/op     │     B/op      vs base                 │
TransformParse/simple_select     816.0 ± 0%     816.0 ± 0%       ~ (p=1.000 n=10) ¹
TransformParse/join            2.305Ki ± 0%   2.305Ki ± 0%       ~ (p=1.000 n=10) ¹
TransformParse/complex         6.398Ki ± 0%   6.398Ki ± 0%       ~ (p=1.000 n=10) ¹
geomean                        2.273Ki        2.273Ki       +0.00%
¹ all samples are equal

                             │    base    │                head                 │
                             │ allocs/op  │ allocs/op   vs base                 │
TransformParse/simple_select   5.000 ± 0%   5.000 ± 0%       ~ (p=1.000 n=10) ¹
TransformParse/join            17.00 ± 0%   17.00 ± 0%       ~ (p=1.000 n=10) ¹
TransformParse/complex         50.00 ± 0%   50.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                        16.20        16.20       +0.00%
¹ all samples are equal

Run, raw data and benchstat

ajitpratap0 and others added 2 commits November 3, 2026 03:26
#896 (L007), #902 (L010) and #905 (lazy error wrap) target benchmarks the
PR-run gate never measured, so none of them could be accepted or closed
on an amd64 verdict. long_prefix is included so #905's expected miss is
still checked for regressions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DnbRnTFErhoMJdAjVEeCg2
@ajitpratap0 ajitpratap0 changed the title ci(perf): gate BenchmarkLintRW in the shadow suite [W6-05a follow-up] ci(perf): gate LintRW, LintRule L007/L010 and ParseError in the shadow suite Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Claude finished @ajitpratap0's task in 18s —— View job


Review of PR #927 (updated for the 3 added lines)

Verdict: LGTM, with one note.

The diff adds three entries to scripts/perf/gate-suite.txt. The PR title and description mention only the first. I read the diff and the benchmark sources. I didn't run the gate.

  • ./pkg/linter ^BenchmarkLintRW$: BenchmarkLintRW exists at pkg/linter/bench_matrix_test.go:156. The latest gate run lists all 8 LintRW/<dialect> rows, so it is now measured.
  • ./pkg/linter ^BenchmarkLintRule$/^(L007|L010)$: sub-benchmarks are named by r.ID() (bench_matrix_test.go:250), so the filter matches.
  • ./pkg/gosqlx ^BenchmarkParseError$/^(syntax_mid|syntax_end|tokenize|long_prefix)$/^(parse|validate)$: the case names and the parse/validate leaves match mxErrorCases and the b.Run calls in pkg/gosqlx/bench_matrix_test.go. The regex deliberately skips the per-dialect leaves.

Note: the latest gate comment (head 25db6db) lists LintRW/* but no LintRule/L007, LintRule/L010 or ParseError/* rows. That run predates the last commit (c7c5123). Please confirm the next shadow run lists them. If a row is missing, the regex isn't matching.

Minor:

  • The PR title and description describe only the LintRW line. Updating them would make the history accurate.
  • The header comment in gate-suite.txt still describes the "first slice" (parse, tokenizer, server shapes). You could mention the linter and error paths.
  • LintRW includes tokenizing and parsing, so a parse regression will also move it. Keep that in mind when triaging a gate failure.

The change is CI configuration only. I see no security or correctness concerns.

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Claude finished @ajitpratap0's task in 13s —— View job


Review of PR #927 (head includes all 3 added lines)

Verdict: LGTM.

I read the diff and the latest shadow gate report. I didn't run the gate myself.

  • Previous note resolved. The latest gate run lists the new rows: LintRW/* (8 dialects), LintRule/L007, LintRule/L010, and ParseError/{syntax_mid,syntax_end,tokenize,long_prefix}/{parse,validate}. So all three regexes match. The A/A control was clean (0 of 50 benchmarks moved more than 3%) and no gated metric moved.
  • Cost. The suite went from 32 to 50 benchmarks. LintRW takes about 7 ms/op, and LintRule/L007 also takes about 7.8 ms/op, so these dominate the added CI time. That's acceptable. If the gate gets slow, narrow LintRW the way ParseRW is narrowed.
  • Triage. LintRW and ParseError include tokenizing and parsing. A parse regression will therefore move them too, so don't read a move there as a linter-only regression.
  • long_prefix. Its rows are gated and don't expect the improvement (+0.65% on parse, p=0.023). That is below the 3% threshold, so it won't fail the gate. Re-check it if it drifts.

Minor, optional:

  • Update the header comment in scripts/perf/gate-suite.txt. It still describes only parse, tokenizer and server shapes ("first slice"), and doesn't mention the linter and error paths.
  • The PR title now lists LintRW, L007/L010 and ParseError and matches the body.

This is CI configuration only. I see no correctness or security concerns.

@ajitpratap0
ajitpratap0 merged commit 01ee824 into main Nov 3, 2026
33 checks passed

This branch was successfully deployed

1 active deployment
Preview — 0d1db436 Deployed Nov 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant