This is an automated email from the ASF dual-hosted git repository.
zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-go.git
The following commit(s) were added to refs/heads/main by this push:
new 9fcf02e1 chore: Bump modernc.org/sqlite from 1.53.0 to 1.54.0 (#964)
9fcf02e1 is described below
commit 9fcf02e1bb249eeaa1f21333e5afe6f72e4b7f9a
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Wed Jul 22 10:45:31 2026 -0400
chore: Bump modernc.org/sqlite from 1.53.0 to 1.54.0 (#964)
Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.53.0
to 1.54.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md">modernc.org/sqlite's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<ul>
<li>
<p>2026-07-20 v1.55.0:</p>
<ul>
<li>Add <code>github.com/mattn/go-sqlite3</code>-compatible shorthand
DSN query parameters to ease migration from that driver:
<code>_busy_timeout</code>/<code>_timeout</code>,
<code>_foreign_keys</code>/<code>_fk</code>,
<code>_journal_mode</code>/<code>_journal</code>,
<code>_synchronous</code>/<code>_sync</code>,
<code>_auto_vacuum</code>/<code>_vacuum</code>, and
<code>_query_only</code>, each setting the correspondingly named PRAGMA.
Values are validated against the same set <code>mattn/go-sqlite3</code>
accepts (case-insensitive) and an unrecognized value fails the
connection with an error, so a typo such as
<code>_synchronous=fu1l</code> or <code>_foreign_keys=yes_please</code>
is reported rather than silently downgrading durability or dropping
foreign-key enforcement. The keys are applied in a fixed order
independent of their order in the DSN — <code>_busy_timeout</code> and
<code>_auto_vacuum</code> before any <code>_pragma</code> values
(<code>auto_vacuum</code> must be set before the database is first
written), the rest after, and <code>_query_only</code> last — and where
a key and its alias are both supplied the alias wins, matching
<code>mattn/go-sqlite3</code>. Behavior change to note: prior releases
ignored these keys entirely, so a DSN carried over from a
<code>mattn/go-sqlite3</code> setup changes in two ways. A recognized
key that previously did nothing now takes effect —
<code>_foreign_keys=on</code> begins enforcing constraints against data
that may already violate them, <code>_journal_mode=wal</code>
persistently converts the database file, and <code>_query_only=1</code>
makes the connection read-only. And a value outside the accepted set now
fails the connection with an error where the same DSN previously opened
successfully — for example a duration-style
<code>_busy_timeout=5s</code> or <code>_timeout=5000ms</code>, neither
of which is the integer that key requires. Review such DSNs before
upgrading. <code>_pragma</code> and all other existing parameters are
unchanged.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/134">#134</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/134">https://gitlab.com/cznic/sqlite/-/merge_requests/134</a>),
thanks Toni Spets (<a
href="https://github.com/beeper-hifi"><code>@beeper-hifi</code></a>)
and Ian Chechin!</li>
</ul>
</li>
<li>
<p>2026-07-15 v1.54.0:</p>
<ul>
<li>Upgrade to <a
href="https://sqlite.org/releaselog/3_53_3.html">SQLite 3.53.3</a>. This
also bumps the pinned <code>modernc.org/libc</code> to v1.74.1; as
always, downstream modules must pin the exact same
<code>modernc.org/libc</code> version this module's <code>go.mod</code>
pins (see [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/177">#177</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/177">https://gitlab.com/cznic/sqlite/-/issues/177</a>)).</li>
<li>Under the opt-in <code>_texttotime</code> DSN parameter, best-effort
parse date-shaped TEXT values from columns SQLite reports with an empty
declared type — aggregates and expressions over a date column
(<code>MAX(d)</code>, <code>COALESCE(d, ...)</code>,
<code>upper(d)</code>, <code>d || ''</code>), subqueries, and typeless
real columns (<code>CREATE TABLE t(x)</code>) — into
<code>time.Time</code>, instead of delivering them as a raw string that
<code>Scan</code> cannot store into a <code>*time.Time</code>. The
existing declared
<code>DATE</code>/<code>DATETIME</code>/<code>TIME</code>/<code>TIMESTAMP</code>
path is unchanged; this only adds the empty-decltype case. The
conversion is strictly best-effort: a value that does not parse as a
time falls through to the original string, so no <code>Scan</code> that
worked before can newly fail. <code>ColumnTypeScanType</code> continues
to report <code>string</code> for empty-decltype columns, since the
declared type cannot prove the column is temporal. Without
<code>_texttotime</code> the behavior is byte-for-byte unchanged.
Resolves [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/248">#248</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/248">https://gitlab.com/cznic/sqlite/-/issues/248</a>).</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/133">#133</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/133">https://gitlab.com/cznic/sqlite/-/merge_requests/133</a>),
thanks Ian Chechin!</li>
</ul>
</li>
<li>
<p>2026-06-21 v1.53.0:</p>
<ul>
<li>Add <strong>experimental</strong> <code>netbsd/amd64</code> support,
resolving the long-standing build break in [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/246">#246</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/246">https://gitlab.com/cznic/sqlite/-/issues/246</a>).
This target is intentionally <strong>not yet listed among the supported
platforms</strong> in the package documentation: the port had been
broken for years and is only now revived, and there is as yet no
real-world experience running it under production workloads. Green CI is
not the same as battle-tested — so while the full test suite (including
the <code>pcache</code> and <code>vec</code> packages and the
<code>-race</code> concurrency test) passes on NetBSD 10.1 / Go 1.26.3,
and the entire upstream toolchain (<code>libc</code>, <code>cc</code>,
<code>ccgo</code>, <code>libz</code>, <code>libtcl8.6</code>,
<code>libsqlite3</code>, <code>libsqlite_vec</code>) is green on the
NetBSD CI builder, the target is offered for evaluation only. If you run
NetBSD, please exercise it with your own workloads and report back via
<a href="https://gitlab.com/cznic/sqlite/issues/246">#246</a>; the
intent is to promote it to a fully supported platform after a period of
broader real-world testing (on the order of a month) elapses without
surprises.</li>
<li>Implementation notes: the previously shipped
<code>lib/sqlite_netbsd_amd64.go</code> was a stale old-generator
transpile that no longer compiled (the
<code>mu.enter</code>/<code>mu.leave</code> break in <a
href="https://gitlab.com/cznic/sqlite/issues/246">#246</a>); it is
replaced by a fresh new-generator transpile consistent with every other
platform, and <code>modernc.org/sqlite/vec</code> (sqlite-vec) is
vendored and auto-registers on netbsd. Correct operation requires the
matching pinned <code>modernc.org/libc</code>, which carries two
NetBSD-specific fixes found during this work: the <code>mmap(2)</code>
<code>PAD</code>-argument ABI (without it, concurrent WAL access faults
with SIGBUS in the WAL-index shared memory) and a working
<code>abort(3)</code> (the prior stub left SQLite's crash-recovery
<code>writecrash</code> test unable to terminate by signal). As usual,
downstream modules must pin the exact <code>modernc.org/libc</code>
version this module's <code>go.mod</code> pins.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/82">#82</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/82">https://gitlab.com/cznic/sqlite/-/merge_requests/82</a>),
thanks Leonardo Taccari (<a
href="https://github.com/iamleot"><code>@iamleot</code></a>) and Thomas
Klausner (@<em>wiz</em>)!</li>
<li>Add <strong>experimental</strong> <code>freebsd/386</code> and
<code>freebsd/arm</code> support. As with the <code>netbsd/amd64</code>
target above, these two 32-bit FreeBSD ports are intentionally
<strong>not yet listed among the supported platforms</strong> in the
package documentation: <code>freebsd/386</code> previously shipped a
stale, effectively untested SQLite 3.41 transpile, and
<code>freebsd/arm</code> is entirely new, so neither has real-world
production mileage yet. Both are now freshly transpiled at SQLite 3.53.2
consistent with every other platform, build cleanly, and pass the full
test suite (core, WAL/concurrency, and the <code>vec</code> package) on
the FreeBSD CI builders; they are offered for evaluation only. If you
run 32-bit FreeBSD, please exercise these targets with your own
workloads and report back — the intent is to promote
<code>freebsd/386</code>, <code>freebsd/arm</code>, and
<code>netbsd/amd64</code> to fully supported platforms in a future
release cycle, once a period of broader real-world testing elapses
without surprises.</li>
<li>Implementation notes: correct operation on <code>freebsd/arm</code>
requires the matching pinned <code>modernc.org/libc</code> (v1.73.4),
which fixes the per-arch <code>mmap(2)</code> <code>off_t</code>
encoding for 32-bit FreeBSD; without it the WAL shared-memory mapping
faults with SIGBUS under concurrent access, the same class of bug found
on the netbsd port. As usual, downstream modules must pin the exact
<code>modernc.org/libc</code> version this module's <code>go.mod</code>
pins.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/119">#119</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/119">https://gitlab.com/cznic/sqlite/-/merge_requests/119</a>),
thanks Olivier Cochard-Labbé (<a
href="https://github.com/ocochard"><code>@ocochard</code></a>)!</li>
<li>Add a Go-facing wrapper for <code>SQLITE_CONFIG_PCACHE2</code>.
<code>PageCache</code> is the factory and <code>Cache</code> the
per-database instance, both idiomatic Go interfaces; <code>Page</code>
exposes the raw <code>Buf</code> and <code>Extra</code> pointers that
SQLite reads through the C pcache contract.
<code>RegisterPageCache</code> and <code>MustRegisterPageCache</code>
install the module process-globally before the first
<code>sql.Open</code>; subsequent Open calls are gated through a
one-shot <code>Xsqlite3_config(SQLITE_CONFIG_PCACHE2)</code> so a
too-late Register returns <code>ErrPageCacheTooLate</code> rather than
silently falling through to the built-in pcache1. The binding owns the
<code>sqlite3_pcache_page</code> stub and re-consults the implementation
on every Fetch, reusing the stub only when the returned
<code>Page</code> value is unchanged, which keeps a bounded/evicting
purgeable cache safe by construction.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/126">#126</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/126">https://gitlab.com/cznic/sqlite/-/merge_requests/126</a>),
thanks Ian Chechin!</li>
<li>Add <code>modernc.org/sqlite/pcache</code>, the reference page-cache
implementation that accompanies the <a
href="https://gitlab.com/cznic/sqlite/issues/126">#126</a>
<code>SQLITE_CONFIG_PCACHE2</code> wrapper. <code>pcache.New</code>
returns a <code>*Pool</code> satisfying the <code>PageCache</code>
interface; register it once with
<code>sqlite.MustRegisterPageCache(pcache.New())</code> and every
connection opened afterwards draws its pages from it. Each
<code>Pool.Create</code> mints a fresh per-database <code>Cache</code>:
a bounded, LRU-evicting page store that honours the <code>PRAGMA
cache_size</code> soft cap and releases the least-recently-unpinned page
when it must make room. Page memory — the <code>Buf</code> and
<code>Extra</code> buffers SQLite reads through — is allocated with
<code>libc.Xmalloc</code>/<code>libc.Xcalloc</code> and therefore lives
off the Go heap, which keeps SQLite's interior pointer arithmetic on the
page extras from tripping the race detector's checkptr enforcement.
<code>Pool.Stats</code> reports aggregate lifetime counters (hits,
misses, allocs, evictions, rekeys, truncates, caches) across every cache
a Pool has created, so hit/miss/eviction behaviour is observable without
instrumenting individual caches. Cross-connection page sharing is out of
scope for now; each <code>Create</code> returns an independent
per-database cache.</li>
<li>Validated end-to-end against the <a
href="https://gitlab.com/cznic/sqlite/issues/126">#126</a> stress
workload (<code>cache_size=16</code>, 4000 BLOB rows with DELETE and
<code>incremental_vacuum</code>, <code>integrity_check</code> clean
under <code>-race</code>) and benchmarked for the memory-utilization
goal tracked in [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/204">#204</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/204">https://gitlab.com/cznic/sqlite/-/issues/204</a>).</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/127">#127</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/127">https://gitlab.com/cznic/sqlite/-/merge_requests/127</a>),
thanks Ian Chechin!</li>
<li>Tighten the <code>modernc.org/sqlite/pcache</code> reference
implementation per cznic's !127 review follow-ups. Adds
<code>Stats.EasyRefusals</code>, a per-Pool counter for the cases where
<code>FetchCreateEasy</code> returns nil at cap; SQLite reacts to a
refusal by spilling dirty pages and retrying with
<code>FetchCreateForce</code>, so the new field is a direct proxy for
the I/O pressure the strict Easy contract imposes vs pcache1's
recycle-without-spill behavior. <code>BenchmarkPoolEvictionChurn</code>
was reworked to drive a rotating-residue DELETE (<code>k % 3 = i %
3</code>) and re-insert a matching batch each cycle so the spill
pressure recurs and <code>easy-refusals/op</code> scales with
<code>b.N</code> instead of capping at the seed's one-time first-cycle
cost; both existing benchmarks now report <code>easy-refusals/op</code>
alongside the page-allocs/evictions metrics.
<code>Stats.Evictions</code> documentation was tightened to match the
actual behavior (counts LRU eviction, <code>Unpin(discard=true)</code>,
<code>Shrink</code> releases, and <code>Unpin(discard=false)</code>
trimming back to target after a <code>FetchCreateForce</code>
overcommit; bulk frees from <code>Truncate</code>, <code>Rekey</code>
collisions, and <code>Destroy</code> are not counted). The
<code>TestPoolRoundTripIntegrity</code> comment claiming the workload
exercises <code>xRekey</code> ~15 times has been corrected; the SQL
surface does not reliably emit xRekey here, and that codepath is covered
by the unit tests instead.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/130">#130</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/130">https://gitlab.com/cznic/sqlite/-/merge_requests/130</a>),
thanks Ian Chechin!</li>
<li>Make <code>modernc.org/sqlite/pcache</code> <code>-race</code>-clean
under SQLite's <code>cache=shared</code> mode. The pool already runs
correctly under shared-cache because every callback into a given
<code>Cache</code> is serialised internally by SQLite's
<code>sqlite3BtreeEnter</code> on the <code>BtShared</code> mutex;
verified empirically with a lock-free in-flight probe (max-in-flight = 1
on the canonical two-connection workload, 4 on a positive control with
goroutines hitting the cache directly). However the Go race detector
does not recognise SQLite's libc mutex as a happens-before edge and
reports false-positive races on <code>Fetch</code> vs <code>Unpin</code>
reads/writes of the per-cache state, which surfaces as <code>DATA
RACE</code> failures for any user who registers the pool and runs their
suite under <code>-race</code>. A <code>sync.Mutex</code> on the
<code>cache</code> type is now taken on every public method
(<code>SetSize</code>, <code>PageCount</code>, <code>Fetch</code>,
<code>Unpin</code>, <code>Rekey</code>, <code>Truncate</code>,
<code>Destroy</code>, <code>Shrink</code>), always. On the common
non-shared-cache path the lock is uncontended (one atomic CAS per
Lock/Unlock pair, negligible next to the SQLite work it bookends); on
the shared-cache path it just rubber-stamps the order SQLite's
<code>BtShared</code> mutex already established. A new
<code>e2e_test.go</code> <code>TestSharedCacheTwoConns_Integrity</code>
drives two <code>sql.Conn</code> against the same
<code>cache=shared</code> URI with concurrent writers and asserts
<code>PRAGMA integrity_check = ok</code> under <code>-race</code>;
passes cleanly with the lock, would surface the false-positive without
it. Design notes live in <code>pcache/sharing.go</code>.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/131">#131</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/131">https://gitlab.com/cznic/sqlite/-/merge_requests/131</a>),
thanks Ian Chechin!</li>
<li>Add a Go wrapper for <code>sqlite3_db_status</code>, the
per-connection runtime counters (cache hit/miss/write/spill rates,
schema and prepared-statement memory, lookaside usage, deferred foreign
keys). <code>DBStatus</code> is an interface implemented by the driver
connection and reached through the <code>database/sql</code> escape
hatch <code>(*sql.Conn).Raw()</code>, mirroring the existing
<code>FileControl</code> surface; <code>DBStatusOp</code> is a distinct
typed enum of the <code>SQLITE_DBSTATUS_*</code> verbs so a counter from
a different op family will not compile in its place. <code>Status(op,
reset)</code> returns the <code>(current, high)</code> pair and
optionally resets the counter. This also lets
<code>modernc.org/sqlite/pcache</code> measure real I/O instead of the
<code>EasyRefusals</code> proxy: the new
<code>BenchmarkPoolSpillIO</code> reads the pager-level
<code>SQLITE_DBSTATUS_CACHE_SPILL</code>/<code>_CACHE_WRITE</code>
counters, which the pager maintains identically for pcache1 and the
pool, making the pcache1-vs-pool comparison cznic raised on the !127
review a genuine apples-to-apples measurement. On the rotating-residue
eviction-churn workload at <code>cache_size=16</code> the pool spills
~3.5x more than pcache1 (cache-spill/op 31.96 vs 8.96) for ~3% more page
writes (cache-write/op 450 vs 436) at identical hit/miss, quantifying
the I/O cost of the strict Easy contract that <code>EasyRefusals</code>
only proxied.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/132">#132</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/132">https://gitlab.com/cznic/sqlite/-/merge_requests/132</a>),
thanks Ian Chechin!</li>
<li>Add an opt-in <code>_dqs</code> DSN query parameter that disables
SQLite's double-quoted string literal compatibility quirk on a
per-connection basis. When <code>_dqs=0</code> (or any
<code>strconv.ParseBool</code> false value) is supplied, the driver
calls <code>sqlite3_db_config</code> with
<code>SQLITE_DBCONFIG_DQS_DDL</code> and
<code>SQLITE_DBCONFIG_DQS_DML</code> set to off before any statement is
prepared, so a double-quoted identifier that fails to resolve raises a
parse error instead of silently falling back to a string literal.
Absence of the parameter, or <code>_dqs=1</code>, leaves SQLite's
default behavior unchanged; existing DSNs continue to work
byte-for-byte. Resolves [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/61">#61</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/61">https://gitlab.com/cznic/sqlite/-/issues/61</a>).</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/128">#128</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/128">https://gitlab.com/cznic/sqlite/-/merge_requests/128</a>),
thanks Ian Chechin!</li>
<li>Add an opt-in <code>_error_rc</code> DSN query parameter for clearer
error reporting on open-time failures. When <code>_error_rc=1</code> (or
any <code>strconv.ParseBool</code> true value) is supplied, error
strings synthesised from a <code>(rc, db)</code> pair only append
<code>sqlite3_errmsg(db)</code> when
<code>sqlite3_extended_errcode(db)</code> is consistent with the
operation rc (full match first, primary code <code>&0xff</code> as
fallback). On mismatch the canonical <code>sqlite3_errstr(rc)</code> is
used alone, so an open-time <code>SQLITE_CANTOPEN</code> no longer
carries the temporary handle's stale "out of memory" errmsg.
Absence of the parameter, or <code>_error_rc=0</code>, preserves the
legacy "errstr: errmsg" form byte-for-byte; existing callers
that parse error strings are unaffected. The driver's
<code>*Error.Code()</code> returns the same SQLite result code in both
modes. Parsed before <code>sqlite3_open_v2</code> so open-time errors
are covered. Resolves [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/230">#230</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/230">https://gitlab.com/cznic/sqlite/-/issues/230</a>).</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/129">#129</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/129">https://gitlab.com/cznic/sqlite/-/merge_requests/129</a>),
thanks Ian Chechin!</li>
</ul>
</li>
<li>
<p>2026-06-06 v1.52.0:</p>
<ul>
<li>Upgrade to <a
href="https://sqlite.org/releaselog/3_53_2.html">SQLite 3.53.2</a>.</li>
<li>Add <code>Backup.Remaining</code> and <code>Backup.PageCount</code>,
thin wrappers around the existing <code>sqlite3_backup_remaining</code>
and <code>sqlite3_backup_pagecount</code> C symbols. Together they
expose the per-<code>Step</code> progress counters that the underlying
backup object already maintains, enabling progress reporting during
online backups without dropping to <code>modernc.org/sqlite/lib</code>
directly.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/122">#122</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/122">https://gitlab.com/cznic/sqlite/-/merge_requests/122</a>),
thanks Ian Chechin!</li>
<li>Drop the redundant second copy in <code>(*conn).columnText</code>,
the path that backs every <code>Rows.Scan</code> into a Go
<code>string</code> for a TEXT column. The value's bytes are still
copied once out of SQLite-owned memory into a fresh Go buffer; that
buffer is then reinterpreted as the result string with
<code>unsafe.String</code> rather than copied a second time by the
implicit <code>string([]byte)</code> conversion. This removes one
allocation per TEXT value per row and roughly halves the bytes allocated
on that path; on the new <code>BenchmarkColumnTextScan</code> cases it
is ~13–20% faster for payloads of 256 B and larger, with no measurable
change for very short strings. Purely internal: no API or behavioral
change, and the returned string never aliases SQLite's buffer.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/123">#123</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/123">https://gitlab.com/cznic/sqlite/-/merge_requests/123</a>),
thanks Ian Chechin!</li>
<li>Cache each result column's declared type once per result set in
<code>newRows</code> instead of recomputing it on every row. The TEXT
branch of <code>Rows.Next</code> calls
<code>ColumnTypeDatabaseTypeName</code> for every TEXT column on every
row (independent of any DSN flag), which previously did a
<code>libc.GoString</code> + <code>strings.ToUpper</code> each time;
that lookup is now a single index into a cached, pre-uppercased
<code>[]string</code>, and <code>ColumnTypeScanType</code> reads the
same cache and drops its per-call <code>strings.ToLower</code>. The
declared type is fixed for the lifetime of a prepared statement, so the
C round-trip is paid once per column rather than once per column per
row, removing exactly 1 alloc + 8 B per TEXT column per row from the
<code>Next</code> hot path. The new <code>BenchmarkTextToTimeScan</code>
cases show ~7% faster on a 1000-row DATETIME SELECT under
<code>_texttotime=1</code>. Purely internal:
<code>ColumnTypeDatabaseTypeName</code> and
<code>ColumnTypeScanType</code> return identical values, no API or
behavioral change.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/124">#124</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/124">https://gitlab.com/cznic/sqlite/-/merge_requests/124</a>),
thanks Ian Chechin!</li>
<li>Cache, per result column, the <code>parseTimeFormats</code> index
that first parsed a TEXT-stored DATE/DATETIME/TIMESTAMP value, and try
that format first on later rows instead of re-walking the list from the
top. <code>(*conn).parseTime</code> previously ran
<code>time.Parse</code> down the format list on every such row; for the
canonical SQLite TEXT datetime format every row paid two failed
<code>time.Parse</code> attempts — each allocating a
<code>*time.ParseError</code> — before the match. On a 1000-row DATETIME
TEXT SELECT this cuts ~50% of allocs/op and ~57% of B/op and is ~37%
faster. The fall-through chain is preserved exactly: the seven formats
are mutually exclusive, so the cached hint can never select a different
match than the in-order scan, and the parsed <code>driver.Value</code>
is identical to before. Purely internal: no API or behavioral
change.</li>
<li>See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/125">#125</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/125">https://gitlab.com/cznic/sqlite/-/merge_requests/125</a>),
thanks Ian Chechin!</li>
</ul>
</li>
<li>
<p>2026-05-28 v1.51.0:</p>
<ul>
<li>Pool the <code>[]driver.Value</code> slice passed to
scalar/aggregate UDF callbacks and to vtab
<code>Filter</code>/<code>Insert</code>/<code>Update</code> callbacks,
eliminating the dominant per-row allocation on UDF-heavy queries.
Benchmarks on a 1000-row, 3-arg noop scalar UDF show ~40% fewer bytes/op
and ~15% fewer allocs/op.</li>
<li>Document the matching "arguments are not valid past
return" contract on <code>vtab.Cursor.Filter</code> and
<code>vtab.Updater.Insert</code>/<code>Update</code>, consistent with
the existing rule for <code>FunctionImpl.Scalar</code> /
<code>AggregateFunction.Step</code> / <code>WindowInverse</code>.</li>
<li>Resolves [GitLab issue <a
href="https://gitlab.com/cznic/sqlite/issues/226">#226</a>](<a
href="https://gitlab.com/cznic/sqlite/-/issues/226">https://gitlab.com/cznic/sqlite/-/issues/226</a>).
See [GitLab merge request <a
href="https://gitlab.com/cznic/sqlite/issues/114">#114</a>](<a
href="https://gitlab.com/cznic/sqlite/-/merge_requests/114">https://gitlab.com/cznic/sqlite/-/merge_requests/114</a>),
thanks Ian Chechin!</li>
<li>Add <code>FileControl.FileControlDataVersion</code>, a wrapper
around <code>SQLITE_FCNTL_DATA_VERSION</code> for observing pager-cache
data-version changes, including those made on the same connection.
Useful as a primitive for application-level cache invalidation.</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://gitlab.com/cznic/sqlite/commit/693ff386c68d2964fe40d2f3c0b6cd06630660c4"><code>693ff38</code></a>
upgrade to SQLite 3.53.3</li>
<li><a
href="https://gitlab.com/cznic/sqlite/commit/5d243466fa05e8c49a870ead00b79bd4a423f712"><code>5d24346</code></a>
Merge branch 'texttotime-aggregates' into 'master'</li>
<li><a
href="https://gitlab.com/cznic/sqlite/commit/892d8477d4fc7e4e699437936393e5bc20fea071"><code>892d847</code></a>
sqlite: document _texttotime empty-decltype upgrade, widen <a
href="https://gitlab.com/cznic/sqlite/issues/248">#248</a> comment, add
...</li>
<li><a
href="https://gitlab.com/cznic/sqlite/commit/f2c8758475043b7d5be68e9159121718f2ef49e1"><code>f2c8758</code></a>
sqlite: _texttotime best-effort parse for empty-decltype TEXT columns
(<a href="https://gitlab.com/cznic/sqlite/issues/248">#248</a>)</li>
<li>See full diff in <a
href="https://gitlab.com/cznic/sqlite/compare/v1.53.0...v1.54.0">compare
view</a></li>
</ul>
</details>
<br />
<details>
<summary>Most Recent Ignore Conditions Applied to This Pull
Request</summary>
| Dependency Name | Ignore Conditions |
| --- | --- |
| modernc.org/sqlite | [>= 1.34.a, < 1.35] |
</details>
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot]
<49699333+dependabot[bot]@users.noreply.github.com>
---
go.mod | 16 ++++++++--------
go.sum | 44 ++++++++++++++++++++++----------------------
2 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/go.mod b/go.mod
index 5560885e..788a8da9 100644
--- a/go.mod
+++ b/go.mod
@@ -50,7 +50,7 @@ require (
gonum.org/v1/gonum v0.17.0
google.golang.org/grpc v1.82.0
google.golang.org/protobuf v1.36.11
- modernc.org/sqlite v1.53.0
+ modernc.org/sqlite v1.54.0
)
require (
@@ -88,15 +88,15 @@ require (
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
- golang.org/x/mod v0.36.0 // indirect
- golang.org/x/net v0.55.0 // indirect
- golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect
- golang.org/x/term v0.43.0 // indirect
- golang.org/x/text v0.37.0 // indirect
- golang.org/x/tools v0.45.0 // indirect
+ golang.org/x/mod v0.37.0 // indirect
+ golang.org/x/net v0.56.0 // indirect
+ golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57 // indirect
+ golang.org/x/term v0.44.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
+ golang.org/x/tools v0.47.0 // indirect
google.golang.org/genproto/googleapis/rpc
v0.0.0-20260414002931-afd174a4e478 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- modernc.org/libc v1.73.4 // indirect
+ modernc.org/libc v1.74.1 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
)
diff --git a/go.sum b/go.sum
index b26558b0..57e4600a 100644
--- a/go.sum
+++ b/go.sum
@@ -192,14 +192,14 @@ golang.org/x/exp v0.0.0-20260112195511-716be5621a96
h1:Z/6YuSHTLOHfNFdb8zVZomZr7
golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod
h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
-golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
+golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=
+golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
-golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
+golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
+golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -219,28 +219,28 @@ golang.org/x/sys v0.5.0/go.mod
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
-golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6
h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE=
-golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod
h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE=
+golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57
h1:nwGZBCt+FnXUrGsj5vjzAsEmkcaFvd82BbOjECiFYZc=
+golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57/go.mod
h1:3AWMyWHS+caVoiEXpiq6+tzKA40J4vQT3MYr80ZtQpc=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
-golang.org/x/term v0.43.0/go.mod
h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod
h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod
h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod
h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
-golang.org/x/tools v0.45.0/go.mod
h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
+golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
+golang.org/x/tools v0.47.0/go.mod
h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod
h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
@@ -260,20 +260,20 @@ gopkg.in/yaml.v3
v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-modernc.org/cc/v4 v4.28.4 h1:Hd/4Es+MBj+/7hSdZaisNyu6bv3V0Dp2MdllyfqaH+c=
-modernc.org/cc/v4 v4.28.4/go.mod
h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI=
-modernc.org/ccgo/v4 v4.34.4 h1:OVnSOWQjVKOYkFxoHYB+qQmSHK5gqMqARM+K9DpR/Ws=
-modernc.org/ccgo/v4 v4.34.4/go.mod
h1:qdKqE8FNIYyysougB1RX9MxCzp5oJOcQXSobANJ4TuE=
+modernc.org/cc/v4 v4.29.0 h1:CXgwL8cvxmyzBQZzbSl/6xFtMCryb6u8IOqDci39cgc=
+modernc.org/cc/v4 v4.29.0/go.mod
h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI=
+modernc.org/ccgo/v4 v4.34.6 h1:sBgfIwyN0TQ9C5hwIeuqyeAKyMWnbvj2fvpF4L11uzU=
+modernc.org/ccgo/v4 v4.34.6/go.mod
h1:SZ8YcN9NG7XVsQYdm6jYBvi8PQP1qi+kqB6OhjqI3Fk=
modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM=
modernc.org/fileutil v1.4.0/go.mod
h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
-modernc.org/gc/v3 v3.1.3 h1:6QAplYyVO+KdPW3pGnqmJDUxtkec8ooEWvks/hhU3lc=
-modernc.org/gc/v3 v3.1.3/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
+modernc.org/gc/v3 v3.1.4 h1:2g65LGVSmFQrXeITAw97x7hCRvZFcyE1uDP+7Vng7JI=
+modernc.org/gc/v3 v3.1.4/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod
h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
-modernc.org/libc v1.73.4 h1:+ra4Ui8ngyt8HDcO1FTDPWlkAh6yOdaO2yAoh8MddQA=
-modernc.org/libc v1.73.4/go.mod h1:DXZ3eO8qMCNn2SnmTNCiC71nJ9Rcq3PsnpU6Vc4rWK8=
+modernc.org/libc v1.74.1 h1:bdR4VTKFMC4966QSNZ05XLGI/VwzVa2kTUX51Dm0riQ=
+modernc.org/libc v1.74.1/go.mod h1:uH4t5bOx3G3g9Xcmj10YKlTcVISlRDwv8VoQJG9n8Os=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod
h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -282,8 +282,8 @@ modernc.org/opt v0.2.0
h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg=
modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod
h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
-modernc.org/sqlite v1.53.0 h1:20WG8N9q4ji/dEqGk4uiI0c6OPjSeLTNYGFCc3+7c1M=
-modernc.org/sqlite v1.53.0/go.mod
h1:xoEpOIpGrgT48H5iiyt/YXPCZPEzlfmfFwtk8Lklw8s=
+modernc.org/sqlite v1.54.0 h1:JCxR4qwkJvOaqAoYcgDoO25Nc+ROg6EJ2LfBVzdrgog=
+modernc.org/sqlite v1.54.0/go.mod
h1:4ntCLuNmnH8+GNqjka1wNg7KJd5/Hi5FYp8K+XQ7GZw=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod
h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=