{"_id":"@maple-dev/effect-clickhouse","_rev":"3-2c8e18ae1597e5f30465bebc8835b518","name":"@maple-dev/effect-clickhouse","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@maple-dev/effect-clickhouse","version":"0.1.0","keywords":["clickhouse","effect","query-builder","sql","typescript"],"author":"Makisuo, Inc.","license":"MIT","_id":"@maple-dev/effect-clickhouse@0.1.0","maintainers":[{"name":"makisuo","email":"minetoaster12@gmail.com"}],"homepage":"https://effect-clickhouse.maple.dev","bugs":{"url":"https://github.com/MapleTechLabs/effect-clickhouse/issues"},"bin":{"ch-bench":"dist/benchmark/bin.mjs"},"dist":{"shasum":"ab94a036b8d0dfed6dde07a85239bf427dab58fa","tarball":"https://registry.npmjs.org/@maple-dev/effect-clickhouse/-/effect-clickhouse-0.1.0.tgz","fileCount":52,"integrity":"sha512-4bt+mTCRzrCHGHhRJ5/hwh5W/MbVKeepCk5/o1dd+hjV2tQ+qOO3xwQhnAfVf0nBu/oC+SfryGcF/sheNdU8Aw==","signatures":[{"sig":"MEUCIQCGCeCdmJKPPTEJpzgJazXerKpoaU130PaC5Y1KIvwSYAIgJmvgISHG86rwyQCgQGfmcIZ8lwkXbuLsteEn5VNigHk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":424757},"type":"module","shasum":"ab94a036b8d0dfed6dde07a85239bf427dab58fa","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./sql":{"types":"./dist/sql.d.mts","import":"./dist/sql.mjs"},"./expr":{"types":"./dist/expr.d.mts","import":"./dist/expr.mjs"},"./types":{"types":"./dist/types.d.mts","import":"./dist/types.mjs"},"./benchmark":{"types":"./dist/benchmark/index.d.mts","import":"./dist/benchmark/index.mjs"},"./benchmark/cli":{"types":"./dist/benchmark/cli.d.mts","import":"./dist/benchmark/cli.mjs"},"./benchmark/http":{"types":"./dist/benchmark/http.d.mts","import":"./dist/benchmark/http.mjs"}},"scripts":{"test":"vitest run && node scripts/check-doc-citations.mjs && node scripts/check-exports-documented.mjs && node scripts/check-doc-examples.mjs","build":"tsdown","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json --noEmit","test:package":"bun run build && bun scripts/check-package.ts","test:release":"bun scripts/test-clickhouse.ts --release","prepublishOnly":"bun run test:release","test:clickhouse":"bun run build && bun scripts/test-clickhouse.ts"},"_npmUser":{"name":"makisuo","email":"minetoaster12@gmail.com"},"_integrity":"sha512-4bt+mTCRzrCHGHhRJ5/hwh5W/MbVKeepCk5/o1dd+hjV2tQ+qOO3xwQhnAfVf0nBu/oC+SfryGcF/sheNdU8Aw==","repository":{"url":"git+https://github.com/MapleTechLabs/effect-clickhouse.git","type":"git"},"_npmVersion":"10.8.3","description":"Type-safe ClickHouse queries, result decoding, and reproducible benchmarks for Effect and TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"effect":"4.0.0-rc.112","tsdown":"^0.22.14","vitest":"^4.1.9","typescript":"^7.0.2","@types/node":"^22.10.2","expect-type":"^1.3.0","@effect/vitest":"4.0.0-rc.112","@clickhouse/client":"1.21.0","@effect/platform-bun":"4.0.0-rc.112","@effect/language-service":"^0.87.2"},"peerDependencies":{"effect":">=4.0.0-rc.111 <5"},"patchedDependencies":{"@effect/vitest@4.0.0-rc.112":"patches/@effect%2Fvitest@4.0.0-rc.112.patch"},"_npmOperationalInternal":{"tmp":"tmp/effect-clickhouse_0.1.0_1788905931543_0.017979485949687346","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@maple-dev/effect-clickhouse","version":"0.1.1","keywords":["clickhouse","effect","query-builder","sql","typescript"],"author":"Makisuo, Inc.","license":"MIT","_id":"@maple-dev/effect-clickhouse@0.1.1","maintainers":[{"name":"makisuo","email":"minetoaster12@gmail.com"}],"homepage":"https://effect-clickhouse.maple.dev","bugs":{"url":"https://github.com/MapleTechLabs/effect-clickhouse/issues"},"bin":{"ch-bench":"dist/benchmark/bin.mjs"},"dist":{"shasum":"facaec782aa60ad15019f9273153b13747c8dff2","tarball":"https://registry.npmjs.org/@maple-dev/effect-clickhouse/-/effect-clickhouse-0.1.1.tgz","fileCount":52,"integrity":"sha512-QL8EYSxMn9pKsFwRqN3YwNqEvTQtAPnfCR+T7V7TZJVB4z7AhPs0uasrpcKWpU2jLFu8tQW0KKqHVNaKjbTk7Q==","signatures":[{"sig":"MEUCIC5Owkt7NQD0eSoc1Ex2UUjHiCHjw1Qs4tXTGpzVTFn4AiEA955/dcT4sjBfIADOTIYRoxlf4O7S11qIlZw//nTGiyE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427524},"type":"module","shasum":"facaec782aa60ad15019f9273153b13747c8dff2","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./sql":{"types":"./dist/sql.d.mts","import":"./dist/sql.mjs"},"./expr":{"types":"./dist/expr.d.mts","import":"./dist/expr.mjs"},"./types":{"types":"./dist/types.d.mts","import":"./dist/types.mjs"},"./benchmark":{"types":"./dist/benchmark/index.d.mts","import":"./dist/benchmark/index.mjs"},"./benchmark/cli":{"types":"./dist/benchmark/cli.d.mts","import":"./dist/benchmark/cli.mjs"},"./benchmark/http":{"types":"./dist/benchmark/http.d.mts","import":"./dist/benchmark/http.mjs"}},"scripts":{"test":"vitest run && node scripts/check-doc-citations.mjs && node scripts/check-exports-documented.mjs && node scripts/check-doc-examples.mjs","build":"tsdown","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json --noEmit","test:package":"bun run build && bun scripts/check-package.ts","test:release":"bun scripts/test-clickhouse.ts --release","prepublishOnly":"bun run test:release","test:clickhouse":"bun run build && bun scripts/test-clickhouse.ts"},"_npmUser":{"name":"makisuo","email":"minetoaster12@gmail.com"},"_integrity":"sha512-QL8EYSxMn9pKsFwRqN3YwNqEvTQtAPnfCR+T7V7TZJVB4z7AhPs0uasrpcKWpU2jLFu8tQW0KKqHVNaKjbTk7Q==","repository":{"url":"git+https://github.com/MapleTechLabs/effect-clickhouse.git","type":"git"},"_npmVersion":"10.8.3","description":"Type-safe ClickHouse queries, result decoding, and reproducible benchmarks for Effect and TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"effect":"4.0.0-rc.112","tsdown":"^0.22.14","vitest":"^4.1.9","typescript":"^7.0.2","@types/node":"^22.10.2","expect-type":"^1.3.0","@effect/vitest":"4.0.0-rc.112","@clickhouse/client":"1.21.0","@effect/platform-bun":"4.0.0-rc.112","@effect/language-service":"^0.87.2"},"peerDependencies":{"effect":">=4.0.0-rc.111 <5"},"patchedDependencies":{"@effect/vitest@4.0.0-rc.112":"patches/@effect%2Fvitest@4.0.0-rc.112.patch"},"_npmOperationalInternal":{"tmp":"tmp/effect-clickhouse_0.1.1_1788907964193_0.5353488825942809","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@maple-dev/effect-clickhouse","version":"0.1.2","description":"Type-safe ClickHouse queries, result decoding, and reproducible benchmarks for Effect and TypeScript","keywords":["clickhouse","effect","query-builder","sql","typescript"],"homepage":"https://effect-clickhouse.maple.dev","bugs":{"url":"https://github.com/MapleTechLabs/effect-clickhouse/issues"},"license":"MIT","author":"Makisuo, Inc.","repository":{"type":"git","url":"git+https://github.com/MapleTechLabs/effect-clickhouse.git"},"bin":{"ch-bench":"dist/benchmark/bin.mjs"},"type":"module","sideEffects":false,"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./expr":{"types":"./dist/expr.d.mts","import":"./dist/expr.mjs"},"./types":{"types":"./dist/types.d.mts","import":"./dist/types.mjs"},"./sql":{"types":"./dist/sql.d.mts","import":"./dist/sql.mjs"},"./benchmark":{"types":"./dist/benchmark/index.d.mts","import":"./dist/benchmark/index.mjs"},"./benchmark/http":{"types":"./dist/benchmark/http.d.mts","import":"./dist/benchmark/http.mjs"},"./benchmark/cli":{"types":"./dist/benchmark/cli.d.mts","import":"./dist/benchmark/cli.mjs"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsdown","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json --noEmit","test":"vitest run && node scripts/check-doc-citations.mjs && node scripts/check-exports-documented.mjs && node scripts/check-doc-examples.mjs","prepublishOnly":"bun run test:release","test:clickhouse":"bun run build && bun scripts/test-clickhouse.ts","test:package":"bun run build && bun scripts/check-package.ts","test:release":"bun scripts/test-clickhouse.ts --release"},"devDependencies":{"@clickhouse/client":"1.21.0","@effect/language-service":"^0.87.2","@effect/platform-bun":"4.0.0-rc.112","@effect/sql-clickhouse":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","@types/node":"^22.10.2","effect":"4.0.0-rc.112","expect-type":"^1.3.0","tsdown":"^0.22.14","typescript":"^7.0.2","vitest":"^4.1.9"},"peerDependencies":{"effect":">=4.0.0-rc.111 <5"},"packageManager":"bun@1.4.0","patchedDependencies":{"@effect/vitest@4.0.0-rc.112":"patches/@effect%2Fvitest@4.0.0-rc.112.patch"},"_id":"@maple-dev/effect-clickhouse@0.1.2","_integrity":"sha512-Mp3XkvJu/z46CQ1DaXCYIj1tpVppkpMrglL74IP9orpo/JzIqYYUKO8r/4OiVGtjUYn1fciV98K6+lEM4FM2Lw==","_nodeVersion":"26.3.0","_npmVersion":"10.8.3","shasum":"cfcf8f0528783212a15a6d0e4e30f2f3625db012","dist":{"integrity":"sha512-Mp3XkvJu/z46CQ1DaXCYIj1tpVppkpMrglL74IP9orpo/JzIqYYUKO8r/4OiVGtjUYn1fciV98K6+lEM4FM2Lw==","shasum":"cfcf8f0528783212a15a6d0e4e30f2f3625db012","tarball":"https://registry.npmjs.org/@maple-dev/effect-clickhouse/-/effect-clickhouse-0.1.2.tgz","fileCount":52,"unpackedSize":435004,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDk5zY/YnsM/AkSZOURVq2vvkNhBA6yGubGdFXvkVyBSQIgdlWRwAnKLGgTB3AjdnOyOnw14fAPRmby/xffbp/mTZ8="}]},"_npmUser":{"name":"makisuo","email":"minetoaster12@gmail.com"},"directories":{},"maintainers":[{"name":"makisuo","email":"minetoaster12@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/effect-clickhouse_0.1.2_1788909968330_0.20921302298260813"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-08T22:18:51.423Z","modified":"2026-09-08T23:26:08.720Z","0.1.0":"2026-09-08T22:18:51.705Z","0.1.1":"2026-09-08T22:52:44.334Z","0.1.2":"2026-09-08T23:26:08.504Z"},"bugs":{"url":"https://github.com/MapleTechLabs/effect-clickhouse/issues"},"author":"Makisuo, Inc.","license":"MIT","homepage":"https://effect-clickhouse.maple.dev","keywords":["clickhouse","effect","query-builder","sql","typescript"],"repository":{"type":"git","url":"git+https://github.com/MapleTechLabs/effect-clickhouse.git"},"description":"Type-safe ClickHouse queries, result decoding, and reproducible benchmarks for Effect and TypeScript","maintainers":[{"name":"makisuo","email":"minetoaster12@gmail.com"}],"readme":"# @maple-dev/effect-clickhouse\n\nType-safe ClickHouse queries, result decoding, and reproducible benchmarks for Effect and TypeScript.\n\n[Read the documentation](https://effect-clickhouse.maple.dev) ·\n[Getting started](./docs/getting-started.md) · [Recipes](./docs/recipes.md)\n\n- **Schema-first** — a column type _is_ an Effect `Schema`, so a query compiles\n  to its own row schema. `decodeRows` validates without you writing one, and the\n  wire quirks (64-bit ints arriving quoted, tz-less DateTimes) are modelled once\n  in the types rather than rediscovered per consumer.\n- **Type-safe** — define a table once and the query builder infers column types,\n  output row shapes, and join accessors. No stringly-typed columns.\n- **Immutable & composable** — every builder method returns a new query; share\n  and extend base queries without surprises.\n- **ClickHouse-native** — first-class helpers for the functions you actually use\n  (`quantile`, `toStartOfInterval`, `mapGet`, window functions, …) plus escape\n  hatches (`rawExpr`, `rawCompiledQuery`) for anything not yet modeled.\n- **Parameterised compilation** — compile to a SQL string with named params\n  resolved and string literals escaped. A param with no value, or a value of the\n  wrong kind, fails the compile instead of reaching the server.\n\nBuilt on [Effect](https://effect.website) (peer dependency).\n\n## Install\n\nInstall the package with its Effect 4 peer:\n\n```bash\nbun add @maple-dev/effect-clickhouse \"effect@>=4.0.0-rc.112 <5\"\n```\n\nSee [Getting started](./docs/getting-started.md) for source builds and examples.\n\n`effect` is a peer dependency. The recommended range `>=4.0.0-rc.112 <5` allows\nnewer Effect 4 releases without opting into Effect 5. Effect 3 is incompatible.\nKeep the version range quoted so your shell does not interpret `<` or `>`.\n\n## Quick start\n\n```ts\nimport * as CH from \"@maple-dev/effect-clickhouse\"\nimport * as T from \"@maple-dev/effect-clickhouse/types\"\n\n// 1. Describe a table\nconst Events = CH.table(\n\t\"events\",\n\t{\n\t\tOrgId: T.string,\n\t\tName: T.string,\n\t\tTimestamp: T.dateTime,\n\t\tDurationMs: T.uint64,\n\t\tAttributes: T.map(T.string, T.string),\n\t},\n\t// Optional: name the column carrying row-level tenancy and every compiled\n\t// query reports whether it pinned it. See docs/tenant-scoping.md.\n\t{ tenantColumn: \"OrgId\" },\n)\n\n// 2. Build a query\nconst query = CH.from(Events)\n\t.select(($) => ({\n\t\tname: $.Name,\n\t\tp95: CH.quantile(0.95)($.DurationMs),\n\t\tcount: CH.count(),\n\t}))\n\t.where(($) => [\n\t\t$.OrgId.eq(CH.param.string(\"orgId\")),\n\t\t$.Timestamp.gte(CH.param.dateTime(\"startTime\")),\n\t\tCH.when(true, () => $.Name.like(\"checkout%\")),\n\t])\n\t.groupBy(\"name\")\n\t.orderBy([\"count\", \"desc\"])\n\t.limit(50)\n\n// 3. Compile to SQL (params resolved, literals escaped)\nconst compiled = CH.compileUnsafe(query, {\n\torgId: \"org_123\",\n\tstartTime: \"2026-01-01 00:00:00\",\n})\n\ncompiled.sql // -> SELECT Name AS name, quantile(0.95)(DurationMs) AS p95, ...\n```\n\n## Decoding results\n\nRun the SQL with your own ClickHouse client, then hand the rows back to\n`decodeRows`. The row schema comes from the query itself — every column type is\na `Schema`, so the SELECT already describes its own rows:\n\n```ts\nimport { ClickhouseClient } from \"@effect/sql-clickhouse\"\nimport { Effect } from \"effect\"\n\nconst program = Effect.gen(function* () {\n\tconst client = yield* ClickhouseClient.ClickhouseClient\n\tconst compiled = yield* CH.compile(query, {\n\t\torgId: \"org_123\",\n\t\tstartTime: \"2026-01-01 00:00:00\",\n\t})\n\tcompiled.rowSchemaSource // \"derived\"\n\tconst wire = yield* client.unsafe<Record<string, unknown>>(compiled.sql)\n\treturn yield* compiled.decodeRows(wire)\n\t// -> ReadonlyArray<{ name: string; p95: number | null; count: number }>\n})\n```\n\nProvide Effect's `ClickhouseClient` layer when running `program`; the builder brings no client.\n[Running a query](./docs/running-queries.md) has the complete setup, resource lifetime, and wire settings.\n\n`count()` is a `UInt64`, which ClickHouse's `FORMAT JSON` quotes and a gateway with\n`output_format_json_quote_64bit_integers=0` does not — the\ncolumn type accepts either and decodes both to a JavaScript number.\n\nPass a `rowSchema` explicitly to **narrow** what the builder inferred (a `String`\ncolumn as a literal union, say); it wins over the derived one. If any selected\nexpression has no type to read — an `untypedExpr`, a `defineUntypedFn` —\nnothing is derived, `rowSchemaSource` is `\"none\"`, and `decodeRows` degrades to\na pass-through rather than pretending.\n\nCompilation itself is Effect-returning: a param with no value, or a value the\ncolumn cannot hold, is a `QueryBuilderError` in the error channel rather than a\nthrow, so a route can `catchTag` it instead of crashing. `compileUnsafe` is the\nthrowing variant, for a fixture or a catalog sweep where a query that will not\ncompile should fail loudly. A bug inside a callback stays a defect either way.\n\n`decodeFirstRow` is the point-lookup variant, returning `Option<Output>` so you\ndon't hand-roll `rows[0] ?? null`. Both fail with `CompiledQueryDecodeError`,\nwhich carries the offending `rowIndex`. When a query does derive nothing,\n`untypedColumns` names the selected aliases responsible.\n\n`encodeRows` runs the same schema backwards, turning decoded rows into the wire\nshape ClickHouse sent. That is what lets a service hold the good value in memory\nand still emit the bytes its own clients parse: a `DateTime` column decoded to a\n`DateTime.Utc` re-encodes to `'YYYY-MM-DD hh:mm:ss'`, not to ISO-8601, because\nthe column's codec is the authority on both directions.\n\n## Documentation\n\nFull guides live in [`docs/`](./docs/README.md):\n\n| Guide                                                      | What it covers                                                  |\n| ---------------------------------------------------------- | --------------------------------------------------------------- |\n| [Getting started](./docs/getting-started.md)               | Install, define a table, build → compile → decode               |\n| [Tables and column types](./docs/tables-and-types.md)      | `table()`, column-type constructors, `Map`/`Array`/`Nullable`   |\n| [Building queries](./docs/queries.md)                      | `select`, `where`, `groupBy`, `orderBy`, `limit`, immutability  |\n| [Expressions and conditions](./docs/expressions.md)        | Comparisons, arithmetic, optional predicates, aggregates        |\n| [Joins and subqueries](./docs/joins-and-subqueries.md)     | The join family, `fromQuery`, correlated subqueries             |\n| [Unions and CTEs](./docs/unions-and-ctes.md)               | `unionAll`, `fromUnion`, `withCTE`                              |\n| [Params and compilation](./docs/params-and-compilation.md) | `param.*`, how values reach the SQL, `CompiledQuery`            |\n| [Decoding results](./docs/decoding-results.md)             | `rowSchema`, `decodeRows`, decode errors                        |\n| [Running a query](./docs/running-queries.md)               | Executing the SQL with a real client, wire settings, `SETTINGS` |\n| [Tenant scoping](./docs/tenant-scoping.md)                 | `tenantColumn`, what marks a query scoped, `crossTenant()`      |\n| [Extending the DSL](./docs/extending.md)                   | `defineFn`, raw escape hatches, handwritten SQL                 |\n| [API reference](./docs/reference.md)                       | Full export catalog by module, plus error types                 |\n\nNamed complete examples are extracted and checked by\n[`scripts/check-doc-examples.mjs`](./scripts/check-doc-examples.mjs). Focused query and decoding\nregressions live in [`src/docs-examples.test.ts`](./src/docs-examples.test.ts).\n\n## Entry points\n\n| Import                               | Contents                                                                                                                                                                                        |\n| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `@maple-dev/effect-clickhouse`       | Curated public API: `from`, `compile`, `param`, expression helpers, and ClickHouse functions under friendly names (`min`, `max`, `count`, `quantile`, …).                                       |\n| `@maple-dev/effect-clickhouse/types` | Column-type constructors (`string`, `uint64`, `dateTime`, `map`, `array`, `nullable`, …) and the `CH*` type descriptors.                                                                        |\n| `@maple-dev/effect-clickhouse/expr`  | Kitchen-sink namespace: every expression helper plus all ClickHouse functions under their raw names (`min_`, `toString_`, `toStartOfInterval`, `dynamicColumn`, …). Handy for `import * as CH`. |\n| `@maple-dev/effect-clickhouse/sql`   | The low-level `SqlFragment` AST (`raw`, `ident`, `compile`, …) for hand-rolling fragments.                                                                                                      |\n\n## Extending with custom functions\n\n```ts\nimport type { DateTime } from \"effect\"\nimport { defineFn, sameAs } from \"@maple-dev/effect-clickhouse\"\n\n// Declare any ClickHouse function not already wrapped. The second argument is\n// the ClickHouse type it returns — required, because that is what lets a query\n// using it still derive its row schema.\nconst toStartOfFiveMinute = defineFn<[CH.Expr<DateTime.Utc>], DateTime.Utc>(\"toStartOfFiveMinute\", T.dateTime)\n\n// When the result type depends on the arguments — `min`, `argMax`, `coalesce`,\n// `arrayJoin` all hand back one of their inputs — pass a rule instead:\n// `sameAs(i)`, `firstTyped()`, `elementOf(i)`, `arrayOfArg(i)`.\nconst anyLast = defineFn<[CH.Expr<string>], string>(\"anyLast\", sameAs(0))\n```\n\n## Validation\n\n`bun run test` also extracts the named complete Markdown examples, typechecks them against\nthe public package exports, and runs the offline examples. Set `CLICKHOUSE_DOCS_LIVE=1` to\nrun the client example too, with `CLICKHOUSE_URL`, `CLICKHOUSE_USERNAME`, and\n`CLICKHOUSE_PASSWORD` for its connection. Build the package before running these checks.\n\nRun `bun run build`, `bun run typecheck`, and `bun run test` from this package. Tests include regressions for\nnullable results, UNION column alignment, tenant scoping, custom parameters, and DateTime64 precision.\nTo include the live ClickHouse cases, set `EFFECT_CLICKHOUSE_TEST_URL` and, if needed,\n`EFFECT_CLICKHOUSE_TEST_USER` and `EFFECT_CLICKHOUSE_TEST_PASSWORD`. They use only SELECTs and CTEs.\n\nUse `bun run test:release` before publishing: it requires a live endpoint and checks the\nbuild, types, tests, docs, and an isolated tarball consumer. `prepublishOnly` enforces\nthis check. See [Testing and release checks](./docs/testing.md) for the coverage manifest\nand pinned ClickHouse version matrix.\n\n## License\n\nMIT\n\n## Query benchmarks\n\nThe optional `@maple-dev/effect-clickhouse/benchmark` entry point and bundled\n`ch-bench` CLI measure real queries, compare fixed workloads, and save evidence.\nSee [Benchmarking](docs/benchmarking.md) and the\n[agent playbook](docs/benchmark-agent.md). The root SQL builder remains driver-free.\n","readmeFilename":"README.md"}