Skip to content

test: add metadata/type/row fuzz targets (layer 2/4) - #424

Open
Saurabh Singh (saurabh500) wants to merge 3 commits into
saurabh500-bound-tds-response-allocationsfrom
saurabh500-fuzz-layer2-types
Open

Saurabh Singh (saurabh500) wants to merge 3 commits into
saurabh500-bound-tds-response-allocationsfrom
saurabh500-fuzz-layer2-types

Conversation

@saurabh500

@saurabh500 Saurabh Singh (saurabh500) commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator

Layer 2/4: metadata / type-info / row / variant / PLP fuzz targets

Part of the proactive TDS parser fuzz-hardening effort tracked by #418. Stacks on #421 (saurabh500-bound-tds-response-allocations), which itself stacks on the Layer 1 harness PR #419. Base branch: saurabh500-bound-tds-response-allocations.

Adds types_fuzz_test.go (package mssql) with five structured fuzz targets. Because raw random bytes almost never form a valid COLMETADATA/TYPE_INFO stream, every target is seeded with real wire-format bytes assembled by builders and reuses the Layer 1 harness helpers (frameReplyPackets, newFuzzSession, drainSingleResponse).

Targets

  • FuzzColMetadataAndRow — COLMETADATA + ROW + DONE seeded with one column of every type family: fixed, byte-len (incl. decimal/numeric with prec+scale, guid, legacy char/binary, date/time N at valid scales), short-len (with collation), PLP/(max), long-len (text/ntext/image), and sql_variant carrying many subtypes.
  • FuzzNbcRow — NBCROW null-bitmap decoding with column counts of 7/8/9 and 15/16/17 to hit null-bitmap byte boundaries, across several null masks.
  • FuzzTypeInfoAndValue — drives readTypeInfo directly with a fuzzed typeId + metadata, then runs the installed value Reader, seeded with every valid typeId.
  • FuzzVariantValue — drives readVariantTypeWithEncoding with fuzzed size/vartype/propbytes/payload, seeded with each supported subtype.
  • FuzzPLPValue — drives readPLPType with NULL / unknown-length / single-chunk / multi-chunk / empty / missing-terminator streams for each PLP-backed type.

Invariants enforced

Never hang, never OOM; the only acceptable failure is a recovered parser rejection (StreamError or badStreamPanicf). Runtime panics (index/slice OOB, nil deref) are not swallowed, so the engine records them as crashers. Inputs > 64 KiB are skipped.

Fuzzing results (180 s each, -parallel=6, 32-core/128 GB)

Target Result Execs
FuzzColMetadataAndRow PASS ~2.06M
FuzzNbcRow PASS ~4.19M
FuzzPLPValue PASS ~126k
FuzzProcessSingleResponse (re-run) PASS ~3.32M
FuzzTypeInfoAndValue crash — bug #1 —
FuzzVariantValue crash — bug #2 —

Reduced parallelism (-parallel=6) is used because readLongLenType/readVariantTypeWithEncoding/readPLPType eagerly allocate up to _MAX_PLP_LEN (2 GB) per advertised size; at the default 32 workers, concurrent multi-GB allocations OOM-kill the minimizer. The bound is correct per #421 (no unbounded OOM); the eager reservation is captured as a follow-up hardening note on #418, not blocking here.

Real bugs found (crashers quarantined, not committed here)

Both reproduce deterministically and are not covered by #421. They are handed to a dedicated nested fix session stacked on this branch, which will add the bounds checks + regression tests + the minimized seeds (so seed and fix land green together). The crasher corpus entries are intentionally not committed on this branch so go test . stays green on its own base; the minimized inputs live in the crash report.

  1. readByteLenTypeWithEncoding slice OOB (types.go:397). The per-value length byte is used to slice ti.Buffer[:size] without checking it against the metadata-declared column size, so a value-length byte larger than the column size panics with slice bounds out of range. Sibling issue confirmed at readShortLenType (types.go:522). Repro: typeId=0x26, meta 20 30, value 30.
  2. sql_variant date/time slice OOB (types.go:1063, decodeDateTimeOffset). readVariantTypeWithEncoding sizes the data buffer as size-2-propbytes and hands an undersized buffer to decodeDateTimeOffset/decodeDateTime2, producing a negative slice bound. Repro payload hex: 0d0000002b073030303030303030303030.

go build ./..., go vet ., gofmt, and go test -run 'Fuzz|Test' . are all green on this branch.

Refs #418

@codecov-commenter

