Skip to content

ci: add scheduled fuzz workflow (layer 4/4) - #429

Open
Saurabh Singh (saurabh500) wants to merge 1 commit into
saurabh500-fix-427-loginackfrom
saurabh500-fuzz-nightly-ci
Open

Saurabh Singh (saurabh500) wants to merge 1 commit into
saurabh500-fix-427-loginackfrom
saurabh500-fuzz-nightly-ci

Conversation

@saurabh500

Copy link
Copy Markdown
Collaborator

Summary

Final layer (4/4) of the proactive TDS parser fuzz-hardening stack tracked by #418.

This PR adds .github/workflows/fuzz.yml, a scheduled (nightly 07:00 UTC) + manually-dispatchable workflow that runs every native Go fuzz target in the repo and uploads any crashers as artifacts. These are pure TDS/parser fuzz targets — no SQL Server instance is required.

What it does

  • Runs on a nightly cron and via workflow_dispatch (with a configurable fuzztime input, default 180s).
  • Uses a per-package matrix (., ./batch, ./integratedauth/ntlm, ./internal/querytext, ./msdsn) that covers all 18 fuzz targets in the repo.
  • Discovers targets dynamically via go test <pkg> -list '^Fuzz', then fuzzes each one.
  • Uses -parallel 4: the TDS value decoders eagerly allocate up to a large per-length cap (bounded by fix: bound TDS response parser allocations against malformed streams #421 but still large), so the default 32 workers would OOM a 7GB CI runner. The per-package matrix keeps memory and wall-time bounded.
  • Uploads any testdata/fuzz/** crashers as artifacts on failure.
  • Follows the repo's pinned-SHA action + minimal permissions conventions from pr-validation.yml.

The fuzz-hardening stack

This is the final layer of a dependent stack that proactively fuzzed the TDS parser and fixed the bugs it uncovered:

Stacks on PR #428 (saurabh500-fix-427-loginack).

Refs #418

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AppVeyor failure is inherited from #424, not from this PR

continuous-integration/appveyor/pr failed on all 5 matrix jobs (build 1856) with a compile error, not a test failure:

.\types_fuzz_test.go:397:41: not enough arguments in call to drainSingleResponse
    have ([]byte, byte)
    want ([]byte, int, bool)

This PR adds one file (.github/workflows/fuzz.yml, 66 lines, zero Go), so it can't be the source. I compiled each merge ref in the stack locally:

PR branch merge ref compiles
#419 fuzz-tds-response-harness yes
#421 bound-tds-response-allocations yes
#424 fuzz-layer2-types no — 3 errors, first break
#425 fix-422-423-decoders no
#426 fuzz-layer3-complex-tokens no — 4 errors
#428 fix-427-loginack no
#429 fuzz-nightly-ci no

The stack was never rebased after #419 was revised during review. Three generations of drainSingleResponse are live at once:

Branch Signature
saurabh500-fuzz-tds-response-harness (#419) (stream []byte, chunk int, collect bool)
saurabh500-bound-tds-response-allocations (#421) (stream []byte, frag byte, collect bool)
#424 / #425 / #426 / #428 / #429 (stream []byte, frag byte)

Each branch is internally consistent, which is why appveyor/branch is green on all of them and only appveyor/pr fails. The merge ref takes the newer token_fuzz_test.go from #419 but keeps the stale call sites in types_fuzz_test.go (added by #424) and token_complex_fuzz_test.go (added by #426), which #419 never touched. frameReplyPackets(..., frag byte) vs (..., chunk int) breaks the same way.

Nothing else caught it because pr-validation.yml is gated on branches: [main] and every PR in this stack targets another stack branch. AppVeyor is the only check compiling the merge ref here.

To fix: rebase from #424 up, converting frag byte to chunk int and adding the collect bool argument at the 4 stale call sites. Nothing to change in #429 for this.


Review of the workflow

A compile failure makes the nightly job report success

mapfile -t TARGETS < <(go test "$PKG" -list '^Fuzz' 2>/dev/null | grep '^Fuzz' || true)
if [ ${#TARGETS[@]} -eq 0 ]; then
  echo "No fuzz targets in $PKG; skipping."
  exit 0
fi

Run against the current (broken) tree:

go test . -list '^Fuzz'  ->  exit=1
FAIL    github.com/microsoft/go-mssqldb [build failed]

2>/dev/null discards the compiler diagnostics, the FAIL line on stdout doesn't match ^Fuzz, || true swallows the exit code, TARGETS ends up empty, and the job exits 0. A broken build turns the fuzzer off silently and the workflow stays green — which is the state this stack is in right now.

set -euo pipefail doesn't help here, and it's set after go version anyway (GitHub's shell: bash already applies -eo pipefail).

Suggestion:

set -euo pipefail
go version
go build ./... && go vet "$PKG"
mapfile -t TARGETS < <(go test "$PKG" -list '^Fuzz' | grep '^Fuzz' || true)

At minimum, drop 2>/dev/null and check go test -list's exit status separately from the grep.

timeout-minutes: 90 doesn't hold for workflow_dispatch

Package . has 17 fuzz targets (21 repo-wide, not the 18 in the description). At the 180s default that's ~51 min plus build, which fits. Dispatch with 10m and it's ~170 min, so the job gets killed mid-target and reports a failure with no crasher to show for it. Either derive the timeout from fuzztime x target count, or validate/cap the input.

Hardcoded go-version: '1.25.7'

The devcontainer alignment check only compares go.mod against .devcontainer/Dockerfile, so this is a third unguarded copy of the version. go-version-file: go.mod picks it up from the existing toolchain go1.25.7 line.

No corpus persistence

Every night restarts from the seed corpus, so 180s per target re-explores the same shallow paths indefinitely. Caching ~/.cache/go-build/fuzz between runs is what makes a scheduled fuzzer find anything new.

Minor

  • fuzz-crashers-${{ strategy.job-index }} — a slug of the package name reads better than an index when triaging an artifact.
  • ${{ github.event.inputs.fuzztime || '180s' }} works; ${{ inputs.fuzztime || '180s' }} is the current form. The || '180s' is still needed for the schedule trigger since default: doesn't apply there.
  • No concurrency: group, so a manual dispatch can overlap the nightly run.

Good

Pinned action SHAs match pr-validation.yml and devcontainer.yml exactly. permissions: {} at workflow level with contents: read scoped to the job. fail-fast: false. The -parallel 4 rationale is documented and correct given the allocation caps from #421.

Refs #418

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings August 23, 2026 06:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds scheduled and manually triggered CI fuzzing for all native Go fuzz targets across five packages.

Changes:

  • Dynamically discovers and runs fuzz targets with bounded parallelism.
  • Supports configurable fuzz duration.
  • Uploads fuzz crashers as artifacts.
  • Uses pinned actions and minimal permissions.
Suppressed comments (1)

.github/workflows/fuzz.yml:35

  • This hard-codes one patch release, unlike the existing CI matrix (.github/workflows/pr-validation.yml:26) which uses 1.25.x. Once a newer 1.25 patch ships, nightly fuzzing will continue on 1.25.7 and miss its compiler/runtime/security fixes; use the patch-stream selector instead.
          go-version: '1.25.7'

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

run: |
go version
set -euo pipefail
mapfile -t TARGETS < <(go test "$PKG" -list '^Fuzz' 2>/dev/null | grep '^Fuzz' || true)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirming this independently — I found the same thing and reproduced it against this stack's own tree, so it isn't theoretical.

I ran the exact snippet under bash against #424's merge ref while that ref was still broken:

tree compiles go test -list this step
#424 head yes exit 0, 9 targets GREEN, "Targets: 9"
#424 merge no exit 1, FAIL ... [build failed] GREEN, "No fuzz targets in .; skipping"

So on 2026-08-23 this workflow would have reported success on the exact breakage that was sitting in this stack. 2>/dev/null discards the build error, grep matches nothing, || true masks the non-zero status, and the job exits 0.

Suggested fix that keeps the legitimate skip working:

if ! LIST=$(go test "$PKG" -list '^Fuzz'); then
  echo "::error::$PKG failed to build"
  exit 1
fi
mapfile -t TARGETS < <(printf '%s\n' "$LIST" | grep '^Fuzz' || true)
if [ ${#TARGETS[@]} -eq 0 ]; then
  echo "No fuzz targets in $PKG; skipping."
  exit 0
fi

The || true on the grep is still correct — "package builds but has no Fuzz functions" is a real skip for ./msdsn, ./batch and friends. It is only the build failure that must not be swallowed.

jobs:
fuzz:
runs-on: ubuntu-latest
timeout-minutes: 90

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreeing, and the count is worse than stated — it's 14, not 13. Measured on this PR's head (6e5760d):

$ go test . -list '^Fuzz'
FuzzParseDAC              FuzzParseInstances       FuzzReadPrelogin
FuzzEnvChange             FuzzFeatureExtAckAndLoginAck
FuzzReturnValue           FuzzErrorInfoTokens      FuzzAlwaysEncryptedMetadata
FuzzProcessSingleResponse FuzzColMetadataAndRow    FuzzNbcRow
FuzzTypeInfoAndValue      FuzzVariantValue         FuzzPLPValue

So a 10m dispatch is 140 minutes of fuzztime alone against timeout-minutes: 90, before checkout, toolchain setup and per-target corpus loading. The . leg cannot finish.

Two things worth folding into the fix:

The default is also short of the acceptance criteria. #418 asks for "at least three minutes" per target. At 14 targets that is 42 minutes of pure fuzztime for the . leg — under 90, but not by much once overhead lands, and it grows every time a target is added. Deriving the timeout from the budget rather than hardcoding 90 would stop this recurring.

The time is not evenly useful. Measured on the full stack, 15s per target:

FuzzParseInstances  16794 exec/sec      FuzzNbcRow      15603 exec/sec
FuzzColMetadataAndRow 14035             FuzzEnvChange    8831
FuzzTypeInfoAndValue   3475             FuzzReadPrelogin 2122
FuzzPLPValue            379

FuzzPLPValue is roughly 40x slower than the fastest targets, with repeated multi-second windows at zero executions. Under a fixed per-target fuzztime it consumes an equal share of the wall clock for a fraction of the coverage — so raising the timeout to fit 14×10m mostly buys more time in the slowest target. Bounding the generated length in that target would be worth more than a longer budget.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

Good workflow with one blocker. The hygiene here is better than most of what's already in this repo — actions pinned to SHAs, permissions: {} at the top with contents: read scoped to the job, fail-fast: false, an rc accumulator so every target runs and a failure still propagates, and crasher artifact upload on failure. The rc pattern in particular is the right call; it would have been easy to exit 1 on the first failing target and lose the rest.

The blocker is in the target-detection step, and I tested it against this stack's own tree.

Blocker: the detection step fails open on a build error

mapfile -t TARGETS < <(go test "$PKG" -list '^Fuzz' 2>/dev/null | grep '^Fuzz' || true)
if [ ${#TARGETS[@]} -eq 0 ]; then
  echo "No fuzz targets in $PKG; skipping."
  exit 0
fi

If the package does not compile, go test -list exits non-zero and writes the build error to
stderr. 2>/dev/null discards it, grep matches nothing, || true masks the non-zero status,
TARGETS ends up empty, and the job exits 0 reporting "no fuzz targets".

Tested by running that exact snippet under bash against #424's merge ref, which was broken at
the time:

tree compiles go test -list this workflow step
#424 head yes exit 0, 9 targets GREEN, "Targets: 9"
#424 merge no exit 1, FAIL ... [build failed] GREEN, "No fuzz targets in .; skipping"

So the nightly would have reported success on exactly the breakage that was sitting in this stack
until this morning. A fuzz job that goes green when the package cannot build is worse than no fuzz
job, because it produces a daily green signal that means nothing.

Suggested fix — separate "no targets here" from "cannot build":

if ! LIST=$(go test "$PKG" -list '^Fuzz'); then
  echo "::error::$PKG failed to build"
  exit 1
fi
mapfile -t TARGETS < <(printf '%s\n' "$LIST" | grep '^Fuzz' || true)
if [ ${#TARGETS[@]} -eq 0 ]; then
  echo "No fuzz targets in $PKG; skipping."
  exit 0
fi

The || true on the grep is still correct there — "package builds but has no Fuzz functions" is
a legitimate skip for ./msdsn and friends. It is only the build failure that must not be swallowed.

Suggestion: go-version: '1.25.7' is pinned to an EOL release

Go 1.25 went end-of-life on 2026-08-19, and main now builds the 1.25.x / 1.26.x / 1.27.x
matrix. A hardcoded patch version will drift silently. Prefer:

- name: Setup go
  uses: actions/setup-go@... # v7.0.0
  with:
    go-version-file: go.mod

That tracks the module floor automatically and cannot go stale.

Suggestion: the corpus does not accumulate

Interesting inputs are discarded unless the run fails, so every nightly starts from whatever is
committed under testdata/fuzz/. Over time the job re-explores the same ground instead of
building on yesterday's coverage. Two common options: upload the corpus as an artifact on success
and restore it at the start of the next run, or have a scheduled job open a PR committing new
entries. Worth a follow-up issue rather than blocking this PR.

Nits

  • set -euo pipefail is on line 2, after go version, so the first command runs unguarded.
  • The artifact name uses strategy.job-index, so a crasher requires mapping an index back to a
    package. Package names contain / so they need sanitising, but ${{ matrix.package }} with
    / replaced would be friendlier than a bare number.
  • timeout-minutes: 90 is fine today. Worth knowing the budget is uneven: measured on the full
    stack, FuzzPLPValue runs at ~180–380 exec/sec against 8,000–16,000/sec for most targets, so a
    fixed per-target fuzztime spends most of the wall clock there.

What I verified

Ran all 14 fuzz targets on the complete stack tip, 15s each, -parallel 4 — all pass:

FuzzParseDAC 12895/sec   FuzzParseInstances 16794/sec   FuzzReadPrelogin 2122/sec
FuzzEnvChange 8831/sec   FuzzFeatureExtAckAndLoginAck 13783/sec
FuzzReturnValue 8081/sec FuzzErrorInfoTokens 13616/sec
FuzzAlwaysEncryptedMetadata 8433/sec  FuzzProcessSingleResponse 9179/sec
FuzzColMetadataAndRow 14035/sec  FuzzNbcRow 15603/sec
FuzzTypeInfoAndValue 3475/sec    FuzzVariantValue    FuzzPLPValue 379/sec

One FuzzVariantValue run failed and did not reproduce on two retries, writing no corpus file.
I am treating it as a flake rather than a finding, but flagging it because under this workflow a
non-reproducing failure will look like a real crasher and burn triage time.

I did not verify the workflow end to end on GitHub — the fail-open was reproduced locally
under bash, not by pushing a broken tree and watching the job go green.

Verdict

  • Blockers: the fail-open in target detection.
  • Suggestions: go-version-file: go.mod instead of the EOL pin; corpus persistence (follow-up).
  • Nits: set -euo pipefail placement, artifact naming, uneven time budget.

Also note this PR now sits on the rebased stack — I force-pushed the cascade this morning, so the
head here has moved. Details on #424.

@dlevy-msft-sql

Copy link
Copy Markdown

Two follow-ups on the action pins, both minor.

The pins themselves are correct. I verified all three SHAs resolve to the tags claimed in the comments:

action pinned tag SHA verifies
actions/checkout v7.0.1 MATCH
actions/setup-go v7.0.0 MATCH
actions/upload-artifact v4.4.3 MATCH

Nit: upload-artifact is three majors behind. Latest is v7.0.1 (published 2026-04-10); this pins v4.4.3. checkout and setup-go are both pinned at current v7, so the artifact one looks like it was copied from an older sample rather than chosen. No other workflow in this repo uses upload-artifact, so there is no existing pin to stay consistent with — worth bumping to v7 while this is still in review.

Confirmed for the record: this stack adds no dependencies. I checked every PR for go.mod/go.sum changes:

#419 #421 #424 #425 #426 #428 #429 #410   ->  none touch go.mod or go.sum

Every import introduced across all eight is stdlib, the driver's own msdsn subpackage, or
testify/sqlexp, both already present on main. ~3,600 added lines and zero new modules, which
is the right shape for parser hardening and makes the supply-chain review on this stack trivial.

@github-actions

Copy link
Copy Markdown

Benchmark Results (main vs PR)

Click to expand benchstat output
goos: linux
goarch: amd64
pkg: github.com/microsoft/go-mssqldb
cpu: AMD EPYC 7763 64-Core Processor                
                         │ bench_old.txt │            bench_new.txt             │
                         │    sec/op     │    sec/op     vs base                │
TdsBuffer_Write_Small-4               12.68n ±  1%   12.78n ±  1%        ~ (p=0.024 n=10)
TdsBuffer_Write_Medium-4              22.63n ±  2%   21.75n ±  0%   -3.89% (p=0.000 n=10)
TdsBuffer_Write_Large-4               115.3n ±  1%   115.0n ±  0%   -0.26% (p=0.001 n=10)
TdsBuffer_WriteByte-4                 282.1n ±  0%   281.8n ±  0%        ~ (p=0.643 n=10)
TdsBuffer_Read_Small-4                9.717n ±  0%   9.730n ±  0%        ~ (p=0.271 n=10)
TdsBuffer_ReadByte-4                  257.1n ±  0%   241.6n ±  0%   -6.05% (p=0.000 n=10)
TdsBuffer_Uint16-4                    125.9n ±  1%   126.0n ±  0%        ~ (p=0.445 n=10)
TdsBuffer_Uint32-4                    141.5n ±  0%   141.5n ±  0%        ~ (p=0.958 n=10)
TdsBuffer_Uint64-4                    162.6n ±  0%   163.4n ±  0%   +0.49% (p=0.006 n=10)
TdsBuffer_BeginFinishPacket-4         7.685n ±  0%   7.710n ±  0%   +0.32% (p=0.000 n=10)
ReadBVarCharOrPanicWideChars-4        161.9n ±  1%   163.1n ±  1%        ~ (p=0.037 n=10)
ReadBVarCharOrPanicOnly1WideChar-4    193.9n ±  0%   197.6n ±  1%   +1.91% (p=0.000 n=10)
BulkMakeParam_Int64-4                 26.48n ±  1%   26.10n ±  0%   -1.47% (p=0.000 n=10)
BulkMakeParam_Int32-4                 24.73n ±  1%   24.98n ±  0%   +1.01% (p=0.000 n=10)
BulkMakeParam_Float64-4               26.43n ±  1%   26.11n ±  0%   -1.25% (p=0.000 n=10)
BulkMakeParam_String_NVarChar-4       246.5n ±  1%   249.4n ±  1%        ~ (p=0.022 n=10)
BulkMakeParam_String_VarChar-4        46.13n ±  1%   40.26n ±  0%  -12.72% (p=0.000 n=10)
BulkMakeParam_DateTime-4              83.78n ±  1%   83.92n ±  1%        ~ (p=0.542 n=10)
BulkMakeParam_DateTime2-4             90.03n ± 15%   89.40n ±  0%        ~ (p=0.089 n=10)
BulkMakeParam_Bool-4                  23.46n ±  3%   23.56n ±  0%        ~ (p=0.493 n=10)
BulkMakeParam_MultiColumn-4           204.2n ±  1%   208.2n ±  1%   +1.93% (p=0.000 n=10)
ConvertAssign_StringToString-4        17.70n ±  1%   17.56n ±  1%   -0.76% (p=0.001 n=10)
ConvertAssign_StringToBytes-4         45.37n ±  1%   45.45n ±  1%        ~ (p=0.363 n=10)
ConvertAssign_BytesToString-4         60.61n ±  2%   60.42n ±  1%        ~ (p=0.353 n=10)
ConvertAssign_BytesToBytes-4          61.21n ±  2%   60.91n ±  1%        ~ (p=0.516 n=10)
ConvertAssign_Int64ToInt64-4          42.22n ±  1%   40.81n ±  1%   -3.34% (p=0.000 n=10)
ConvertAssign_Int64ToString-4         53.46n ±  1%   52.99n ±  1%   -0.89% (p=0.003 n=10)
ConvertAssign_Float64ToFloat64-4      40.98n ±  0%   40.40n ±  0%   -1.42% (p=0.000 n=10)
ConvertAssign_TimeToTime-4            42.29n ±  2%   42.05n ±  1%        ~ (p=0.143 n=10)
ConvertAssign_TimeToString-4          124.8n ±  1%   124.5n ±  1%        ~ (p=0.239 n=10)
ConvertAssign_NilToBytes-4            19.06n ±  1%   18.81n ±  1%   -1.29% (p=0.000 n=10)
ConvertAssign_Int64ToInterface-4      17.68n ±  1%   17.60n ±  1%        ~ (p=0.148 n=10)
ConvertAssign_StringToRawBytes-4      47.09n ±  4%   46.65n ±  2%        ~ (p=0.247 n=10)
ConvertAssign_BoolToBool-4            14.34n ±  4%   14.01n ±  0%   -2.27% (p=0.000 n=10)
RoundTrip_ConnectDisconnect-4         97.29m ±  1%   96.88m ±  1%        ~ (p=0.043 n=10)
RoundTrip_Select1-4                   365.3µ ±  2%   364.5µ ±  2%        ~ (p=0.353 n=10)
RoundTrip_ParamQuery-4                312.0µ ±  2%   307.6µ ±  1%        ~ (p=0.043 n=10)
RoundTrip_MultiRow-4                  840.6µ ±  7%   866.0µ ± 10%        ~ (p=0.481 n=10)
RoundTrip_LargeResultSet-4            5.215m ± 13%   4.749m ±  9%   -8.93% (p=0.005 n=10)
RoundTrip_ExecInsert-4                332.2µ ±  2%   332.1µ ±  1%        ~ (p=0.796 n=10)
RoundTrip_StoredProc-4                327.5µ ±  2%   324.8µ ±  1%        ~ (p=0.143 n=10)
RoundTrip_Transaction-4               842.8µ ±  1%   836.1µ ±  1%        ~ (p=0.143 n=10)
RoundTrip_BulkInsert/Rows_100-4       3.601m ±  1%   3.582m ±  1%        ~ (p=0.481 n=10)
RoundTrip_BulkInsert/Rows_1000-4      5.799m ±  3%   5.811m ±  1%        ~ (p=0.579 n=10)
RoundTrip_ConcurrentQueries-4         184.5µ ±  6%   183.9µ ±  5%        ~ (p=0.971 n=10)
RoundTrip_MixedTypes-4                456.9µ ±  2%   448.9µ ±  2%        ~ (p=0.043 n=10)
RoundTrip_LargePayload-4              578.2µ ±  1%   580.1µ ±  1%        ~ (p=0.105 n=10)
RoundTrip_PreparedStmt-4              307.2µ ±  2%   311.2µ ±  1%        ~ (p=0.089 n=10)
RoundTrip_MessageQuery-4              600.4µ ±  1%   604.1µ ±  1%        ~ (p=0.190 n=10)
WriteTypeInfo_Int8-4                  46.75n ±  1%   46.69n ±  0%        ~ (p=0.912 n=10)
WriteTypeInfo_NVarChar-4              101.0n ±  1%   101.2n ±  1%        ~ (p=0.124 n=10)
WriteTypeInfo_NVarCharMax-4           100.9n ±  0%   101.0n ±  1%        ~ (p=0.303 n=10)
WriteByteLenType-4                    30.09n ±  0%   29.77n ±  0%   -1.06% (p=0.000 n=10)
WriteShortLenType-4                   34.85n ±  0%   34.52n ±  0%   -0.93% (p=0.000 n=10)
WritePLPType_Short-4                  85.31n ±  1%   83.93n ±  0%   -1.62% (p=0.000 n=10)
SendRpc_SingleIntParam-4              12.71µ ±  2%   12.36µ ±  1%   -2.79% (p=0.004 n=10)
Str2ucs2_Short-4                      80.69n ±  1%   80.70n ±  0%        ~ (p=0.796 n=10)
Str2ucs2_Medium-4                     176.8n ±  0%   177.5n ±  1%        ~ (p=0.341 n=10)
Str2ucs2_Long-4                       663.3n ±  1%   664.9n ±  1%        ~ (p=0.631 n=10)
Ucs22str_ASCII-4                      57.35n ±  1%   58.20n ±  1%   +1.49% (p=0.001 n=10)
Ucs22str_Unicode-4                    210.3n ±  1%   213.7n ±  0%   +1.59% (p=0.000 n=10)
Ucs22str_LongASCII-4                  113.9n ±  1%   115.8n ±  0%   +1.71% (p=0.000 n=10)
ManglePassword_Short-4                94.65n ±  1%   96.20n ±  0%   +1.64% (p=0.000 n=10)
ManglePassword_Long-4                 391.3n ±  1%   395.5n ±  1%   +1.07% (p=0.000 n=10)
SendLogin-4                           1.365µ ±  1%   1.384µ ±  0%   +1.43% (p=0.000 n=10)
WritePrelogin-4                       642.5n ±  6%   624.2n ±  0%   -2.86% (p=0.000 n=10)
Ucs22strAscii-4                       15.04n ±  2%   14.07n ±  0%   -6.42% (p=0.000 n=10)
Ucs22strMediumAscii-4                 23.00n ±  0%   23.75n ±  3%   +3.28% (p=0.000 n=10)
Ucs22strLongAscii-4                   53.19n ±  0%   52.92n ±  0%        ~ (p=0.018 n=10)
Ucs22strLongerAscii-4                 395.8n ±  1%   398.2n ±  1%        ~ (p=0.159 n=10)
Ucs22strTrailingUnicode-4             148.6n ±  0%   149.6n ±  1%   +0.67% (p=0.001 n=10)
Ucs22strLongEmojis-4                  227.9n ±  1%   229.5n ±  0%   +0.66% (p=0.001 n=10)
ParseDone-4                           9.447n ±  2%   9.433n ±  0%        ~ (p=0.019 n=10)
ParseDoneInProc-4                     9.454n ±  0%   9.436n ±  0%   -0.19% (p=0.003 n=10)
ParseReturnStatus-4                   2.508n ±  0%   2.505n ±  0%        ~ (p=0.100 n=10)
ParseOrder-4                          25.48n ±  3%   25.27n ±  1%        ~ (p=0.012 n=10)
ParseError72-4                        188.3n ±  0%   184.1n ±  1%   -2.26% (p=0.000 n=10)
ParseInfo-4                           206.6n ±  1%   197.6n ±  0%   -4.38% (p=0.000 n=10)
ParseLoginAck-4                       68.53n ±  1%   67.64n ±  1%   -1.31% (p=0.000 n=10)
ParseFeatureExtAck_Empty-4            35.02n ±  1%   34.73n ±  0%   -0.86% (p=0.002 n=10)
ParseTabName-4                        55.36n ±  1%   60.38n ±  1%   +9.06% (p=0.000 n=10)
ParseColInfo-4                        56.74n ±  0%   61.83n ±  0%   +8.96% (p=0.000 n=10)
ReadFixedType_Int64-4                 27.77n ±  2%   27.75n ±  0%        ~ (p=0.926 n=10)
ReadFixedType_Int32-4                 17.00n ±  1%   16.61n ±  0%   -2.29% (p=0.000 n=10)
ReadFixedType_Float64-4               27.05n ±  1%   27.01n ±  1%        ~ (p=0.617 n=10)
ReadFixedType_DateTime-4              55.57n ±  1%   56.31n ±  1%   +1.32% (p=0.003 n=10)
ReadByteLenType_IntN_8-4              28.39n ±  2%   28.79n ±  1%        ~ (p=0.037 n=10)
ReadByteLenType_IntN_4-4              28.59n ±  1%   28.52n ±  0%        ~ (p=0.493 n=10)
ReadByteLenType_FloatN_8-4            27.88n ±  2%   28.26n ±  0%        ~ (p=0.127 n=10)
ReadByteLenType_BitN-4                16.30n ±  0%   16.93n ±  0%   +3.93% (p=0.000 n=10)
ReadByteLenType_Null-4                5.643n ±  0%   5.952n ±  0%   +5.47% (p=0.000 n=10)
ReadShortLenType_NVarChar_Short-4     51.40n ±  1%   51.70n ±  1%        ~ (p=0.085 n=10)
ReadShortLenType_NVarChar_Medium-4    88.59n ±  0%   92.21n ±  1%   +4.08% (p=0.000 n=10)
ReadShortLenType_VarBinary-4          65.69n ±  1%   64.63n ±  0%   -1.62% (p=0.000 n=10)
ReadByteLenType_VarChar-4             67.25n ±  1%   67.13n ±  0%        ~ (p=0.643 n=10)
DecodeDateTime-4                      39.18n ±  1%   39.58n ±  0%   +1.02% (p=0.006 n=10)
DecodeDateTim4-4                      36.55n ±  0%   37.15n ±  1%   +1.64% (p=0.000 n=10)
EncodeDateTime-4                      69.09n ±  1%   70.69n ±  1%   +2.30% (p=0.000 n=10)
geomean                               268.0n         267.5n         -0.19%

               │ bench_old.txt │            bench_new.txt            │
               │      B/s      │     B/s       vs base               │
TdsBuffer_Write_Small-4     4.700Gi ± 1%   4.664Gi ± 1%       ~ (p=0.023 n=10)
TdsBuffer_Write_Medium-4    42.14Gi ± 2%   43.85Gi ± 0%  +4.05% (p=0.000 n=10)
TdsBuffer_Write_Large-4     66.16Gi ± 1%   66.35Gi ± 0%  +0.29% (p=0.001 n=10)
TdsBuffer_Read_Small-4      6.134Gi ± 0%   6.126Gi ± 0%       ~ (p=0.280 n=10)
Str2ucs2_Short-4            70.92Mi ± 1%   70.91Mi ± 0%       ~ (p=0.781 n=10)
Str2ucs2_Medium-4           145.6Mi ± 0%   145.1Mi ± 1%       ~ (p=0.288 n=10)
Str2ucs2_Long-4             143.8Mi ± 1%   143.4Mi ± 1%       ~ (p=0.631 n=10)
Ucs22str_ASCII-4            1.169Gi ± 1%   1.152Gi ± 1%  -1.47% (p=0.001 n=10)
Ucs22str_Unicode-4          217.7Mi ± 1%   214.3Mi ± 0%  -1.57% (p=0.000 n=10)
Ucs22str_LongASCII-4        2.077Gi ± 0%   2.042Gi ± 0%  -1.66% (p=0.000 n=10)
geomean                     1.499Gi        1.496Gi       -0.20%

                         │ bench_old.txt  │             bench_new.txt             │
                         │      B/op      │     B/op      vs base                 │
TdsBuffer_Write_Small-4                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Write_Medium-4               0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Write_Large-4                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_WriteByte-4                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Read_Small-4                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_ReadByte-4                   0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint16-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint32-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint64-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_BeginFinishPacket-4          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadBVarCharOrPanicWideChars-4         72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadBVarCharOrPanicOnly1WideChar-4     97.00 ± 0%       97.00 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Int64-4                  8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Int32-4                  4.000 ± 0%       4.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Float64-4                8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_String_NVarChar-4        304.0 ± 0%       304.0 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_String_VarChar-4         48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_DateTime-4               32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_DateTime2-4              32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Bool-4                   1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_MultiColumn-4            72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToString-4         16.00 ± 0%       16.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToBytes-4          72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BytesToString-4          88.00 ± 0%       88.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BytesToBytes-4           96.00 ± 0%       96.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToInt64-4           8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToString-4          32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Float64ToFloat64-4       8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_TimeToTime-4             48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_TimeToString-4           72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_NilToBytes-4             24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToInterface-4       16.00 ± 0%       16.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToRawBytes-4       72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BoolToBool-4             1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_ConnectDisconnect-4        163.7Ki ± 3%     166.5Ki ± 5%       ~ (p=0.123 n=10)
RoundTrip_Select1-4                  2.602Ki ± 0%     2.602Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_ParamQuery-4               5.782Ki ± 0%     5.782Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_MultiRow-4                 37.16Ki ± 0%     37.16Ki ± 0%       ~ (p=0.659 n=10)
RoundTrip_LargeResultSet-4           277.3Ki ± 0%     277.3Ki ± 0%       ~ (p=0.540 n=10)
RoundTrip_ExecInsert-4               6.109Ki ± 0%     6.109Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_StoredProc-4               5.399Ki ± 0%     5.399Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_Transaction-4              7.442Ki ± 0%     7.442Ki ± 0%       ~ (p=0.169 n=10)
RoundTrip_BulkInsert/Rows_100-4      72.42Ki ± 0%     72.43Ki ± 0%       ~ (p=0.811 n=10)
RoundTrip_BulkInsert/Rows_1000-4     583.7Ki ± 0%     583.8Ki ± 0%       ~ (p=0.353 n=10)
RoundTrip_ConcurrentQueries-4        2.681Ki ± 0%     2.682Ki ± 0%       ~ (p=0.700 n=10)
RoundTrip_MixedTypes-4               6.643Ki ± 0%     6.642Ki ± 0%       ~ (p=0.370 n=10)
RoundTrip_LargePayload-4             134.7Ki ± 0%     134.7Ki ± 0%       ~ (p=0.063 n=10)
RoundTrip_PreparedStmt-4             5.454Ki ± 0%     5.454Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_MessageQuery-4             13.76Ki ± 0%     13.76Ki ± 0%       ~ (p=0.739 n=10)
WriteTypeInfo_Int8-4                   2.000 ± 0%       2.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteTypeInfo_NVarChar-4               8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteTypeInfo_NVarCharMax-4            8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteByteLenType-4                     1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteShortLenType-4                    2.000 ± 0%       2.000 ± 0%       ~ (p=1.000 n=10) ¹
WritePLPType_Short-4                   16.00 ± 0%       16.00 ± 0%       ~ (p=1.000 n=10) ¹
SendRpc_SingleIntParam-4             64.21Ki ± 0%     64.21Ki ± 0%  +0.00% (p=0.000 n=10)
Str2ucs2_Short-4                       56.00 ± 0%       56.00 ± 0%       ~ (p=1.000 n=10) ¹
Str2ucs2_Medium-4                      152.0 ± 0%       152.0 ± 0%       ~ (p=1.000 n=10) ¹
Str2ucs2_Long-4                        856.0 ± 0%       856.0 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_ASCII-4                       64.00 ± 0%       64.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_Unicode-4                     72.00 ± 0%       72.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_LongASCII-4                   144.0 ± 0%       144.0 ± 0%       ~ (p=1.000 n=10) ¹
ManglePassword_Short-4                 56.00 ± 0%       56.00 ± 0%       ~ (p=1.000 n=10) ¹
ManglePassword_Long-4                  408.0 ± 0%       408.0 ± 0%       ~ (p=1.000 n=10) ¹
SendLogin-4                            448.0 ± 0%       448.0 ± 0%       ~ (p=1.000 n=10) ¹
WritePrelogin-4                        50.00 ± 0%       50.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strAscii-4                        3.000 ± 0%       3.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strMediumAscii-4                  16.00 ± 0%       16.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongAscii-4                    64.00 ± 0%       64.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongerAscii-4                  640.0 ± 0%       640.0 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strTrailingUnicode-4              48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongEmojis-4                   128.0 ± 0%       128.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseDone-4                            0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseDoneInProc-4                      0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseReturnStatus-4                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseOrder-4                           8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseError72-4                         128.0 ± 0%       128.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseInfo-4                            160.0 ± 0%       160.0 ± 0%       ~ (p=1.000 n=10) ¹
ParseLoginAck-4                        88.00 ± 0%       88.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseFeatureExtAck_Empty-4             48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseTabName-4                         24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseColInfo-4                         24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Int64-4                  8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Int32-4                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Float64-4                8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_DateTime-4               24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_IntN_8-4               8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_IntN_4-4               8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_FloatN_8-4             8.000 ± 0%       8.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_BitN-4                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_Null-4                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_NVarChar_Short-4      21.00 ± 0%       21.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_NVarChar_Medium-4     80.00 ± 0%       80.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_VarBinary-4           88.00 ± 0%       88.00 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_VarChar-4              32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=10) ¹
DecodeDateTime-4                       24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
DecodeDateTim4-4                       24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10) ¹
EncodeDateTime-4                       32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                           ²                 +0.02%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                         │ bench_old.txt │            bench_new.txt             │
                         │   allocs/op   │  allocs/op   vs base                 │
TdsBuffer_Write_Small-4               0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Write_Medium-4              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Write_Large-4               0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_WriteByte-4                 0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Read_Small-4                0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_ReadByte-4                  0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint16-4                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint32-4                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_Uint64-4                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
TdsBuffer_BeginFinishPacket-4         0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadBVarCharOrPanicWideChars-4        4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadBVarCharOrPanicOnly1WideChar-4    4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Int64-4                 1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Int32-4                 1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Float64-4               1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_String_NVarChar-4       3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_String_VarChar-4        1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_DateTime-4              2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_DateTime2-4             2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_Bool-4                  1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
BulkMakeParam_MultiColumn-4           5.000 ± 0%      5.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToString-4        1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToBytes-4         2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BytesToString-4         3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BytesToBytes-4          3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToInt64-4          1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToString-4         2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Float64ToFloat64-4      1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_TimeToTime-4            2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_TimeToString-4          3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_NilToBytes-4            1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_Int64ToInterface-4      1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_StringToRawBytes-4      2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ConvertAssign_BoolToBool-4            1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_ConnectDisconnect-4         747.0 ± 0%      747.5 ± 0%       ~ (p=0.063 n=10)
RoundTrip_Select1-4                   47.00 ± 0%      47.00 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_ParamQuery-4                116.0 ± 0%      116.0 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_MultiRow-4                 1.354k ± 0%     1.354k ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_LargeResultSet-4           10.05k ± 0%     10.05k ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_ExecInsert-4                102.0 ± 0%      102.0 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_StoredProc-4                94.00 ± 0%      94.00 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_Transaction-4               138.0 ± 0%      138.0 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_BulkInsert/Rows_100-4      2.111k ± 0%     2.111k ± 0%       ~ (p=1.000 n=10)
RoundTrip_BulkInsert/Rows_1000-4     21.45k ± 0%     21.45k ± 0%       ~ (p=1.000 n=10)
RoundTrip_ConcurrentQueries-4         47.00 ± 0%      47.00 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_MixedTypes-4                72.00 ± 0%      72.00 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_LargePayload-4              110.0 ± 0%      110.0 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_PreparedStmt-4              103.0 ± 0%      103.0 ± 0%       ~ (p=1.000 n=10) ¹
RoundTrip_MessageQuery-4              215.0 ± 0%      215.0 ± 0%       ~ (p=1.000 n=10) ¹
WriteTypeInfo_Int8-4                  2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteTypeInfo_NVarChar-4              4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteTypeInfo_NVarCharMax-4           4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteByteLenType-4                    1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
WriteShortLenType-4                   1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
WritePLPType_Short-4                  3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
SendRpc_SingleIntParam-4              17.00 ± 0%      17.00 ± 0%       ~ (p=1.000 n=10) ¹
Str2ucs2_Short-4                      3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
Str2ucs2_Medium-4                     3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
Str2ucs2_Long-4                       4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_ASCII-4                      2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_Unicode-4                    3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22str_LongASCII-4                  2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ManglePassword_Short-4                3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=10) ¹
ManglePassword_Long-4                 4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=10) ¹
SendLogin-4                           15.00 ± 0%      15.00 ± 0%       ~ (p=1.000 n=10) ¹
WritePrelogin-4                       12.00 ± 0%      12.00 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strAscii-4                       1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strMediumAscii-4                 1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongAscii-4                   1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongerAscii-4                 1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strTrailingUnicode-4             2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
Ucs22strLongEmojis-4                  2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseDone-4                           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseDoneInProc-4                     0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseReturnStatus-4                   0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseOrder-4                          1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseError72-4                        7.000 ± 0%      7.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseInfo-4                           7.000 ± 0%      7.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseLoginAck-4                       2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseFeatureExtAck_Empty-4            1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseTabName-4                        1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseColInfo-4                        1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Int64-4                 1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Int32-4                 0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_Float64-4               1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadFixedType_DateTime-4              1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_IntN_8-4              1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_IntN_4-4              1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_FloatN_8-4            1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_BitN-4                0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_Null-4                0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_NVarChar_Short-4     2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_NVarChar_Medium-4    2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadShortLenType_VarBinary-4          2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
ReadByteLenType_VarChar-4             2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
DecodeDateTime-4                      1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
DecodeDateTim4-4                      1.000 ± 0%      1.000 ± 0%       ~ (p=1.000 n=10) ¹
EncodeDateTime-4                      2.000 ± 0%      2.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                          ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/microsoft/go-mssqldb/msdsn
             │ bench_old.txt │           bench_new.txt            │
             │    sec/op     │   sec/op     vs base               │
Parse_URL-4                3.510µ ± 0%   3.533µ ± 1%       ~ (p=0.159 n=10)
Parse_URL_Azure-4          4.173µ ± 1%   4.164µ ± 1%       ~ (p=0.306 n=10)
Parse_ADO-4                4.184µ ± 0%   4.211µ ± 1%       ~ (p=0.023 n=10)
Parse_URL_Minimal-4        2.318µ ± 1%   2.318µ ± 1%       ~ (p=0.359 n=10)
Parse_URL_ManyParams-4     6.618µ ± 1%   6.619µ ± 1%       ~ (p=0.699 n=10)
geomean                    3.932µ        3.941µ       +0.22%

             │ bench_old.txt │             bench_new.txt             │
             │     B/op      │     B/op      vs base                 │
Parse_URL-4               2.047Ki ± 0%   2.047Ki ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_Azure-4         2.680Ki ± 0%   2.680Ki ± 0%       ~ (p=1.000 n=10) ¹
Parse_ADO-4               2.500Ki ± 0%   2.500Ki ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_Minimal-4       1.625Ki ± 0%   1.625Ki ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_ManyParams-4    4.695Ki ± 0%   4.695Ki ± 0%       ~ (p=1.000 n=10) ¹
geomean                   2.535Ki        2.535Ki       +0.00%
¹ all samples are equal

             │ bench_old.txt │            bench_new.txt            │
             │   allocs/op   │ allocs/op   vs base                 │
Parse_URL-4                 22.00 ± 0%   22.00 ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_Azure-4           26.00 ± 0%   26.00 ± 0%       ~ (p=1.000 n=10) ¹
Parse_ADO-4                 40.00 ± 0%   40.00 ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_Minimal-4         16.00 ± 0%   16.00 ± 0%       ~ (p=1.000 n=10) ¹
Parse_URL_ManyParams-4      41.00 ± 0%   41.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                     27.24        27.24       +0.00%
¹ all samples are equal

Generated by CI — commit 38880be

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.

3 participants