Skip to content
This repository was archived by the owner on Sep 8, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,24 @@
# FTWDB
# FTWDB — archived energy-storage test lab

**Archived on 8 September 2026.** This repository preserves the experimental
engine, fault tests, sanitized workloads and database comparison results. It
has no active release or support programme.

FTW now embeds DuckDB in Core for history and keeps SQLite for configuration.
FTWDB is no longer part of the FTW runtime. New storage work belongs in
[FTW Core](https://github.com/srcfl/ftw/tree/master/go/internal/state).

Start with the [archive record and lessons](docs/test-lab.md), the
[engine comparison](docs/results/2026-09-07-engine-evaluation.md), and the
[archived benchmark runners and raw measurements](bench/engine-evaluation-2026-09-07/README.md).
The final local work is preserved on
[`archive/final-lab-snapshot-2026-09-08`](https://github.com/srcfl/ftwdb/tree/archive/final-lab-snapshot-2026-09-08).
That snapshot is separate from the newer fixes already on `main`.

## Historical engine and lab commands

The material below describes the experiment at archive time. Commands are for
isolated research on copies of data, not a supported installation path.

**Forecasts, Telemetry & Watts.**

Expand All @@ -7,7 +27,7 @@ small Rust engine that is fast on time-window aggregates, survives abrupt power
loss, and minimizes write amplification on SD cards and other constrained edge
storage.

The current release is **v0.1.0-alpha.1**. It is an evaluation build for Unix
The last published release is **v0.1.0-alpha.1**. It is an evaluation build for Unix
systems, not a production release. Download release archives from
[GitHub Releases](https://github.com/srcfl/ftwdb/releases), or install the CLI
from its immutable tag:
Expand Down
4 changes: 4 additions & 0 deletions bench/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Competitor harness

This is a frozen test lab. See the [archive record](../docs/test-lab.md) and
the later [September engine evaluation](engine-evaluation-2026-09-07/README.md).
The registry below describes the earlier harness and its subset coverage.

`compose.yml` pins each server image by digest. Profiles keep heavyweight
engines from accidentally running together on a developer laptop.

Expand Down
27 changes: 27 additions & 0 deletions bench/engine-evaluation-2026-09-07/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Archived engine evaluation

Historical runs from 7 September 2026. Read the [report](../../docs/results/2026-09-07-engine-evaluation.md) for methods, results and limits, and the [archive record](../../docs/test-lab.md) for the later DuckDB/Core decision.

`results/` retains the raw submission and query timing samples, validation, settings and failures. Main SQL results use three fresh runs per engine, with `binary-clickhouse-*` for ClickHouse. `parquet-*` compares the same Parquet file. `bounded-*`, `semantics-*` and `restore.json` cover separate scopes. `smoke*` and `precise-*` include setup or rejected transfer paths and must not enter the main ranking.

The archive removes workstation paths, detailed process/cgroup dumps and volume file listings. It retains recorded memory peaks and footprint totals. Timing and validation values are unchanged. `provenance.json` records original and archived SHA-256 values and each transformation. No private site export, running database, credential or backup is included. The sanitized input fixture was already public in this repository.

`harness/` preserves the original Go/Python adapters and runner, with one path change: `FTWDB_EVAL_FIXTURE` or the checked-in fixture replaces a workstation path. The old report generator is omitted because it would recreate a superseded product recommendation. The archived runners were syntax-checked during preservation; the database workloads were not rerun.

## Reading the evidence

- `results/fixture.json`: input identity and counts.
- `results/environment.json`: original platform, versions and artifact hashes. Hashes for binaries and the generated Parquet file refer to original run artifacts, which are not shipped here.
- `results/summary.json`: medians from the successful comparison paths.
- `results/main-*`, `results/binary-*`: repeated full-day imports and queries.
- `results/parquet-*`: first and warm query times over one identical file.
- `results/semantics-*`: one process kill and duplicate-identity probes per configuration.
- `results/restore.json`: offline restore to fresh volumes.

## Reusing the runners

Work in a scratch copy so the historical results stay unchanged. The runners create Docker containers, an internal network and named volumes with the `ftwdb-eval-` prefix. They expect Linux ARM64 tools, a Go-built `bin/sqlite-http`, DuckDB 1.5.5 in `bin/python-site`, the image digests in `harness/run.py`, and `results/`, `logs/`, `snapshots/` directories under the evaluation root. Set `FTWDB_EVAL_FIXTURE` to the absolute path of `bench/fixtures/ftw-real-v1/points.csv.gz` when moving the runner.

The Go adapter uses the pinned dependencies in `harness/go.mod` and `go.sum`. `run.py` accepts engine, repeat, memory, row-limit and prefix arguments; inspect `--help` before running. RowBinary uses `FTWDB_EVAL_CH_BINARY=1`. `parquet_probe.py` expects the Go-generated `snapshots/day.parquet` from a preceding SQLite run. Archive/restore probes expect the earlier stopped test volumes. They are not self-contained benchmarks without this setup.

Keep first-run and warm timings separate, verify every result, record new hardware and versions, and use fresh prefixes and volumes. Stopping a run retains its volumes; deletion is a separate operator action. A fork that revives this lab needs to validate its own dependencies and execution environment.
28 changes: 28 additions & 0 deletions bench/engine-evaluation-2026-09-07/harness/archive_stores.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""Archive only the evaluation's own stopped stores and record their size."""
import json, pathlib,subprocess
from run import ROOT,IMAGES,docker

SELECTION={'sqlite-full':'main-sqlite-full-r3','sqlite-normal':'main-sqlite-normal-r3','duckdb':'main-duckdb-r3','vm':'main-vm-r3','influx':'main-influx-r3','clickhouse':'binary-clickhouse-r3'}

def main():
args=['run','--rm','--network','none','--cpus','1','--memory','128m','--mount',f'type=bind,source={ROOT},target=/eval']
for kind,tag in SELECTION.items():
r=json.loads((ROOT/'results'/(tag+'.json')).read_text());assert r['ok']
state=json.loads(docker('inspect','ftwdb-eval-'+tag))[0]['State'];assert not state['Running']
args+=['--mount',f"type=volume,source={r['volume']},target=/vols/{kind},readonly"]
code='''
import pathlib,json,tarfile,hashlib
out={}
for root in pathlib.Path('/vols').iterdir():
files=[p for p in root.rglob('*') if p.is_file()]
entries=[{'path':str(p.relative_to(root)),'bytes':p.stat().st_size,'allocated_bytes':p.stat().st_blocks*512} for p in files]
target=pathlib.Path('/eval/snapshots')/('store-'+root.name+'.tar')
with tarfile.open(target,'w') as tar:tar.add(root,arcname='data')
with tarfile.open(target,'r') as tar:assert sum(m.isfile() for m in tar.getmembers())==len(files)
out[root.name]={'logical_bytes':sum(p['bytes'] for p in entries),'allocated_bytes':sum(p['allocated_bytes'] for p in entries),'files':entries,'archive_sha256':hashlib.sha256(target.read_bytes()).hexdigest()}
pathlib.Path('/eval/results/store-footprints.json').write_text(json.dumps(out,indent=2))
print(json.dumps({k:{'bytes':v['logical_bytes'],'files':len(v['files'])} for k,v in out.items()}))
'''
args+=[IMAGES['duckdb'],'python','-c',code];print(docker(*args))

if __name__=='__main__':main()
34 changes: 34 additions & 0 deletions bench/engine-evaluation-2026-09-07/harness/clickhouse.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<clickhouse>
<logger><level>warning</level><console>true</console></logger>
<listen_host>0.0.0.0</listen_host>
<http_port>8080</http_port>
<tcp_port>9000</tcp_port>
<path>/data/</path><tmp_path>/data/tmp/</tmp_path>
<user_files_path>/data/user_files/</user_files_path>
<max_connections>32</max_connections><max_concurrent_queries>4</max_concurrent_queries>
<max_server_memory_usage>402653184</max_server_memory_usage>
<mark_cache_size>16777216</mark_cache_size><uncompressed_cache_size>0</uncompressed_cache_size>
<max_thread_pool_size>128</max_thread_pool_size>
<background_pool_size>2</background_pool_size>
<background_move_pool_size>1</background_move_pool_size>
<background_fetches_pool_size>1</background_fetches_pool_size>
<background_schedule_pool_size>4</background_schedule_pool_size>
<background_buffer_flush_schedule_pool_size>1</background_buffer_flush_schedule_pool_size>
<background_distributed_schedule_pool_size>1</background_distributed_schedule_pool_size>
<background_message_broker_schedule_pool_size>1</background_message_broker_schedule_pool_size>
<profiles><default>
<max_threads>1</max_threads><max_memory_usage>134217728</max_memory_usage>
<max_block_size>8192</max_block_size>
<input_format_parallel_parsing>0</input_format_parallel_parsing>
<precise_float_parsing>1</precise_float_parsing>
<output_format_parallel_formatting>0</output_format_parallel_formatting>
<log_queries>0</log_queries><async_insert>0</async_insert>
</default></profiles>
<users><default><password></password><networks><ip>::/0</ip></networks><profile>default</profile><quota>default</quota></default></users>
<quotas><default><interval><duration>3600</duration><queries>0</queries><errors>0</errors><result_rows>0</result_rows><read_rows>0</read_rows><execution_time>0</execution_time></interval></default></quotas>
<merge_tree>
<number_of_free_entries_in_pool_to_lower_max_size_of_merge>1</number_of_free_entries_in_pool_to_lower_max_size_of_merge>
<number_of_free_entries_in_pool_to_execute_mutation>1</number_of_free_entries_in_pool_to_execute_mutation>
<number_of_free_entries_in_pool_to_execute_optimize_entire_partition>1</number_of_free_entries_in_pool_to_execute_optimize_entire_partition>
</merge_tree>
</clickhouse>
42 changes: 42 additions & 0 deletions bench/engine-evaluation-2026-09-07/harness/duck_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""Isolated HTTP adapter for the pinned embedded DuckDB library."""
import http.server, json, os, pathlib, signal, sys
import duckdb

db=duckdb.connect('/data/eval.duckdb',config={
'threads':'1','memory_limit':'128MiB','temp_directory':'/data/tmp',
'enable_external_access':'true','autoinstall_known_extensions':'false',
'autoload_known_extensions':'false'})
db.execute('CREATE TABLE IF NOT EXISTS samples(driver VARCHAR,metric VARCHAR,ts_ms BIGINT,value DOUBLE,PRIMARY KEY(driver,metric,ts_ms))')
def shutdown(*args):
db.close();sys.exit(0)
signal.signal(signal.SIGTERM,shutdown)

class Handler(http.server.BaseHTTPRequestHandler):
def log_message(self,*args): pass
def do_GET(self): self.handle_request()
def do_POST(self): self.handle_request()
def handle_request(self):
try:
path=self.path.split('?')[0]
if path=='/health': result={'duckdb':duckdb.__version__}
elif path=='/write':
body=self.rfile.read(int(self.headers.get('Content-Length','0')))
pathlib.Path('/data/batch.csv').write_bytes(body)
db.execute('BEGIN')
try:
db.execute("COPY samples FROM '/data/batch.csv' (FORMAT CSV,HEADER false)")
db.execute('COMMIT')
except Exception:
db.execute('ROLLBACK');raise
os.unlink('/data/batch.csv');result={'rows':body.count(b'\n')}
elif path=='/query':
sql=self.rfile.read(int(self.headers.get('Content-Length','0'))).decode()
c=db.execute(sql);cols=[c[0] for c in c.description]
result=[dict(zip(cols,row)) for row in c.fetchall()]
else: raise ValueError('unknown path')
body=json.dumps(result,allow_nan=False).encode();self.send_response(200)
except Exception as e:
body=json.dumps({'error':str(e)}).encode();self.send_response(500)
self.send_header('Content-Length',str(len(body)));self.end_headers();self.wfile.write(body)

http.server.HTTPServer(('0.0.0.0',8080),Handler).serve_forever()
27 changes: 27 additions & 0 deletions bench/engine-evaluation-2026-09-07/harness/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module ftwdb-eval

go 1.26.0

require (
github.com/parquet-go/parquet-go v0.32.0
modernc.org/sqlite v1.56.0
)

require (
github.com/andybalholm/brotli v1.1.1 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/mattn/go-isatty v0.0.24 // indirect
github.com/ncruces/go-strftime v1.0.0 // indirect
github.com/parquet-go/bitpack v1.0.0 // indirect
github.com/parquet-go/jsonlite v1.0.0 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/twpayne/go-geom v1.6.1 // indirect
golang.org/x/sys v0.47.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
modernc.org/libc v1.74.4 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
)
80 changes: 80 additions & 0 deletions bench/engine-evaluation-2026-09-07/harness/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/alecthomas/assert/v2 v2.10.0 h1:jjRCHsj6hBJhkmhznrCzoNpbA3zqy0fYiUcYZP/GkPY=
github.com/alecthomas/assert/v2 v2.10.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3 h1:LMLX+LgTNWpfvCBdFebv6EsYotImrt/Ppc5cXIriCSo=
github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3/go.mod h1:jl5iWTm0/hd5PjEYEOuwAJ57L/CibdZfrqZ5XA5GrCk=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI=
github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A=
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/parquet-go/bitpack v1.0.0 h1:AUqzlKzPPXf2bCdjfj4sTeacrUwsT7NlcYDMUQxPcQA=
github.com/parquet-go/bitpack v1.0.0/go.mod h1:XnVk9TH+O40eOOmvpAVZ7K2ocQFrQwysLMnc6M/8lgs=
github.com/parquet-go/jsonlite v1.0.0 h1:87QNdi56wOfsE5bdgas0vRzHPxfJgzrXGml1zZdd7VU=
github.com/parquet-go/jsonlite v1.0.0/go.mod h1:nDjpkpL4EOtqs6NQugUsi0Rleq9sW/OtC1NnZEnxzF0=
github.com/parquet-go/parquet-go v0.32.0 h1:NWDqTUHfrCS4cJP/Fj2HlxvqsrVedWG3sayMkf+znzM=
github.com/parquet-go/parquet-go v0.32.0/go.mod h1:navtkAYr2LGoJVp141oXPlO/sxLvaOe3la2JEoD8+rg=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/twpayne/go-geom v1.6.1 h1:iLE+Opv0Ihm/ABIcvQFGIiFBXd76oBIar9drAwHFhR4=
github.com/twpayne/go-geom v1.6.1/go.mod h1:Kr+Nly6BswFsKM5sd31YaoWS5PeDDH2NftJTK7Gd028=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
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/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
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-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
modernc.org/cc/v4 v4.29.1 h1:MKgdCV3WykTSPqpVrnxdEDS0HEd2FHpKZDzxzU5LyeI=
modernc.org/cc/v4 v4.29.1/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.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.74.4 h1:fX1Omw4o2/1C2iRkkIsrQTasJQldLhRmuPreXLoWs9k=
modernc.org/libc v1.74.4/go.mod h1:eeQAS9W3sZeKYMFubydxJpII9ybHWshk+7or7bLG9co=
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=
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
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.56.0 h1:/D8e2RfFqoy/Zc6PuC76U28zFwmI/sYx1Kjm4yEn9e0=
modernc.org/sqlite v1.56.0/go.mod h1:yCJ2cmAaIkHQ25oXWrF8H4O1lIfPYPR26yCEDj2P3pQ=
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=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
Loading
Loading