Codecov Comments Bot (codecov-commenter) commented Aug 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.48%. Comparing base (d2b7237) to head (7a4e109).

Additional details and impacted files

Impacted file tree graph

@@                              Coverage Diff                              @@
##           saurabh500-bound-tds-response-allocations     #424      +/-   ##
=============================================================================
+ Coverage                                      82.25%   82.48%   +0.22%     
=============================================================================
  Files                                             35       35              
  Lines                                           7096     7096              
=============================================================================
+ Hits                                            5837     5853      +16     
+ Misses                                           992      978      -14     
+ Partials                                         267      265       -2     

see 4 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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

One blocker, and it is the same blocker for #425, #426, #428 and #429. This branch was cut 41 commits ago and never rebased, so its test file calls a version of the fuzz harness that no longer exists. go build passes — the production code is fine — but the test binary does not compile, which means none of the five PRs above this point can run their tests.

The good news is that the design is sound and I verified it end to end: once rebased, the targets this PR adds find two real out-of-bounds panics, and #425 fixes both. The fix is small and I have tested it.

What I verified locally

Merge refs, Go 1.27.0, GOTOOLCHAIN=local semantics matched to CI:

PR go build ./... go vet ./...
#419 PASS PASS
#421 PASS PASS
#424 PASS FAIL
#425 PASS FAIL (inherited)
#426 PASS FAIL (inherited)
#428 PASS FAIL (inherited)
#429 PASS FAIL (inherited)
#410 PASS PASS

Blocker: the harness moved, this branch did not

drainSingleResponse and frameReplyPackets were rewritten on #419 — commit 326d4a8, "widen fuzz fragmentation arg to uint16 for full seam coverage", plus a collect flag and a dbState return. 19 commits on #419/#421 touch token_fuzz_test.go. This branch still calls the original shape:

Branch Signature
#419, #421 drainSingleResponse(stream []byte, chunk int, collect bool) (tokens, dbState, sawError, framed)
#424 → #429 drainSingleResponse(stream []byte, frag byte) (tokenTypes, sawError, framed)

GitHub's merge ref takes the newer harness from #419 and the older callers from here, so:

types_fuzz_test.go:67:  cannot use frag (variable of type byte) as int value in frameReplyPackets
types_fuzz_test.go:141: ucs2 redeclared in this block
   token_fuzz_test.go:326: other declaration of ucs2
types_fuzz_test.go:397: assignment mismatch: 3 variables but drainSingleResponse returns 4 values
types_fuzz_test.go:451: (same)

Ancestry, measured:

#421 on #419:  3 commits behind
#424 on #421:  41 commits behind      <== the break
#425 on #424:  0 behind
#426 on #425:  0 behind
#428 on #426:  0 behind
#429 on #428:  0 behind

Everything from #425 up is stacked perfectly. This one joint is the entire problem.

The fix, tested

The rebase itself is clean — this PR only adds types_fuzz_test.go, so there is no textual conflict. The breakage is purely semantic, and it is 7 insertions / 17 deletions in one file:

  1. fuzzTypeReadBuffer(payload []byte, frag byte) → chunk int, and pass it straight to frameReplyPackets.
  2. Delete the local ucs2 — #419 now provides it in token_fuzz_test.go.
  3. Both drainSingleResponse(stream, frag) → drainSingleResponse(stream, int(frag), false) with four return values.
  4. Three fuzzTypeReadBuffer(payload, frag) call sites → int(frag).

After that, go vet . is clean, and cherry-picking #425 on top applies cleanly and stays vet-clean.

The targets work, and they find real bugs

Run on the rebased tree, 20s each, -parallel 4:

FuzzColMetadataAndRow    PASS   31208 execs (10346/sec), new interesting: 7
FuzzNbcRow               PASS   40928 execs (13639/sec), new interesting: 20
FuzzPLPValue             PASS    3628 execs  (1207/sec), new interesting: 8
FuzzTypeInfoAndValue     FAIL   panic: slice bounds out of range [:49] with capacity 48
FuzzVariantValue         FAIL   panic: slice bounds out of range [:4] with capacity 3

Both crashers appeared within seconds. I then cascaded #425 on top and re-ran the two saved inputs:

FuzzTypeInfoAndValue  0548d93a14ea821c  ->  FIXED (passes)
FuzzVariantValue      0d5d5b66a69d72c6  ->  FIXED (passes)

