Data
Databases, exporters, metrics, data libraries and data servers. 50 posts, newest first.
Posts
One unquoted attribute skips the whole tag: PathConverter and B64 in pymdown-extensions
Raw HTML such as <img src="a.png" width=100> kept its src as written in pymdown-extensions, a Python library of Markdown extensions: PathConverter did not rewrite it…
Config media type used as artifact type: FilterArtifactType in oras-go
A copy that used opts.FilterArtifactType(regexp.MustCompile("sbom")) skipped a referrer whose artifactType was application/vnd.example.sbom.v1, and "empty" copied it.
A group opener consumed as a repeated star: star groups in wcmatch
In wcmatch, a Python glob and fnmatch library, a star directly before an extended star group, as in a(b), was not read as followed by the group (b).
A key lowered on lookup but stored as is: unique glob results in wcmatch
In wcmatch, a Python glob and fnmatch library, glob.glob and glob.iglob returned a path twice when two patterns found it, IGNORECASE was set and the path had an upper…
A year limit inherited from datetime: range matching for week inputs in soupsieve
In soupsieve, the CSS selector library behind Beautiful Soup, :in-range and :out-of-range raised ValueError for a week input with a week-year of 10000 or more.
A cached count that left out one element: :nth-last-child(an+b of S) in soupsieve
In soupsieve, the CSS selector library behind Beautiful Soup, :nth-last-child(an+b of S) returned the wrong elements when the first sibling it checked did not match S.
A Bessel function that overflows before the result: the VonMises log-density in PyMC
In PyMC, a Python library for probabilistic programming, VonMises.logp returned -inf for a large concentration kappa: from about 92 in float32, from about 710 in float64.
A copy that shared the original's hook lists: with_options in Prefect
In Prefect, a Python workflow orchestration library, with_options made a copy of a task or flow that shared a hook list with the original whenever that list already…
Escapes refused or read in halves: quoted strings in OjG
OjG, a Go library for JSON, refused \/ in a quoted name and read an escaped UTF-16 pair as two U+FFFD. RFC 9535 section 2.3.1.1 allows both.
A not that read to the end of the filter: the ! operator in OjG
In OjG, a Go JSON library with JSONPath, ! in a filter took in every && and || term after it: !@.a && @.b meant !(@.a && @.b). (!@.a) && @.b already worked.
A minus sign read as part of the operator: negative numbers in OjG filters
jp.ParseString in OjG, a Go JSON library with JSONPath, rejected a filter with no space between an operator and a negative number, such as $[?@.a==-1].
Anchors that split at an alternation: match() in OjG
In the Go library OjG, a JSONPath match() pattern with a top-level | was not tested against the whole string: ab|cd also matched abx and xcd, though RFC 9535 section…
Bytes counted instead of characters: length() of a string in OjG
length() of a string in OjG, a Go JSON library with JSONPath, returned the number of bytes, so "жж" had a length of 4.
An escaped emoji decoded as two U+FFFD: JSON strings in OjG
The oj, gen and sen parsers in OjG, a Go library, decoded an emoji written as an escaped UTF-16 pair, \ud83d\ude00, as two U+FFFD.
Equal operands that never satisfied <= or >=: filter comparisons in OjG
In OjG, a Go JSON library with JSONPath, <= and >= in a filter never matched two equal null, boolean, array or object values, or two missing values. == did.
An empty pattern that matched nothing: match() and search() in OjG
An empty pattern, '', made match() and search() select nothing in OjG, a Go library for JSON.
A dot that matched a carriage return: match() and search() in OjG
match(@, '.') and search(@, '.') selected a string that was one carriage return in OjG, a Go JSON library.
A tab, line feed or carriage return refused as blank space: JSONPath queries in OjG
A JSONPath filter written over two lines did not parse in OjG, a Go library for JSON.
Blank space refused before a segment and in a slice: JSONPath parsing in OjG
$ .a and $[1:5 :2] were parse errors in OjG, a Go library for JSON, though RFC 9535 allows blank space before a path segment and between the parts of a slice.
A support lost in a pytree round trip: Levy in NumPyro
NumPyro, a probabilistic programming library on JAX, lets a distribution cross a jit boundary as a pytree. The Levy distribution came out the other side with no support.
A second stored copy of the bounds: the interval supports in NumPyro
Uniform, LogUniform and DiscreteUniform in NumPyro stored their bounds twice: as low and high, and again inside a cached support.
Strings and numbers rejected as sources: TypedArray.from in goja
Uint8Array.from("123") threw in goja, a JavaScript engine in Go: TypeError: Value is not an object: 123. Node returns Uint8Array(3) [ 1, 2, 3 ].
A method that never read exec: RegExp.prototype.test in goja
RegExp.prototype.test in goja, a JavaScript engine in Go, never read exec. A plain object with exec threw, and a replaced exec was ignored.
A nil exec was called: generic RegExp replace and split in goja
An empty object as this made RegExp.prototype[Symbol.replace] panic with a nil pointer in goja, a JavaScript engine in Go.
An undefined exec threw: RegExp match, search and global replace in goja
Setting exec to undefined on a regexp made match, search and a global replace throw in goja, a JavaScript engine in Go.
A length nothing checked: Array.from on array-likes in goja
In goja, a JavaScript engine in Go, Array.from({length: 232}) did not return in any practical time. Node throws RangeError: Invalid array length.
Run start reported as run end: LastRunStartedAt in gocron
With WithIntervalFromCompletion(), Job.LastRunStartedAt() returned the time the last run ended. gocron is a job scheduler for Go.
A one-value filter failed: VALUE_IN on list requests in Flyte
A Flyte ListActions request with a VALUE_IN filter and one value failed with an internal error. With two values it returned rows. Flyte orchestrates ML pipelines.
A count zeroed by a nested call: inverse extended globs in wcmatch
!(a)@(b|(c)) raised re.error in wcmatch, a Python library for wildcard and glob matching, although Bash accepts it.
User and guest counts passed twice: USG mobile and handheld in unpoller
A USG exported its user count as mobile and its guest count as handheld in unpoller_device_stations. I fixed it in PR #1114, merged within two hours of opening it.
One label dict for every table: positional factor labels in tox
In tox, a Python tool that runs test environments, a project with two env_base tables using positional factor labels got empty labels for every table but the last.
An allof loop where anyof is the default: CardDAV prop-filter in Radicale
A CardDAV addressbook-query with two conditions in one prop-filter returned only the cards that matched both. RFC 6352 says a prop-filter is anyof unless it says allof.
A group that dropped the existence check: parenthesized paths in OjG
In OjG, a Go JSON library with JSONPath, a bare @.x in a filter tests that x exists, but (@.x) beside &&, || or ! did not.
Go's == where value equality belongs: the in filter in OjG
The in filter in OjG, a Go JSON library with JSONPath, panicked when its left operand was an array or object and the list held a member of the same kind.
An assignment to no name: extract_function in Jedi
Script.extract_function in Jedi, a Python library for editor autocompletion and refactoring, wrote code that does not parse when the extracted lines define no name.
Truncation where jq rounds down: slice start index in gojq
In gojq, a pure Go implementation of jq, a slice with a negative fractional start such as .[-1.5:] returned a different result than jq.
A hold count raised before the path was resolved: acquire in filelock
FileLock.acquire() in filelock, a Python library for file locks, raised FileNotFoundError when the working directory was gone.
A template that quoted without escaping: JSON tag export in ezdxf
export_json_tags() in ezdxf, a Python library for DXF drawing files, wrote JSON that json.loads rejected, or read back as a different string, when a string value held a…
An assignment that erased a flag: map keys-sorted in arrow-schema FFI export
Exporting a Field of DataType::Map(, true) through arrow-schema's C Data Interface dropped the keys-sorted flag, so it came back as Map(, false). I fixed it in PR #11630.
Label names declared in the wrong order: temperature and storage in unpoller
unpoller_device_temperature_celsius and unpoller_device_storage put the tag and the sensor or disk values under the wrong label names, and lost series too.
Label names declared in the wrong order: station counts in unpoller
unpoller_device_stations put the device tag in station_type and the station type in tag, and lost series too.
An empty case in a Go switch: scrape mode changes on reload in sql_exporter
A reload that switched sql_exporter from one target to jobs returned success and kept the old target.
One condition did two jobs: overlapping collector globs in sql_exporter
The README's own collectors example stopped sql_exporter at startup. I fixed the resolver in PR #1117, merged 2026-10-17, 8 minutes and 4 seconds after I opened it.
The cache stored errors like results: min_interval in sql_exporter
With min_interval set, one failed query in sql_exporter kept returning the same error until the interval ended.
One number broke a string map: JSON secrets in sql_exporter
A database secret from AWS made sql_exporter use the whole JSON text as its connection string.
Request input stored on a shared exporter: job filters in sql_exporter
Two scrapes of sql_exporter could ask for different jobs and receive each other's metrics.
Config stored before the build: a failed reload in sql_exporter
After a failed reload, sql_exporter showed a config it was not running. I fixed it in PR #1120, merged within ten minutes of opening it.
A collect() that cannot return an error: a key overflow panic in arrow-csv
An arrow-csv reader panicked when a Dictionary(Int8, Utf8) column had 129 distinct values in one batch.
TrimPrefix is not TrimLeft: a false warning on every scrape error in sql_exporter
In single target mode, sql_exporter warned about its own log context on every scrape error. I fixed it with a one-word change (PR #1115, merged 2026-10-16 as 72c7582).
One local variable, one reference cycle per error reply in redis-py
On 2026-10-15 redis-py merged a small fix I sent: #4434, "Break the ResponseError reference cycle in asyncio read_response".