So the layering does exactly what it claims. That is a good result and worth stating plainly: the targets are not decorative, they caught two genuine out-of-bounds reads in the type decode and SQL_VARIANT paths, and the fix layer closes them.

Suggestion: prefer widening the fuzz input over casting it

int(frag) compiles, but it keeps the fragmentation input a byte, so the targets here only ever explore seams at offsets 0-255. #419's 326d4a8 widened exactly this for "full seam coverage". Changing frag byte to chunk uint16 in the f.Fuzz signatures would match that intent rather than adapting around it. Slightly larger diff, but it is the difference between the seam coverage the harness was upgraded to provide and the coverage this file had before.

Nit: why CI never caught this

Not a change request, just so it is not mistaken for a CI gap you need to fix here. pr-validation.yml triggers on pull_request: branches: [main], and every PR in this stack targets another stack branch, so it never runs. AppVeyor is the only check that builds these merge refs — which is why #429 showed a red appveyor/pr while everything else looked green.

Verdict

  • Blockers: the rebase. Everything from here up is untestable until it lands.
  • Suggestions: widen the fragmentation input to uint16 rather than casting.
  • Nits: none in the code itself.

Rebase order once you start: #421 onto #419, then this onto #421 with the four edits, then #425 → #426 → #428 → #429 replay cleanly (each is a single commit sitting exactly on its parent's tip). Happy to push the rebase if you would rather not hand-run it.

Saurabh Singh (SQL Drivers) and others added 3 commits August 23, 2026 00:54
Add types_fuzz_test.go with five structured TDS parser fuzz targets seeded
with valid wire-format COLMETADATA/TYPE_INFO bytes:

- FuzzColMetadataAndRow: full COLMETADATA + ROW + DONE across every type
  family (fixed, byte-len, date/time, short-len, PLP, long-len, sql_variant).
- FuzzNbcRow: NBCROW null-bitmap decoding around the 7/8/9 and 15/16/17
  column byte boundaries.
- FuzzTypeInfoAndValue: readTypeInfo + value Reader for each valid typeId.
- FuzzVariantValue: readVariantTypeWithEncoding across supported subtypes.
- FuzzPLPValue: readPLPType with NULL/unknown-length/single/multi-chunk/
  empty/missing-terminator streams for each PLP-backed type.

Direct-read targets recover expected parser rejections (StreamError /
badStreamPanicf) but let runtime panics (slice bounds, nil deref) escape so
the engine records them as crashers.

Two committed crashers guard real production slice-bounds bugs found while
fuzzing (kept as regression seeds until fixed):
- readByteLenTypeWithEncoding slices ti.Buffer[:size] with a per-value length
  byte that can exceed the metadata-declared column size.
- readVariantTypeWithEncoding passes an undersized data buffer to
  decodeDateTimeOffset/decodeDateTime2, yielding a negative slice bound.

Refs #418

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove the two committed crashers so the Layer 2 branch is green on its own base. The minimized inputs are recorded in the crash report; the nested fix session (stacked on this branch) will re-add them as regression seeds once readByteLenTypeWithEncoding and readShortLenType are bounded.

Refs #418

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The layer 1 harness changed on #419 after this branch was cut: the
fragmentation argument widened from byte to int, drainSingleResponse
gained a collect flag and a dbState return, and ucs2 moved to
token_fuzz_test.go. Update the layer 2 call sites to match.

The f.Fuzz signatures keep frag as a byte so the committed corpus
files stay valid; only the calls into the harness are converted.
Copilot AI lite review requested due to automatic review settings August 23, 2026 05:58

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

This PR adds Layer 2 structured fuzz targets (metadata/type-info/row, sql_variant, and PLP value decoding) to expand coverage of the TDS query-response parser hardening effort tracked in #418. It builds valid wire-format seeds using helpers from the Layer 1 fuzz harness and then lets the Go fuzz engine mutate those structured inputs.

Changes:

  • Add FuzzColMetadataAndRow and FuzzNbcRow to exercise COLMETADATA + ROW/NBCROW decoding via the full response parser.
  • Add direct fuzz drivers for type-info/value decoding, sql_variant, and PLP-backed values using real tdsBuffer reads (including cross-packet seams).
  • Add a small internal test-only framework for classifying “expected parser rejection” panics vs. crash-worthy runtime/string panics.

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

Comment thread types_fuzz_test.go
Comment on lines +312 to +327
func variantSubtypeValues() [][]byte {
return [][]byte{
variantValue(typeInt4, nil, []byte{4, 3, 2, 1}),
variantValue(typeBit, nil, []byte{1}),
variantValue(typeInt8, nil, []byte{8, 7, 6, 5, 4, 3, 2, 1}),
variantValue(typeFlt8, nil, make([]byte, 8)),
variantValue(typeMoney, nil, make([]byte, 8)),
variantValue(typeDateTime, nil, make([]byte, 8)),
variantValue(typeGuid, nil, make([]byte, 16)),
variantValue(typeDecimalN, []byte{18, 0}, []byte{0x01, 0x2a, 0, 0, 0}),
variantValue(typeBigVarChar, append(collationBytes(), 0, 0), []byte("abcd")),
variantValue(typeNVarChar, append(collationBytes(), 0, 0), ucs2("ab")),
variantValue(typeTimeN, []byte{7}, make([]byte, 5)),
variantValue(typeBigVarBin, []byte{0, 0}, []byte{1, 2, 3, 4}),
}
}
Comment thread types_fuzz_test.go
Comment on lines +32 to +36
// isExpectedParserPanic reports whether a recovered panic value represents a
// deliberate parser rejection of a malformed stream (acceptable) rather than a
// real bug. StreamError and the plain fmt.Errorf values raised by
// badStreamPanicf both satisfy the error interface but are NOT runtime.Error;
// runtime panics (index out of range, slice bounds, nil deref) implement
Comment thread types_fuzz_test.go
Comment on lines +529 to +533
for sel := range plpFuzzTypeIds {
for _, s := range seeds {
f.Add(byte(sel), s, byte(0))
}
}
@dlevy-msft-sql

Copy link
Copy Markdown

Rebase pushed — and a correction to my earlier review

I pushed the rebase (7141a8e → 7a4e109, force-with-lease). The merge ref now compiles clean.

Correction

My earlier review said the test files "don't compile" without qualifying which ref. That was
imprecise and unfair to the branch. Your branch always compiled. Only the merge ref broke:

PR head go vet merge go vet
#424 (before) CLEAN 7 errors
#424 (now) CLEAN CLEAN

This was staleness, not a code defect. Apologies for the framing.

What I changed

Two of your commits cherry-picked onto #421 unchanged, keeping your authorship, plus one
separate commit from me for the call sites. 24 lines in types_fuzz_test.go:

  • fuzzTypeReadBuffer(payload []byte, frag byte) → chunk int, passed straight to frameReplyPackets
  • deleted the local ucs2 — test: add TDS response fuzz harness and end-to-end target (layer 1/4) #419 now provides it at token_fuzz_test.go:326
  • 2x drainSingleResponse(stream, frag) → (stream, int(frag), false), 4 return values
  • 3x fuzzTypeReadBuffer(payload, frag) → int(frag)

I withdrew my own suggestion

I had suggested widening the f.Fuzz signature to uint16 to match 326d4a8's intent instead
of casting. That was wrong — I checked #425's corpus files and they pass the fragmentation
arg as byte(...):

testdata/fuzz/FuzzTypeInfoAndValue/e6262283564e6313   4 values, last = byte('\x00')
testdata/fuzz/FuzzVariantValue/5701d05c922fd569       2 values, last = byte('\x43')

Widening the type would invalidate all four. Keeping frag byte in the f.Fuzz signature and
casting only at the harness boundary is the right call. If you do want the wider seam coverage
later, it needs a corpus regeneration in the same commit.

Verified after the rebase

gofmt -l                  clean
go vet ./...              clean
go test -run Fuzz .       PASS (seed corpus)
#425 cherry-picked on top CLEAN, vet clean

And with #425 applied, 15s each:

PASS  FuzzTypeInfoAndValue    14244 execs
PASS  FuzzVariantValue        23454 execs
PASS  FuzzColMetadataAndRow   32795 execs
PASS  FuzzNbcRow              34364 execs
PASS  FuzzPLPValue             2739 execs

One thing worth flagging: the quarantine commit

test: quarantine fuzz crashers pending production fix deletes
FuzzTypeInfoAndValue/e6262283564e6313 and FuzzVariantValue/5701d05c922fd569, and #425 adds
them back with the fix. That's a reasonable way to keep the layer green, but it creates a
merge-order constraint: if this PR lands without #425 close behind, main has a known
out-of-bounds read in the type/variant decode path with the reproducer deleted. Deleting the
corpus does not stop rediscovery — I hit both panics within seconds of fuzzing — so #429's
nightly would go red on that main anyway.

Recommend #424 and #425 land together, or #425 immediately after.

Verdict

I had to cascade the same fix through #425–#429 — #426 had the identical drift in
token_complex_fuzz_test.go. All four are pushed and all five merge refs now compile.

@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 9V74 80-Core Processor                
                         │ bench_old.txt │            bench_new.txt            │
                         │    sec/op     │   sec/op     vs base                │
TdsBuffer_Write_Small-4               12.49n ±  0%   12.46n ± 0%   -0.20% (p=0.006 n=10)
TdsBuffer_Write_Medium-4              23.43n ±  1%   23.95n ± 0%   +2.24% (p=0.000 n=10)
TdsBuffer_Write_Large-4               131.2n ±  0%   132.2n ± 0%   +0.80% (p=0.001 n=10)
TdsBuffer_WriteByte-4                 269.8n ±  0%   269.6n ± 0%        ~ (p=0.838 n=10)
TdsBuffer_Read_Small-4                9.566n ±  0%   9.585n ± 0%        ~ (p=0.054 n=10)
TdsBuffer_ReadByte-4                  287.9n ±  0%   287.5n ± 0%        ~ (p=0.288 n=10)
TdsBuffer_Uint16-4                    133.1n ±  1%   133.3n ± 1%        ~ (p=0.986 n=10)
TdsBuffer_Uint32-4                    131.7n ±  2%   133.2n ± 2%        ~ (p=0.382 n=10)
TdsBuffer_Uint64-4                    169.0n ±  0%   169.0n ± 0%        ~ (p=0.960 n=10)
TdsBuffer_BeginFinishPacket-4         6.832n ±  1%   6.756n ± 0%   -1.11% (p=0.000 n=10)
ReadBVarCharOrPanicWideChars-4        153.8n ±  3%   152.5n ± 0%   -0.88% (p=0.000 n=10)
ReadBVarCharOrPanicOnly1WideChar-4    195.9n ±  1%   193.7n ± 0%   -1.17% (p=0.000 n=10)
BulkMakeParam_Int64-4                 26.33n ±  0%   26.41n ± 1%        ~ (p=0.054 n=10)
BulkMakeParam_Int32-4                 25.75n ±  0%   25.75n ± 1%        ~ (p=0.985 n=10)
BulkMakeParam_Float64-4               26.32n ±  0%   26.33n ± 0%        ~ (p=0.590 n=10)
BulkMakeParam_String_NVarChar-4       251.2n ±  1%   254.9n ± 4%        ~ (p=0.363 n=10)
BulkMakeParam_String_VarChar-4        39.66n ±  0%   39.71n ± 0%        ~ (p=0.492 n=10)
BulkMakeParam_DateTime-4              83.88n ±  1%   84.50n ± 1%        ~ (p=0.019 n=10)
BulkMakeParam_DateTime2-4             91.52n ± 12%   90.41n ± 1%   -1.21% (p=0.001 n=10)
BulkMakeParam_Bool-4                  23.77n ±  2%   23.71n ± 0%        ~ (p=0.078 n=10)
BulkMakeParam_MultiColumn-4           202.0n ±  1%   199.8n ± 0%   -1.09% (p=0.001 n=10)
ConvertAssign_StringToString-4        16.16n ±  1%   16.14n ± 1%        ~ (p=0.468 n=10)
ConvertAssign_StringToBytes-4         45.11n ±  1%   44.10n ± 1%   -2.23% (p=0.001 n=10)
ConvertAssign_BytesToString-4         57.03n ±  2%   55.92n ± 1%   -1.96% (p=0.000 n=10)
ConvertAssign_BytesToBytes-4          57.95n ±  2%   56.68n ± 1%   -2.17% (p=0.000 n=10)
ConvertAssign_Int64ToInt64-4          38.60n ±  0%   38.17n ± 0%   -1.10% (p=0.000 n=10)
ConvertAssign_Int64ToString-4         49.09n ±  3%   48.18n ± 4%        ~ (p=0.105 n=10)
ConvertAssign_Float64ToFloat64-4      38.56n ±  1%   37.91n ± 0%   -1.71% (p=0.000 n=10)
ConvertAssign_TimeToTime-4            40.44n ±  1%   39.62n ± 1%   -2.00% (p=0.000 n=10)
ConvertAssign_TimeToString-4          120.8n ±  2%   118.5n ± 0%   -1.95% (p=0.000 n=10)
ConvertAssign_NilToBytes-4            17.90n ±  1%   17.66n ± 1%        ~ (p=0.055 n=10)
ConvertAssign_Int64ToInterface-4      16.27n ±  1%   16.20n ± 1%        ~ (p=0.030 n=10)
ConvertAssign_StringToRawBytes-4      46.75n ±  1%   46.12n ± 0%   -1.34% (p=0.001 n=10)
ConvertAssign_BoolToBool-4            13.37n ±  0%   13.39n ± 0%        ~ (p=0.048 n=10)
RoundTrip_ConnectDisconnect-4         95.40m ±  1%   94.09m ± 0%   -1.38% (p=0.000 n=10)
RoundTrip_Select1-4                   314.6µ ±  2%   309.9µ ± 2%        ~ (p=0.023 n=10)
RoundTrip_ParamQuery-4                260.4µ ±  1%   256.5µ ± 1%        ~ (p=0.023 n=10)
RoundTrip_MultiRow-4                  715.8µ ±  1%   710.9µ ± 3%        ~ (p=0.529 n=10)
RoundTrip_LargeResultSet-4            4.023m ±  1%   3.900m ± 1%   -3.04% (p=0.000 n=10)
RoundTrip_ExecInsert-4                284.8µ ±  2%   278.3µ ± 1%   -2.31% (p=0.001 n=10)
RoundTrip_StoredProc-4                277.2µ ±  2%   273.6µ ± 1%        ~ (p=0.029 n=10)
RoundTrip_Transaction-4               719.1µ ±  2%   711.3µ ± 0%   -1.08% (p=0.000 n=10)
RoundTrip_BulkInsert/Rows_100-4       3.577m ±  2%   3.331m ± 1%   -6.89% (p=0.000 n=10)
RoundTrip_BulkInsert/Rows_1000-4      5.542m ±  2%   5.180m ± 0%   -6.53% (p=0.000 n=10)
RoundTrip_ConcurrentQueries-4         164.2µ ±  3%   156.9µ ± 2%   -4.44% (p=0.004 n=10)
RoundTrip_MixedTypes-4                403.8µ ±  2%   401.1µ ± 1%        ~ (p=0.218 n=10)
RoundTrip_LargePayload-4              519.8µ ±  0%   514.1µ ± 0%   -1.10% (p=0.001 n=10)
RoundTrip_PreparedStmt-4              260.2µ ±  1%   258.4µ ± 1%        ~ (p=0.165 n=10)
RoundTrip_MessageQuery-4              532.5µ ±  1%   523.3µ ± 1%   -1.73% (p=0.000 n=10)
WriteTypeInfo_Int8-4                  45.64n ±  1%   45.80n ± 0%        ~ (p=0.077 n=10)
WriteTypeInfo_NVarChar-4              104.4n ±  1%   104.1n ± 1%        ~ (p=0.044 n=10)
WriteTypeInfo_NVarCharMax-4           104.0n ±  0%   103.9n ± 0%        ~ (p=0.262 n=10)
WriteByteLenType-4                    28.85n ±  1%   28.77n ± 1%        ~ (p=0.403 n=10)
WriteShortLenType-4                   31.72n ±  0%   31.64n ± 2%        ~ (p=0.128 n=10)
WritePLPType_Short-4                  87.22n ±  0%   86.58n ± 0%   -0.72% (p=0.000 n=10)
SendRpc_SingleIntParam-4              13.64µ ±  2%   12.85µ ± 2%   -5.78% (p=0.000 n=10)
Str2ucs2_Short-4                      83.93n ±  1%   77.96n ± 0%   -7.11% (p=0.000 n=10)
Str2ucs2_Medium-4                     189.5n ±  0%   170.3n ± 0%  -10.11% (p=0.000 n=10)
Str2ucs2_Long-4                       720.0n ±  1%   633.5n ± 1%  -12.01% (p=0.000 n=10)
Ucs22str_ASCII-4                      61.75n ±  1%   54.17n ± 0%  -12.28% (p=0.000 n=10)
Ucs22str_Unicode-4                    213.5n ±  0%   202.3n ± 1%   -5.22% (p=0.001 n=10)
Ucs22str_LongASCII-4                  123.5n ±  2%   109.2n ± 1%  -11.58% (p=0.000 n=10)
ManglePassword_Short-4                99.62n ±  2%   90.38n ± 0%   -9.28% (p=0.000 n=10)
ManglePassword_Long-4                 422.7n ±  1%   376.1n ± 1%  -11.04% (p=0.000 n=10)
SendLogin-4                           1.338µ ±  1%   1.230µ ± 0%   -8.07% (p=0.000 n=10)
WritePrelogin-4                       612.8n ±  3%   592.6n ± 0%   -3.31% (p=0.000 n=10)
Ucs22strAscii-4                       15.05n ±  1%   14.05n ± 3%   -6.64% (p=0.000 n=10)
Ucs22strMediumAscii-4                 23.42n ±  1%   21.72n ± 0%   -7.26% (p=0.000 n=10)
Ucs22strLongAscii-4                   57.10n ±  1%   50.86n ± 0%  -10.93% (p=0.000 n=10)
Ucs22strLongerAscii-4                 438.1n ±  1%   377.1n ± 1%  -13.92% (p=0.000 n=10)
Ucs22strTrailingUnicode-4             153.8n ±  4%   143.3n ± 0%   -6.86% (p=0.000 n=10)
Ucs22strLongEmojis-4                  231.0n ±  1%   210.8n ± 0%   -8.72% (p=0.000 n=10)
ParseDone-4                           9.654n ±  0%   9.632n ± 0%        ~ (p=0.171 n=10)
ParseDoneInProc-4                     9.649n ±  0%   9.651n ± 0%        ~ (p=0.644 n=10)
ParseReturnStatus-4                   2.490n ±  0%   2.495n ± 0%        ~ (p=0.669 n=10)
ParseOrder-4                          26.36n ±  2%   24.46n ± 8%   -7.21% (p=0.004 n=10)
ParseError72-4                        191.6n ±  2%   173.9n ± 0%   -9.26% (p=0.000 n=10)
ParseInfo-4                           207.1n ±  1%   185.6n ± 0%  -10.36% (p=0.000 n=10)
ParseLoginAck-4                       72.77n ±  1%   65.37n ± 0%  -10.16% (p=0.000 n=10)
ParseFeatureExtAck_Empty-4            36.83n ±  1%   32.74n ± 0%  -11.12% (p=0.000 n=10)
ParseTabName-4                        55.39n ±  1%   51.32n ± 0%   -7.35% (p=0.001 n=10)
ParseColInfo-4                        55.97n ±  1%   51.15n ± 0%   -8.61% (p=0.000 n=10)
ReadFixedType_Int64-4                 28.11n ±  1%   26.13n ± 0%   -7.03% (p=0.000 n=10)
ReadFixedType_Int32-4                 16.57n ±  0%   16.62n ± 0%        ~ (p=0.177 n=10)
ReadFixedType_Float64-4               27.71n ±  1%   25.79n ± 0%   -6.93% (p=0.000 n=10)
ReadFixedType_DateTime-4              59.53n ±  1%   54.47n ± 0%   -8.52% (p=0.000 n=10)
ReadByteLenType_IntN_8-4              29.28n ±  0%   27.20n ± 0%   -7.09% (p=0.000 n=10)
ReadByteLenType_IntN_4-4              28.88n ±  1%   27.04n ± 0%   -6.37% (p=0.000 n=10)
ReadByteLenType_FloatN_8-4            29.12n ±  1%   27.30n ± 0%   -6.25% (p=0.000 n=10)
ReadByteLenType_BitN-4                16.62n ±  0%   16.59n ± 0%        ~ (p=0.547 n=10)
ReadByteLenType_Null-4                6.018n ±  0%   6.022n ± 0%        ~ (p=0.897 n=10)
ReadShortLenType_NVarChar_Short-4     52.78n ±  1%   48.44n ± 0%   -8.21% (p=0.000 n=10)
ReadShortLenType_NVarChar_Medium-4    92.64n ±  1%   84.05n ± 1%   -9.28% (p=0.000 n=10)
ReadShortLenType_VarBinary-4          68.51n ±  1%   60.44n ± 1%  -11.78% (p=0.000 n=10)
ReadByteLenType_VarChar-4             61.79n ±  1%   56.59n ± 1%   -8.41% (p=0.000 n=10)
DecodeDateTime-4                      41.37n ±  1%   37.80n ± 0%   -8.64% (p=0.000 n=10)
DecodeDateTim4-4                      38.51n ±  1%   35.52n ± 0%   -7.75% (p=0.000 n=10)
EncodeDateTime-4                      72.99n ±  1%   67.66n ± 0%   -7.31% (p=0.000 n=10)
geomean                               264.1n         253.9n        -3.87%

               │ bench_old.txt │            bench_new.txt             │
               │      B/s      │     B/s       vs base                │
TdsBuffer_Write_Small-4     4.774Gi ± 0%   4.785Gi ± 0%   +0.23% (p=0.007 n=10)
TdsBuffer_Write_Medium-4    40.71Gi ± 1%   39.81Gi ± 0%   -2.22% (p=0.000 n=10)
TdsBuffer_Write_Large-4     58.15Gi ± 0%   57.68Gi ± 0%   -0.80% (p=0.002 n=10)
TdsBuffer_Read_Small-4      6.231Gi ± 0%   6.219Gi ± 0%        ~ (p=0.063 n=10)
Str2ucs2_Short-4            68.18Mi ± 1%   73.39Mi ± 0%   +7.65% (p=0.000 n=10)
Str2ucs2_Medium-4           135.9Mi ± 0%   151.1Mi ± 0%  +11.24% (p=0.000 n=10)
Str2ucs2_Long-4             132.5Mi ± 1%   150.5Mi ± 1%  +13.64% (p=0.000 n=10)
Ucs22str_ASCII-4            1.086Gi ± 1%   1.238Gi ± 0%  +14.00% (p=0.000 n=10)
Ucs22str_Unicode-4          214.5Mi ± 0%   226.3Mi ± 1%   +5.50% (p=0.001 n=10)
Ucs22str_LongASCII-4        1.915Gi ± 2%   2.166Gi ± 1%  +13.12% (p=0.000 n=10)
geomean                     1.427Gi        1.513Gi        +6.03%

                         │ 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        164.0Ki ± 3%     166.3Ki ± 2%       ~ (p=0.912 n=10)
RoundTrip_Select1-4                  2.603Ki ± 0%     2.603Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_ParamQuery-4               5.782Ki ± 0%     5.782Ki ± 0%       ~ (p=1.000 n=10)
RoundTrip_MultiRow-4                 37.17Ki ± 0%     37.17Ki ± 0%       ~ (p=0.684 n=10)
RoundTrip_LargeResultSet-4           277.3Ki ± 0%     277.3Ki ± 0%       ~ (p=0.101 n=10)
RoundTrip_ExecInsert-4               6.109Ki ± 0%     6.110Ki ± 0%       ~ (p=0.650 n=10)
RoundTrip_StoredProc-4               5.399Ki ± 0%     5.399Ki ± 0%       ~ (p=0.474 n=10)
RoundTrip_Transaction-4              7.446Ki ± 0%     7.444Ki ± 0%       ~ (p=0.633 n=10)
RoundTrip_BulkInsert/Rows_100-4      72.42Ki ± 0%     72.38Ki ± 0%       ~ (p=0.143 n=10)
RoundTrip_BulkInsert/Rows_1000-4     583.8Ki ± 0%     583.7Ki ± 0%       ~ (p=0.023 n=10)
RoundTrip_ConcurrentQueries-4        2.676Ki ± 0%     2.668Ki ± 1%       ~ (p=0.323 n=10)
RoundTrip_MixedTypes-4               6.643Ki ± 0%     6.643Ki ± 0%       ~ (p=0.365 n=10)
RoundTrip_LargePayload-4             134.7Ki ± 0%     134.8Ki ± 0%       ~ (p=0.516 n=10)
RoundTrip_PreparedStmt-4             5.454Ki ± 0%     5.454Ki ± 0%       ~ (p=0.474 n=10)
RoundTrip_MessageQuery-4             13.76Ki ± 0%     13.76Ki ± 0%       ~ (p=0.050 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%       ~ (p=0.650 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.01%                ²
¹ 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.0 ± 0%       ~ (p=0.423 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.110k ± 0%       ~ (p=1.000 n=10)
RoundTrip_BulkInsert/Rows_1000-4     21.45k ± 0%     21.45k ± 0%       ~ (p=0.420 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.655µ ± 1%   3.598µ ± 1%  -1.56% (p=0.001 n=10)
Parse_URL_Azure-4          4.311µ ± 0%   4.287µ ± 0%  -0.56% (p=0.000 n=10)
Parse_ADO-4                4.241µ ± 1%   4.198µ ± 0%  -1.03% (p=0.001 n=10)
Parse_URL_Minimal-4        2.448µ ± 1%   2.411µ ± 0%  -1.53% (p=0.000 n=10)
Parse_URL_ManyParams-4     6.823µ ± 6%   6.558µ ± 0%  -3.89% (p=0.000 n=10)
geomean                    4.069µ        3.999µ       -1.72%

             │ 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 207db9a

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.

4 participants