pipework 0.290.0 → 0.292.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/REFERENCE.md +81 -1
- package/dist/auth/tenant/scoped-db.d.ts +9 -0
- package/dist/auth/tenant/scoped-db.d.ts.map +1 -1
- package/dist/auth/tenant/scoped-db.js +14 -0
- package/dist/auth/tenant/scoped-db.js.map +1 -1
- package/dist/data/db/function-definition.d.ts +46 -0
- package/dist/data/db/function-definition.d.ts.map +1 -0
- package/dist/data/db/function-definition.js +84 -0
- package/dist/data/db/function-definition.js.map +1 -0
- package/dist/data/db/function-source.d.ts +33 -2
- package/dist/data/db/function-source.d.ts.map +1 -1
- package/dist/data/db/function-source.js +47 -19
- package/dist/data/db/function-source.js.map +1 -1
- package/dist/data/db/namespace.d.ts +5 -3
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/namespace.js +5 -3
- package/dist/data/db/namespace.js.map +1 -1
- package/dist/data/db/rows.d.ts +1 -0
- package/dist/data/db/rows.d.ts.map +1 -1
- package/dist/data/db/rows.js +1 -1
- package/dist/data/db/rows.js.map +1 -1
- package/dist/data/migrate/diff.d.ts +7 -0
- package/dist/data/migrate/diff.d.ts.map +1 -1
- package/dist/data/migrate/diff.js +37 -0
- package/dist/data/migrate/diff.js.map +1 -1
- package/dist/data/migrate/history.d.ts +2 -0
- package/dist/data/migrate/history.d.ts.map +1 -1
- package/dist/data/migrate/history.js +8 -0
- package/dist/data/migrate/history.js.map +1 -1
- package/dist/data/migrate/snapshot.d.ts +3 -0
- package/dist/data/migrate/snapshot.d.ts.map +1 -1
- package/dist/data/migrate/snapshot.js +13 -0
- package/dist/data/migrate/snapshot.js.map +1 -1
- package/dist/data/migrate/sql-emit.d.ts.map +1 -1
- package/dist/data/migrate/sql-emit.js +30 -2
- package/dist/data/migrate/sql-emit.js.map +1 -1
- package/dist/data/write/audit/verb-insert.d.ts.map +1 -1
- package/dist/data/write/audit/verb-insert.js +4 -1
- package/dist/data/write/audit/verb-insert.js.map +1 -1
- package/dist/data/write/audit/verb-update.d.ts.map +1 -1
- package/dist/data/write/audit/verb-update.js +14 -3
- package/dist/data/write/audit/verb-update.js.map +1 -1
- package/dist/data/write/batch-insert.d.ts +35 -0
- package/dist/data/write/batch-insert.d.ts.map +1 -0
- package/dist/data/write/batch-insert.js +171 -0
- package/dist/data/write/batch-insert.js.map +1 -0
- package/dist/data/write/execute.d.ts +1 -1
- package/dist/data/write/execute.d.ts.map +1 -1
- package/dist/data/write/execute.js +89 -2
- package/dist/data/write/execute.js.map +1 -1
- package/dist/data/write/index.d.ts +2 -0
- package/dist/data/write/index.d.ts.map +1 -1
- package/dist/data/write/index.js +1 -0
- package/dist/data/write/index.js.map +1 -1
- package/dist/data/write/insert.d.ts +8 -0
- package/dist/data/write/insert.d.ts.map +1 -1
- package/dist/data/write/insert.js +14 -0
- package/dist/data/write/insert.js.map +1 -1
- package/dist/data/write/state.d.ts +10 -0
- package/dist/data/write/state.d.ts.map +1 -1
- package/dist/data/write/update-each.d.ts +28 -0
- package/dist/data/write/update-each.d.ts.map +1 -0
- package/dist/data/write/update-each.js +104 -0
- package/dist/data/write/update-each.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/test/function-reads.d.ts +97 -0
- package/dist/test/function-reads.d.ts.map +1 -0
- package/dist/test/function-reads.js +202 -0
- package/dist/test/function-reads.js.map +1 -0
- package/dist/test/index.d.ts +1 -0
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +1 -0
- package/dist/test/index.js.map +1 -1
- package/package.json +2 -2
- package/src/auth/tenant/scoped-db.ts +13 -0
- package/src/data/db/function-definition.ts +172 -0
- package/src/data/db/function-source.ts +86 -14
- package/src/data/db/namespace.ts +5 -3
- package/src/data/db/rows.ts +1 -1
- package/src/data/migrate/diff.ts +45 -0
- package/src/data/migrate/history.ts +9 -0
- package/src/data/migrate/snapshot.ts +17 -0
- package/src/data/migrate/sql-emit.ts +33 -3
- package/src/data/write/audit/verb-insert.ts +4 -1
- package/src/data/write/audit/verb-update.ts +13 -3
- package/src/data/write/batch-insert.ts +179 -0
- package/src/data/write/execute.ts +77 -2
- package/src/data/write/index.ts +2 -0
- package/src/data/write/insert.ts +15 -0
- package/src/data/write/state.ts +6 -0
- package/src/data/write/update-each.ts +120 -0
- package/src/index.ts +2 -1
- package/src/test/function-reads.ts +290 -0
- package/src/test/index.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.292.0
|
|
4
|
+
|
|
5
|
+
- **Added: batched writes, many rows in one statement** (#995, #983 step 4). `pipe.insert(T).batch(rows)` sends every row as one `INSERT ... SELECT FROM unnest(...)`, with one parameter per column. Each cell is encoded exactly as a single-row parameter of that column would be and cast back per cell, so array columns of any dimension, NULLs, column defaults and bigints above 2^53 all work. It composes with `.onConflictDoNothing({ target? })` for insert-or-ignore (`.returning()` yields only the rows inserted, in input order) and with `.returning()`. It runs in the caller's transaction, under the connection's tenant scope and RLS insert policies, and emits the same audit rows as row-by-row writes. `pipe.updateEach(table, { keys, data, where, set })` is one `UPDATE ... FROM unnest(...)` for many keys, returning each key's count in input order. With `expect` it refuses, naming the first key that matched other than exactly one row, and rolls back, audit rows included; duplicate keys are refused before anything is sent. The library splits a batch past 250,000 rows or 256 MiB of parameter text into consecutive statements in one transaction (a savepoint when nested), keeping order, `returning()`, audit rows and the exactly-one check across slices. At 139,000 rows on the test cluster, one insert statement took 2.3 s and 4.3 s under `@touches`. Such a statement logs one `query:large` warning. COPY was ruled out: Postgres refuses `COPY FROM` under row-level security for a role that does not bypass it. The Rust crate `crates/pipework-query` gains `BatchInsert` (`into_inserts`, or `into_insert`, which returns `BatchError::TooLarge` rather than sending an oversize statement) and `UpdateEach` (`statements`, checked with `exactly_one`), with the same limits. The Rust forms emit no audit rows yet (#1019). Bounding TS client memory by row width is #1020.
|
|
6
|
+
|
|
7
|
+
## 0.291.0
|
|
8
|
+
|
|
9
|
+
- **Added: SQL functions as pipework-defined reads** (#979, #983 step 2). A `pipe.fn` given a `body` defines a `LANGUAGE sql` function that pipework creates and migrates: typed `args` (a list is one array argument, used as `= ANY($n)`), `columns` plus a required `rows` estimate for a set, or `returns` for a scalar, and `volatility` (`stable` by default, or `immutable`). The call is typed as before. Migrations emit `CREATE OR REPLACE FUNCTION` for a body, volatility or ROWS change, `DROP` then `CREATE` for a return-shape change, and `DROP FUNCTION` (no CASCADE) on removal; drops run first and creates last. `pipe.fn(...)` refuses, with a `[pipework] pipe.fn("name"):` error naming the fix, anything that stops Postgres inlining the function or makes its cost grow with history: a SET clause (`set` / `config` options or `set_config()` in the body; put settings such as jit on the role), another language, VOLATILE, more than one statement or any DML, `FOR UPDATE` / `FOR SHARE`, a `MATERIALIZED` CTE, a list passed as `IN ($2, $3)` or `ARRAY[$2, $3]`, a missing ROWS estimate, or a `$n` beyond the arguments. New test helpers `checkFunctionRead` / `expectFunctionRead` (`pipework/test`) judge a function, including one created by raw DDL: they fail it when it is not inlined, when the rows it touches grow with history (small vs 10x history), or when it touches more with missing statistics than after ANALYZE, and report "not checked" when the call touched no rows or the role is not a superuser (missing statistics cannot then be measured). Calls go through the labelled statement path, so `pipe.labelled` timing and the `query:large` budgets apply.
|
|
10
|
+
|
|
3
11
|
## 0.290.0
|
|
4
12
|
|
|
5
13
|
- **Added: `filter.row(...)` and `filter.rowEquals(lhs, rhs)`, row comparisons for composite keys** (#1010). `eq` / `ne` / `gt` / `gte` / `lt` / `lte` now accept a row on both sides: `gte(row(t.a, t.b, t.c), row(k.a, k.b, k.c))` renders `("t"."a", "t"."b", "t"."c") >= ("k"."a", "k"."b", "k"."c")`, so a composite-key join against a `pipe.rows` key list needs no `pipe.sql`. Each element is a column, a SQL expression (a `pipe.rows` column is one) or a JS value. A value is bound and cast to the SQL type of the column facing it on the other row (`($1::text, $2::text)`); facing an expression it is bound uncast. `rowEquals` emits the range pair `lhs >= rhs and lhs <= rhs`: Postgres splits `(a, b, c) = (x, y, z)` into three equalities and probes the shortest index holding a and b, while a row comparison is an index condition only on an index holding all its columns in order, so the pair takes the (a, b, c) index and reads only matching rows (measured under FORCE ROW LEVEL SECURITY: 50 rows read for 50 returned, against 800 read with three `eq`s). It equals equality for never-NULL keys; with a NULL element it can yield NULL where equality yields false, which differs only under `not(...)`. A row of fewer than two elements, rows of unequal length, or a row compared with a non-row throw `[pipework] row:`.
|
package/REFERENCE.md
CHANGED
|
@@ -995,6 +995,56 @@ A result column of one function (`unnestUuids(f.x)`) is a valid argument to anot
|
|
|
995
995
|
|
|
996
996
|
The default alias is the unqualified function name. Fields work with `eq`, `castUuid`, `orderBy`, joins and `select({ x: f.fromPath })`.
|
|
997
997
|
|
|
998
|
+
#### A function pipework defines: a read
|
|
999
|
+
|
|
1000
|
+
Give `pipe.fn` a `body` and pipework creates the function: the migration generator emits `CREATE OR REPLACE FUNCTION` for it, the call is typed from the definition, and it is a read under the rule that reads are key lookups. Export it from a schema file the way a table is exported; the generator finds it there. A `pipe.fn` without a `body` only refers to a function that exists already, as above.
|
|
1001
|
+
|
|
1002
|
+
```ts
|
|
1003
|
+
export const headImports = pipe.fn('canvas.head_imports', {
|
|
1004
|
+
args: [pipe.field.uuid(), pipe.field.text()], // the body refers to them as $1, $2
|
|
1005
|
+
columns: { fromPath: pipe.field.text(), line: pipe.field.integer() }, // RETURNS TABLE(from_path text, line integer)
|
|
1006
|
+
body: `select i.from_path, i.line from canvas.imports i where i.repo_id = $1 and i.sha = $2`,
|
|
1007
|
+
volatility: 'stable', // 'stable' (the default) or 'immutable'
|
|
1008
|
+
rows: 50, // typical result size of one call; required for a set
|
|
1009
|
+
})
|
|
1010
|
+
const f = headImports(repoId, sha) // the typed source described above
|
|
1011
|
+
await pipe.labelled('head-imports', async () => await db.select().from(f).where(eq(f.line, 3)))
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
For a scalar function declare `returns: pipe.field.integer()` instead of `columns` and `rows`; its call is a typed SQL expression (`select canvas.f($1::uuid)`). A list is one array argument (`pipe.field.uuid().array()`, `column = ANY($2)`). The call is an ordinary query on the connection, so `pipe.labelled`, the timing alerts and the `query:large` budgets apply to it.
|
|
1015
|
+
|
|
1016
|
+
Migrations. The snapshot records each function by `schema.name(argument types)`. A new function, or a changed body, volatility or ROWS, is `CREATE OR REPLACE FUNCTION`. A changed result shape (Postgres cannot replace a return type) is `DROP FUNCTION` then `CREATE`. A changed argument list is a different function: the old signature is dropped and the new one created. A function removed from the schema files is dropped, without CASCADE, so a dependent object fails the migration loudly. Function drops come first in a migration, before any table or column is dropped, and function creates come last, after every table, column, index and foreign key, because a `LANGUAGE sql` body is checked when the function is created. The schema it lives in must exist, as for a table. The statement is dollar-quoted (`$pw_body$`) and always `LANGUAGE sql`, never `STRICT`, `SECURITY DEFINER` or `SET`.
|
|
1017
|
+
|
|
1018
|
+
Static rules, checked when `pipe.fn` is called, each with a `[pipework] pipe.fn("name"): ... Fix: ...` error. A read is inlined into the query that calls it only when the function allows it, and a function that is not inlined is a black box: the planner cannot push the caller's keys into it, so the rows it touches grow with history instead of with its keys. Each rule is a reason Postgres does not inline, or a reason keys do not reach the table:
|
|
1019
|
+
|
|
1020
|
+
- No SET clause (`set`, `config`, or `set_config(` in the body): a function with `proconfig` set is never inlined. A session setting such as `jit` belongs on the role, `ALTER ROLE app SET jit = off`.
|
|
1021
|
+
- `language` is `sql`: Postgres inlines only LANGUAGE sql; a plpgsql function runs per call. What cannot be one SELECT is a derivation, not a read.
|
|
1022
|
+
- `volatility` is `stable` or `immutable`: a VOLATILE function is not inlined.
|
|
1023
|
+
- The body is one SELECT (`WITH ... SELECT` allowed), with no second statement, no INSERT/UPDATE/DELETE/MERGE (also inside a CTE), no `FOR UPDATE` / `FOR SHARE`: Postgres inlines only a single plain SELECT.
|
|
1024
|
+
- No `AS MATERIALIZED` CTE: it is computed in full before the caller's keys are applied, an optimisation fence, so what it scans grows with history.
|
|
1025
|
+
- A list is one array parameter: `IN ($2, $3)` or `ARRAY[$2, $3]` over separate parameters gives each list length its own signature and plan.
|
|
1026
|
+
- A set-returning function declares `rows`: without ROWS Postgres plans every join around a guess of 1000 rows.
|
|
1027
|
+
- `$n` stays within the declared arguments. `SECURITY DEFINER`, `STRICT`, `PARALLEL` and `COST` are not options: each stops inlining.
|
|
1028
|
+
|
|
1029
|
+
#### Checking a read: `checkFunctionRead` and `expectFunctionRead` (`pipework/test`)
|
|
1030
|
+
|
|
1031
|
+
The rules above are static; whether a read is a key lookup is shown by its plan. `checkFunctionRead(db, { fn, args, tables, seed, history?, tolerance? })` returns a report (`status`: `passed`, `failed` or `not-checked`; `problems`; the four measurements) and `expectFunctionRead` throws a `[pipework]` error unless it passed. `fn` is what `pipe.fn` returned (a referenced function is checked too), `args` representative arguments, `tables` the tables it reads, and `seed(db, history)` leaves exactly `history` rows of history for the same keys the call looks up (it may truncate and refill); it is called with 200 and then 2000 by default (`history: [n, 10n]`).
|
|
1032
|
+
|
|
1033
|
+
```ts
|
|
1034
|
+
await expectFunctionRead(db, {
|
|
1035
|
+
fn: headImports, args: [repoId, 'v0'], tables: ['canvas.imports'],
|
|
1036
|
+
seed: async (db, history) => { /* truncate canvas.imports; insert `history` shas for repoId, 3 rows each */ },
|
|
1037
|
+
})
|
|
1038
|
+
```
|
|
1039
|
+
|
|
1040
|
+
It counts rows touched from `EXPLAIN (ANALYZE, VERBOSE, FORMAT JSON)` of the typed call with parallelism off: for each node that scans a relation, rows returned plus rows removed by filter or index recheck, times loops, summed. It measures four times: fresh statistics at the small history (after ANALYZE), the large history seeded without analyzing (stale statistics), the large history after ANALYZE (fresh), and the large history after the tables' `pg_statistic` rows are deleted (missing; this needs a superuser, as the test cluster's role is, and autovacuum is switched off on the tables for the run and restored). A role that is not a superuser cannot delete statistics: the missing state is then not measured, the report lists it in `notChecked` and its `problems`, `status` is `not-checked` (or `failed` if something else failed) and `expectFunctionRead` throws naming it, so the state is never passed quietly. A role that cannot switch autovacuum off (not the tables' owner) makes the check throw, naming the fix: run it as the owner or a superuser. It fails when:
|
|
1041
|
+
|
|
1042
|
+
- the function was not inlined: the plan has a Function Scan on it or its call text, or its catalog row has a SET clause, a language other than sql, VOLATILE, SECURITY DEFINER or STRICT (so a function created by raw DDL is judged too, and the message says which);
|
|
1043
|
+
- rows touched at the large history exceed those at the small one by more than the tolerance (default 10% plus 5 rows): the read scans history; the message names the largest scan, and a CTE Scan (a MATERIALIZED CTE);
|
|
1044
|
+
- rows touched with stale or missing statistics exceed those after ANALYZE by more than the tolerance: the plan depends on the statistics being current (a 50-190x blow-up with stale statistics is the failure this catches).
|
|
1045
|
+
|
|
1046
|
+
A read that touches no rows on the fixture at the large history is `not-checked`, never a pass: seed rows for the keys in `args`. Scalar functions are checked the same way; one that reads a table is a call in the plan, so it is reported as not inlined.
|
|
1047
|
+
|
|
998
1048
|
### `pipe.field`
|
|
999
1049
|
|
|
1000
1050
|
Field builders for domain definitions — uuid(), text(), integer(), etc.
|
|
@@ -1042,9 +1092,39 @@ Returns the global registry of all domain definitions.
|
|
|
1042
1092
|
|
|
1043
1093
|
Pipework-owned UPDATE builder — the only consumer-facing way to update pipework-managed tables (Q8).
|
|
1044
1094
|
|
|
1095
|
+
### `pipe.updateEach`
|
|
1096
|
+
|
|
1097
|
+
One UPDATE for many keys, returning how many rows each key updated, in input order. `pipe.updateEach(table, { keys, data, where, set, key?, expect? })`: `keys` maps each input column to a SQL type and `data` holds one array per column (as `pipe.rows`); `where(k)` and `set(k)` are written against the rowset `k` (`k.id`), as `pipe.update().where().set()` are against the table. It renders `UPDATE t SET ... FROM (select * from unnest($1::uuid[], $2::int[], $3::int[]) as "rows"(id, ord, _i)) "rows" WHERE ... RETURNING "rows"."_i"` and counts the returned rows per input index in JS, so a key that matched nothing (it has no row) is a count of 0, not a missing entry.
|
|
1098
|
+
|
|
1099
|
+
```ts
|
|
1100
|
+
const counts = await pipe.updateEach(Standing, {
|
|
1101
|
+
keys: { id: 'uuid', at: 'int' },
|
|
1102
|
+
data: { id: ids, at: ordinals },
|
|
1103
|
+
where: k => and(eq(Standing.id, k.id), isNull(Standing.toOrdinal)),
|
|
1104
|
+
set: k => ({ toOrdinal: k.at }),
|
|
1105
|
+
}) // number[]: 1 per key
|
|
1106
|
+
```
|
|
1107
|
+
|
|
1108
|
+
By default every key must update exactly one row: otherwise it throws `key { id="..." } (input 7) matched 0 rows of "standing", expected exactly one. Nothing was updated.`, naming the first such key in input order, and the update is undone (it runs in a savepoint inside the caller's transaction, or its own transaction when there is none). `expect: 'any'` skips the refusal and returns the counts (0, 1, or more). `key` names the columns that identify an input (default: all of `keys`); a key repeated in `data` throws before any statement, naming it and both positions. An empty `data` returns `[]` with no statement. Past 250,000 keys (or 256 MiB of key text) the keys go as consecutive statements in order inside the same transaction and the refusal check runs over all of them, so one bad key undoes every statement. Tested at 139,000 keys: one statement, 2.3 s without audit, 5.7 s with `@touches` (139,000 audit rows), server RSS about +40 MB. A tenant-scoped connection filters the update to its tenant, so another tenant's row is a key that matched nothing; under RLS the update sees only the rows its policy lets the role see.
|
|
1109
|
+
|
|
1110
|
+
Audit: under `@touches` for the table each row changed gets the audit row `pipe.update` writes (`before` and `after`), in the same statement; a row that two keys both match is snapshotted once. A refused update is undone with its audit rows. `returning` is not offered: the result is the counts.
|
|
1111
|
+
|
|
1045
1112
|
### `pipe.insert`
|
|
1046
1113
|
|
|
1047
|
-
Pipework-owned INSERT builder — the only consumer-facing way to insert into pipework-managed tables (Q8). A list of any size is split into statements under Postgres's parameter limit, in one transaction.
|
|
1114
|
+
Pipework-owned INSERT builder — the only consumer-facing way to insert into pipework-managed tables (Q8). A list of any size is split into statements under Postgres's parameter limit, in one transaction; `.batch(rows)` sends every row as one statement instead, arrays and NULLs included.
|
|
1115
|
+
|
|
1116
|
+
`.batch(rows)` is for a writer that persists a computed set (thousands to hundreds of thousands of rows) and must not pay a statement per chunk. It renders `INSERT INTO t (cols) SELECT "batch"."a"::uuid, "batch"."b"::text[] FROM unnest($1::text[], $2::text[]) AS "batch"(a, b)`: each column is one parameter, so 10,000 rows of 10 columns are ten parameters and one statement. Each cell is the text a single-row parameter of that column carries (the column's own driver encoding) and is cast back to the column's SQL type per cell, so any type `values()` takes works, array columns included (a column that went through `unnest` as an array would be flattened; a column of text cells is not), NULLs are NULL, and a bigint above 2^53 is exact. It is plain `INSERT ... SELECT`, so it composes with `.onConflictDoNothing({ target? })` (insert-or-ignore: `.returning()` yields only the rows inserted, in input order) and `.returning()`, runs in the caller's transaction (a later statement reads what it wrote) and under the connection's tenant scope (the tenant column is set on every row; a row naming another tenant throws; no tenant in context refuses a tenant table, as `values()` does) and under RLS insert policies.
|
|
1117
|
+
|
|
1118
|
+
```ts
|
|
1119
|
+
await pipe.insert(Version).batch(rows) // one statement
|
|
1120
|
+
const added = await pipe.insert(Edge).batch(rows).onConflictDoNothing({ target: ['from', 'to'] }).returning()
|
|
1121
|
+
```
|
|
1122
|
+
|
|
1123
|
+
Every row names the same columns: a column no row sets takes its database default (a JS-side `$defaultFn` fills each row as `values()` does); a row that omits a column other rows set throws naming the column and the row (pass `null` for NULL); a key that is not a field of the table throws naming the key and the row; a `sql` expression as a value throws (use `values()`). `returning()` takes `RETURNING *` or a projection of the table's columns, not an arbitrary expression. An empty list sends no statement.
|
|
1124
|
+
|
|
1125
|
+
Size: the library splits, the caller does not. A batch is one statement up to 250,000 rows or 256 MiB of parameter text, whichever comes first; past that it is consecutive statements of that size, in order, in one transaction (a savepoint when nested), so a later statement reads what an earlier one wrote, the whole batch lands or none, `returning()` concatenates in input order and the skipped-row event sums across them. Tested at canvas's walk size on the test cluster, 139,000 rows into an indexed table (uuid, text, int, text[]): one statement, 2.3 s, 19 MB of parameters, about +110 MB server backend RSS (24-41 MB to 140-150 MB) and about +205 MB client RSS (encoded cells); with `returning()` 2.8 s; under `@touches` 4.3 s and 139,000 audit rows in the same statement. Such a statement logs one `query:large` warning (parameters over the 8 MiB default `largeQueryParamBytes`); it is a log line, not an error, and raising or zeroing the budget silences it. The limits sit far below Postgres's 1 GB cap on one parameter (a 139k-row batch is about 19 MB of it). Why not `COPY ... FROM STDIN (FORMAT binary)`: Postgres refuses `COPY FROM` into a table with row-level security for a role that does not bypass it (`COPY FROM not supported with row-level security`, verified on the test cluster as a non-owner role), COPY has no `ON CONFLICT` or `RETURNING`, and it cannot sit inside the audit CTE. `INSERT ... SELECT FROM unnest` has none of those limits and measured the same speed (100,000 rows with a text[] column into an indexed table: 0.43 to 0.51 s, against 0.57 to 0.58 s for binary COPY, Rust client, test cluster).
|
|
1126
|
+
|
|
1127
|
+
Audit: under `@touches` a batch emits the audit rows `values()` emits (one `create` per row written and per touch, `before` null, `after` the traceSafe projection), through the same write-and-audit statement, and a skipped row under `onConflictDoNothing` gets none and records the same `external:pipework.insert.conflict` step. Where it differs: `trace.auditChunkSize` does not split a batch (it bounds audit rows per statement for `values()`; a batch's audit rows are an `INSERT ... SELECT` with no parameter per row, and the batch splits by its own limits below).
|
|
1048
1128
|
|
|
1049
1129
|
`.onConflictDoNothing({ target? })` inserts the rows that do not conflict and leaves the rows that do. `target` is field keys; without it any unique or exclusion conflict is skipped, and an empty `target` or an unknown key throws. `.returning()` yields only the rows written, so a fully skipped insert returns `[]`.
|
|
1050
1130
|
|
|
@@ -8,6 +8,15 @@ export declare function unscopedExecutor(db: DB): {
|
|
|
8
8
|
readonly db: DB;
|
|
9
9
|
readonly tenant: string | null;
|
|
10
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* For a batch insert that writes its own SQL: runs the connection's policy for an insert into `table` (a guard,
|
|
13
|
+
* `pipe.system()` or a door refuses a tenant table exactly as `insert(table)` does) and returns the tenant column
|
|
14
|
+
* and value the rows must carry, or null when the table is not tenant-scoped or the handle has no tenant.
|
|
15
|
+
*/
|
|
16
|
+
export declare function insertTenant(db: DB, table: unknown): {
|
|
17
|
+
readonly columnKey: string;
|
|
18
|
+
readonly tenantId: string;
|
|
19
|
+
} | null;
|
|
11
20
|
/** Throws unless `db` is an unscoped handle; for APIs that act across tenants and cannot be confined to one. */
|
|
12
21
|
export declare function requireUnscopedExecutor(db: DB, api: string, reason: string): DB;
|
|
13
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-db.d.ts","sourceRoot":"","sources":["../../../src/auth/tenant/scoped-db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAyBhD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAG5F;AAWD,gHAAgH;AAChH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,CAI/E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAW9H;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAO,GAAG,CAAC,CAc5H;AA6dD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAE9C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAE3D;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAE9C;AAED,qKAAqK;AACrK,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,EAAE,CAElI"}
|
|
1
|
+
{"version":3,"file":"scoped-db.d.ts","sourceRoot":"","sources":["../../../src/auth/tenant/scoped-db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAyBhD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAG5F;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMrH;AAWD,gHAAgH;AAChH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,CAI/E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAW9H;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAO,GAAG,CAAC,CAc5H;AA6dD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAE9C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAE3D;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAE9C;AAED,qKAAqK;AACrK,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,EAAE,CAElI"}
|
|
@@ -13,6 +13,20 @@ export function unscopedExecutor(db) {
|
|
|
13
13
|
const scoped = scopedHandles.get(db);
|
|
14
14
|
return scoped === undefined ? { db, tenant: null } : { db: scoped.raw, tenant: scoped.tenantId };
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* For a batch insert that writes its own SQL: runs the connection's policy for an insert into `table` (a guard,
|
|
18
|
+
* `pipe.system()` or a door refuses a tenant table exactly as `insert(table)` does) and returns the tenant column
|
|
19
|
+
* and value the rows must carry, or null when the table is not tenant-scoped or the handle has no tenant.
|
|
20
|
+
*/
|
|
21
|
+
export function insertTenant(db, table) {
|
|
22
|
+
;
|
|
23
|
+
db.insert(table);
|
|
24
|
+
const scoped = scopedHandles.get(db);
|
|
25
|
+
if (scoped === undefined)
|
|
26
|
+
return null;
|
|
27
|
+
const config = getScopeConfig(table);
|
|
28
|
+
return config === null ? null : { columnKey: config.columnKey, tenantId: scoped.tenantId };
|
|
29
|
+
}
|
|
16
30
|
/** The API's name and why it cannot be confined to one tenant, for the error a scoped handle gets. */
|
|
17
31
|
function refuseScopedMessage(api, tenant, reason) {
|
|
18
32
|
return (`[pipework] ${api} was given a tenant-scoped database connection (tenant "${tenant}"), but ${reason}.\n\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-db.js","sourceRoot":"","sources":["../../../src/auth/tenant/scoped-db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scoped-db.js","sourceRoot":"","sources":["../../../src/auth/tenant/scoped-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Marks a callable returned by `pipe.fn` that carries a definition (a `body`), so the migration generator can find it among a schema file's exports. */
|
|
2
|
+
export declare const FUNCTION_DEFINITION: unique symbol;
|
|
3
|
+
export type FunctionVolatility = 'stable' | 'immutable';
|
|
4
|
+
/** One column of a set-returning function's result, as the snapshot and the DDL carry it. */
|
|
5
|
+
export interface FunctionColumnDefinition {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly type: string;
|
|
8
|
+
}
|
|
9
|
+
/** A function pipework creates and migrates: what the snapshot records and the DDL is emitted from. */
|
|
10
|
+
export interface FunctionDefinition {
|
|
11
|
+
readonly schema: string;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
/** SQL types of the arguments, in call order. */
|
|
14
|
+
readonly args: readonly string[];
|
|
15
|
+
/** `table`: RETURNS TABLE(columns) with a ROWS estimate. `scalar`: RETURNS type. */
|
|
16
|
+
readonly returns: {
|
|
17
|
+
readonly kind: 'table';
|
|
18
|
+
readonly columns: readonly FunctionColumnDefinition[];
|
|
19
|
+
readonly rows: number;
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'scalar';
|
|
22
|
+
readonly type: string;
|
|
23
|
+
};
|
|
24
|
+
readonly body: string;
|
|
25
|
+
readonly volatility: FunctionVolatility;
|
|
26
|
+
}
|
|
27
|
+
/** What `pipe.fn` was given, for the rules that look at it before it becomes a definition. */
|
|
28
|
+
export interface FunctionDefinitionInput {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly argCount: number;
|
|
31
|
+
readonly body: string;
|
|
32
|
+
readonly spec: Readonly<Record<string, unknown>>;
|
|
33
|
+
readonly setReturning: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** The identity of a function in a snapshot: `schema.name(type, type)`; a changed argument list is a different function. */
|
|
36
|
+
export declare function functionKey(def: Pick<FunctionDefinition, 'schema' | 'name' | 'args'>): string;
|
|
37
|
+
/**
|
|
38
|
+
* The static rules of a pipework-defined read. Each exists because Postgres inlines a SQL function into the
|
|
39
|
+
* calling query only when the function allows it, and a function that is not inlined is a black box the planner
|
|
40
|
+
* cannot push the caller's keys into; its rows touched then grow with history instead of with its keys.
|
|
41
|
+
* Throws a `[pipework]` error naming the rule and the fix.
|
|
42
|
+
*/
|
|
43
|
+
export declare function assertReadFunction(input: FunctionDefinitionInput): void;
|
|
44
|
+
/** The dollar-quote tag for a body: `$pw_body$`, lengthened until the body does not contain it. */
|
|
45
|
+
export declare function bodyQuote(body: string): string;
|
|
46
|
+
//# sourceMappingURL=function-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-definition.d.ts","sourceRoot":"","sources":["../../../src/data/db/function-definition.ts"],"names":[],"mappings":"AAEA,yJAAyJ;AACzJ,eAAO,MAAM,mBAAmB,eAAuC,CAAA;AAEvE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEvD,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EACZ;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACxG;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAA;CACxC;AAED,8FAA8F;AAC9F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAChD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;CAC/B;AAQD,4HAA4H;AAC5H,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAE7F;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,CA8GvE;AAED,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { blankLiterals, stripComments } from '../migrate/statements.js';
|
|
2
|
+
/** Marks a callable returned by `pipe.fn` that carries a definition (a `body`), so the migration generator can find it among a schema file's exports. */
|
|
3
|
+
export const FUNCTION_DEFINITION = Symbol.for('pipework.fn.definition');
|
|
4
|
+
const SPEC_KEYS = new Set(['args', 'columns', 'returns', 'body', 'volatility', 'rows', 'language']);
|
|
5
|
+
function fail(name, message, fix) {
|
|
6
|
+
throw new Error(`[pipework] pipe.fn("${name}"): ${message}\n\n Fix: ${fix}\n`);
|
|
7
|
+
}
|
|
8
|
+
/** The identity of a function in a snapshot: `schema.name(type, type)`; a changed argument list is a different function. */
|
|
9
|
+
export function functionKey(def) {
|
|
10
|
+
return `${def.schema}.${def.name}(${def.args.join(', ')})`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The static rules of a pipework-defined read. Each exists because Postgres inlines a SQL function into the
|
|
14
|
+
* calling query only when the function allows it, and a function that is not inlined is a black box the planner
|
|
15
|
+
* cannot push the caller's keys into; its rows touched then grow with history instead of with its keys.
|
|
16
|
+
* Throws a `[pipework]` error naming the rule and the fix.
|
|
17
|
+
*/
|
|
18
|
+
export function assertReadFunction(input) {
|
|
19
|
+
const { name, spec, body } = input;
|
|
20
|
+
for (const key of ['set', 'config', 'settings']) {
|
|
21
|
+
if (key in spec) {
|
|
22
|
+
fail(name, `"${key}" is a SET clause, which a read function cannot have. Postgres never inlines a function with a SET clause (proconfig is set), so the planner cannot push the caller's keys into it and every call plans and scans on its own.`, 'remove it. A session setting such as jit belongs on the role (`ALTER ROLE app SET jit = off`), not on a function.');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const unknown = Object.keys(spec).filter(k => !SPEC_KEYS.has(k) && k !== 'set' && k !== 'config' && k !== 'settings');
|
|
26
|
+
if (unknown.length > 0) {
|
|
27
|
+
fail(name, `unknown option${unknown.length > 1 ? 's' : ''} ${unknown.map(k => `"${k}"`).join(', ')}.`, `a read function takes ${[...SPEC_KEYS].join(', ')}. SECURITY DEFINER, STRICT, PARALLEL and COST are not offered: each stops Postgres inlining the function.`);
|
|
28
|
+
}
|
|
29
|
+
const language = spec['language'];
|
|
30
|
+
if (language !== undefined && language !== 'sql') {
|
|
31
|
+
fail(name, `language "${String(language)}" is not allowed for a read. Postgres inlines only LANGUAGE sql functions; a plpgsql function is a black box that runs per call and cannot be pushed into.`, 'write the read as one LANGUAGE sql SELECT. A computation that cannot be one SELECT is a derivation (maintained on write), not a read.');
|
|
32
|
+
}
|
|
33
|
+
const volatility = spec['volatility'];
|
|
34
|
+
if (volatility !== undefined && volatility !== 'stable' && volatility !== 'immutable') {
|
|
35
|
+
fail(name, `volatility "${String(volatility)}" is not allowed for a read. Postgres does not inline a VOLATILE function into the calling query.`, "use 'stable' (reads tables) or 'immutable' (reads nothing that changes).");
|
|
36
|
+
}
|
|
37
|
+
if (input.setReturning) {
|
|
38
|
+
const rows = spec['rows'];
|
|
39
|
+
if (typeof rows !== 'number' || !Number.isInteger(rows) || rows <= 0) {
|
|
40
|
+
fail(name, 'a set-returning function needs a ROWS estimate (a positive integer). Without it Postgres assumes 1000 rows for the call, and plans every join and filter around that guess.', 'give `rows` the typical result size for one call, e.g. `rows: 50`.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (spec['rows'] !== undefined) {
|
|
44
|
+
fail(name, '`rows` applies to a set-returning function, and this one returns a scalar.', 'remove `rows`, or declare `columns` to return a set.');
|
|
45
|
+
}
|
|
46
|
+
const code = blankLiterals(stripComments(body));
|
|
47
|
+
const trimmed = code.trim().replace(/;\s*$/, '');
|
|
48
|
+
if (/;/.test(trimmed)) {
|
|
49
|
+
fail(name, 'the body has more than one statement. Postgres inlines a function only when its body is a single SELECT.', 'make the body one SELECT (use a CTE or a join for the second step).');
|
|
50
|
+
}
|
|
51
|
+
if (!/^(select|with|\(\s*select)\b/i.test(trimmed)) {
|
|
52
|
+
fail(name, 'the body is not a SELECT. A read function is one SELECT statement; Postgres inlines only a single SELECT.', 'start the body with SELECT or WITH ... SELECT.');
|
|
53
|
+
}
|
|
54
|
+
if (/\b(insert\s+into|update\s+[\w".]+\s+set|delete\s+from|merge\s+into|truncate\s+(?:table\s+)?["\w])/i.test(trimmed)) {
|
|
55
|
+
fail(name, 'the body writes (INSERT, UPDATE, DELETE, MERGE or TRUNCATE, possibly inside a CTE). A read function is one SELECT; a body with a data-modifying statement is not inlined.', 'move the write to pipe.insert / pipe.update / pipe.delete.');
|
|
56
|
+
}
|
|
57
|
+
if (/\bfor\s+(no\s+key\s+update|update|key\s+share|share)\b/i.test(trimmed)) {
|
|
58
|
+
fail(name, 'the body takes row locks (FOR UPDATE / FOR SHARE). Postgres does not inline a function that locks rows.', 'remove the locking clause; a read does not lock.');
|
|
59
|
+
}
|
|
60
|
+
if (/\bset_config\s*\(/i.test(trimmed)) {
|
|
61
|
+
fail(name, 'the body calls set_config(), which is a SET clause in disguise: it makes the function VOLATILE and Postgres does not inline it.', 'remove it. A session setting belongs on the role (`ALTER ROLE app SET ... `).');
|
|
62
|
+
}
|
|
63
|
+
if (/\bas\s+materialized\b/i.test(trimmed)) {
|
|
64
|
+
fail(name, 'the body has a MATERIALIZED CTE. Postgres computes it once, in full, before the caller\'s keys are applied: it is an optimisation fence, and the rows it scans grow with history, not with the keys.', 'drop the MATERIALIZED keyword (a CTE used once is inlined by default), or write the CTE as a subquery or a join.');
|
|
65
|
+
}
|
|
66
|
+
if (/\bin\s*\(\s*\$\d+\s*(?:,\s*\$\d+\s*)+\)/i.test(trimmed) || /\barray\s*\[\s*\$\d+\s*(?:,\s*\$\d+\s*)+\]/i.test(trimmed)) {
|
|
67
|
+
fail(name, 'a list is passed as separate parameters ($1, $2, ...). A list argument is one array parameter: separate parameters give every list length its own signature and its own plan.', 'declare one array argument (`pipe.field.uuid().array()`) and write `column = ANY($n)`.');
|
|
68
|
+
}
|
|
69
|
+
for (const m of trimmed.matchAll(/\$(\d+)/g)) {
|
|
70
|
+
const n = Number(m[1]);
|
|
71
|
+
if (n < 1 || n > input.argCount) {
|
|
72
|
+
fail(name, `the body refers to $${n}, but the function declares ${input.argCount} argument${input.argCount === 1 ? '' : 's'}.`, 'refer to arguments as $1 ... $n, in the order of `args`.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** The dollar-quote tag for a body: `$pw_body$`, lengthened until the body does not contain it. */
|
|
77
|
+
export function bodyQuote(body) {
|
|
78
|
+
let tag = '$pw_body$';
|
|
79
|
+
let i = 0;
|
|
80
|
+
while (body.includes(tag))
|
|
81
|
+
tag = `$pw_body${++i}$`;
|
|
82
|
+
return tag;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=function-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-definition.js","sourceRoot":"","sources":["../../../src/data/db/function-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { Subquery } from '../query/subquery.js';
|
|
|
3
3
|
import type { Column } from './types.js';
|
|
4
4
|
import type { InferFieldOutput } from '../domain/brand.js';
|
|
5
5
|
import type { FieldDescriptor } from '../domain/types.js';
|
|
6
|
+
import { type FunctionDefinition, type FunctionVolatility } from './function-definition.js';
|
|
6
7
|
type AnyField = FieldDescriptor<any, any>;
|
|
7
8
|
/** Declares a SQL function's argument and result-column shapes. See {@link fn}. */
|
|
8
9
|
export interface FunctionSpec<TArgs extends readonly AnyField[], TColumns extends Record<string, AnyField>> {
|
|
@@ -10,6 +11,35 @@ export interface FunctionSpec<TArgs extends readonly AnyField[], TColumns extend
|
|
|
10
11
|
readonly args: readonly [...TArgs];
|
|
11
12
|
/** One `pipe.field.*` descriptor per result column; keys are camelCase, columns are their snake_case. */
|
|
12
13
|
readonly columns: TColumns;
|
|
14
|
+
/** The body of a function pipework creates: one `LANGUAGE sql` SELECT that refers to the arguments as `$1`, `$2`, ... Without it the function is only referenced (it exists already). */
|
|
15
|
+
readonly body?: string;
|
|
16
|
+
/** `'stable'` (the default) or `'immutable'`; a read is never volatile. Only with `body`. */
|
|
17
|
+
readonly volatility?: FunctionVolatility;
|
|
18
|
+
/** The typical number of rows one call returns, a planner estimate (ROWS). Required with `body`. */
|
|
19
|
+
readonly rows?: number;
|
|
20
|
+
/** Only `'sql'`: Postgres inlines no other language. */
|
|
21
|
+
readonly language?: 'sql';
|
|
22
|
+
}
|
|
23
|
+
/** Declares a SQL function that returns one value. See {@link fn}. */
|
|
24
|
+
export interface ScalarFunctionSpec<TArgs extends readonly AnyField[], TReturn extends AnyField> {
|
|
25
|
+
readonly args: readonly [...TArgs];
|
|
26
|
+
readonly returns: TReturn;
|
|
27
|
+
readonly body: string;
|
|
28
|
+
readonly volatility?: FunctionVolatility;
|
|
29
|
+
readonly language?: 'sql';
|
|
30
|
+
}
|
|
31
|
+
/** A function callable with typed arguments; `definition` is set when pipework creates it (the spec had a `body`). */
|
|
32
|
+
export type DefinedCall<TCall> = TCall & {
|
|
33
|
+
readonly definition: FunctionDefinition | undefined;
|
|
34
|
+
/** Where the function lives and its argument types; what a plan or catalog check looks it up by. */
|
|
35
|
+
readonly ref: FunctionRef;
|
|
36
|
+
};
|
|
37
|
+
/** A function's schema, name and SQL argument types. */
|
|
38
|
+
export interface FunctionRef {
|
|
39
|
+
readonly schema: string;
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly args: readonly string[];
|
|
42
|
+
readonly setReturning: boolean;
|
|
13
43
|
}
|
|
14
44
|
/** A column whose data type is `T` (and that cannot be null unless `T` can). */
|
|
15
45
|
type ColumnOf<T> = Column & {
|
|
@@ -33,7 +63,7 @@ export type FunctionSource<TAlias extends string, TColumns extends Record<string
|
|
|
33
63
|
as<TNew extends string>(alias: TNew): FunctionSource<TNew, TColumns>;
|
|
34
64
|
};
|
|
35
65
|
/**
|
|
36
|
-
* Declares a
|
|
66
|
+
* Declares a SQL function and returns a callable. A set-returning one (`columns`) yields a source for `.from()` and joins.
|
|
37
67
|
* Each argument is a value, a column or a SQL expression of the declared type. A value is bound as a parameter,
|
|
38
68
|
* converted the way a column of that field is on insert (jsonb as JSON text, dates, bigints, arrays), and cast to its
|
|
39
69
|
* declared SQL type: `ext.f($1::uuid, $2::text)`. A null binds SQL NULL. An array argument (`field.uuid().array()`) is
|
|
@@ -41,6 +71,7 @@ export type FunctionSource<TAlias extends string, TColumns extends Record<string
|
|
|
41
71
|
* `unnest(t.arr::uuid[])`, so an array column can be unnested in a lateral join (`.crossJoinLateral(unnestUuids(t.arr))`).
|
|
42
72
|
* Result columns are typed from `columns`; the default alias is the function's unqualified name.
|
|
43
73
|
*/
|
|
44
|
-
export declare function fn<const TArgs extends readonly AnyField[],
|
|
74
|
+
export declare function fn<const TArgs extends readonly AnyField[], TReturn extends AnyField>(name: string, spec: ScalarFunctionSpec<TArgs, TReturn>): DefinedCall<(...values: ArgValues<TArgs>) => SQL<InferFieldOutput<TReturn>>>;
|
|
75
|
+
export declare function fn<const TArgs extends readonly AnyField[], TColumns extends Record<string, AnyField>>(name: string, spec: FunctionSpec<TArgs, TColumns>): DefinedCall<(...values: ArgValues<TArgs>) => FunctionSource<string, TColumns>>;
|
|
45
76
|
export {};
|
|
46
77
|
//# sourceMappingURL=function-source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function-source.d.ts","sourceRoot":"","sources":["../../../src/data/db/function-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAI/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"function-source.d.ts","sourceRoot":"","sources":["../../../src/data/db/function-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { getTableColumns } from '../query/utils.js';
|
|
|
5
5
|
import { bindIfParam } from '../query/index.js';
|
|
6
6
|
import { projectTable } from '../domain/build-table.js';
|
|
7
7
|
import { camelToSnake } from '../domain/naming.js';
|
|
8
|
+
import { assertReadFunction, FUNCTION_DEFINITION } from './function-definition.js';
|
|
8
9
|
const NAME_PART = /^[a-z_][a-z0-9_]*$/;
|
|
9
10
|
function fail(message, fix) {
|
|
10
11
|
throw new Error(`[pipework] ${message}\n\n Fix: ${fix}\n`);
|
|
@@ -12,41 +13,63 @@ function fail(message, fix) {
|
|
|
12
13
|
function quote(name) {
|
|
13
14
|
return `"${name.replace(/"/g, '""')}"`;
|
|
14
15
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Declares a set-returning SQL function and returns a callable that yields a source for `.from()` and joins.
|
|
17
|
-
* Each argument is a value, a column or a SQL expression of the declared type. A value is bound as a parameter,
|
|
18
|
-
* converted the way a column of that field is on insert (jsonb as JSON text, dates, bigints, arrays), and cast to its
|
|
19
|
-
* declared SQL type: `ext.f($1::uuid, $2::text)`. A null binds SQL NULL. An array argument (`field.uuid().array()`) is
|
|
20
|
-
* one parameter: `ext.f($1::uuid[])`. A column or SQL expression is embedded as written, still cast:
|
|
21
|
-
* `unnest(t.arr::uuid[])`, so an array column can be unnested in a lateral join (`.crossJoinLateral(unnestUuids(t.arr))`).
|
|
22
|
-
* Result columns are typed from `columns`; the default alias is the function's unqualified name.
|
|
23
|
-
*/
|
|
24
16
|
export function fn(name, spec) {
|
|
25
17
|
const parts = name.split('.');
|
|
26
18
|
if (parts.length > 2 || parts.some(p => !NAME_PART.test(p))) {
|
|
27
19
|
fail(`pipe.fn: "${name}" is not a function name.`, 'use "fn" or "schema.fn", each part lowercase letters, digits and underscores, not starting with a digit.');
|
|
28
20
|
}
|
|
29
|
-
const
|
|
30
|
-
|
|
21
|
+
const scalar = 'returns' in spec ? spec.returns : undefined;
|
|
22
|
+
const columns = 'columns' in spec ? spec.columns : {};
|
|
23
|
+
const keys = Object.keys(columns);
|
|
24
|
+
if (scalar === undefined && keys.length === 0)
|
|
31
25
|
fail(`pipe.fn("${name}"): columns is empty.`, 'declare at least one result column.');
|
|
26
|
+
if (scalar !== undefined && 'columns' in spec)
|
|
27
|
+
fail(`pipe.fn("${name}"): both returns and columns are declared.`, 'declare `returns` for a scalar function or `columns` for a set-returning one.');
|
|
32
28
|
for (const key of keys) {
|
|
33
29
|
if (key === 'as' || key === '_') {
|
|
34
30
|
fail(`pipe.fn("${name}"): a result column cannot be named "${key}".`, 'rename the key; the column name comes from camelToSnake(key).');
|
|
35
31
|
}
|
|
36
32
|
}
|
|
33
|
+
const sqlTypeOf = (fields) => {
|
|
34
|
+
const cols = getTableColumns(projectTable('pw_fn_args', fields, {}));
|
|
35
|
+
return Object.fromEntries(Object.entries(cols).map(([k, c]) => {
|
|
36
|
+
const t = c.getSQLType();
|
|
37
|
+
return [k, t === 'serial' ? 'integer' : t === 'bigserial' ? 'bigint' : t];
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
37
40
|
const argFields = {};
|
|
38
41
|
spec.args.forEach((a, i) => { argFields[`a${i}`] = a; });
|
|
39
42
|
const argCols = getTableColumns(projectTable('pw_fn_args', argFields, {}));
|
|
40
|
-
const argTypes = spec.args.map((_, i) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
const argTypes = spec.args.map((_, i) => sqlTypeOf({ a: spec.args[i] })['a']);
|
|
44
|
+
let definition;
|
|
45
|
+
if (spec.body !== undefined) {
|
|
46
|
+
if (typeof spec.body !== 'string')
|
|
47
|
+
fail(`pipe.fn("${name}"): body must be a string.`, 'pass the SELECT as a string, with arguments as $1, $2, ...');
|
|
48
|
+
assertReadFunction({ name, argCount: spec.args.length, body: spec.body, spec: spec, setReturning: scalar === undefined });
|
|
49
|
+
const returnTypes = scalar === undefined ? sqlTypeOf(columns) : sqlTypeOf({ r: scalar });
|
|
50
|
+
definition = {
|
|
51
|
+
schema: parts.length === 2 ? parts[0] : 'public',
|
|
52
|
+
name: parts[parts.length - 1],
|
|
53
|
+
args: argTypes,
|
|
54
|
+
returns: scalar === undefined
|
|
55
|
+
? { kind: 'table', columns: keys.map(k => ({ name: camelToSnake(k), type: returnTypes[k] })), rows: spec.rows }
|
|
56
|
+
: { kind: 'scalar', type: returnTypes['r'] },
|
|
57
|
+
body: spec.body,
|
|
58
|
+
volatility: spec.volatility ?? 'stable',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const key of ['volatility', 'rows', 'language']) {
|
|
63
|
+
if (key in spec)
|
|
64
|
+
fail(`pipe.fn("${name}"): "${key}" is given without a body.`, 'add `body` to have pipework create the function, or remove the option (a referenced function keeps what it was created with).');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
44
67
|
const fnSql = sql.raw(parts.map(quote).join('.'));
|
|
45
68
|
const defaultAlias = parts[parts.length - 1];
|
|
69
|
+
const argList = (values) => sql.join(values.map((v, i) => sql `${bindIfParam(v, argCols[`a${i}`])}::${sql.raw(argTypes[i])}`), sql `, `);
|
|
46
70
|
const build = (values, alias) => {
|
|
47
71
|
const columnList = sql.join(keys.map(k => sql.raw(quote(camelToSnake(k)))), sql `, `);
|
|
48
|
-
const
|
|
49
|
-
const inner = sql `select ${columnList} from ${fnSql}(${argList})`;
|
|
72
|
+
const inner = sql `select ${columnList} from ${fnSql}(${argList(values)})`;
|
|
50
73
|
const fields = {};
|
|
51
74
|
for (const k of keys) {
|
|
52
75
|
fields[k] = sql.raw(`${quote(alias)}.${quote(camelToSnake(k))}`);
|
|
@@ -61,11 +84,16 @@ export function fn(name, spec) {
|
|
|
61
84
|
},
|
|
62
85
|
});
|
|
63
86
|
};
|
|
64
|
-
|
|
87
|
+
const call = (...values) => {
|
|
65
88
|
if (values.length !== spec.args.length) {
|
|
66
89
|
fail(`pipe.fn("${name}"): called with ${values.length} argument(s), declared ${spec.args.length}.`, 'pass one value per declared argument.');
|
|
67
90
|
}
|
|
68
|
-
return build(values, defaultAlias);
|
|
91
|
+
return scalar !== undefined ? sql `${fnSql}(${argList(values)})` : build(values, defaultAlias);
|
|
69
92
|
};
|
|
93
|
+
return Object.defineProperties(call, {
|
|
94
|
+
definition: { value: definition, enumerable: true },
|
|
95
|
+
ref: { value: { schema: parts.length === 2 ? parts[0] : 'public', name: defaultAlias, args: argTypes, setReturning: scalar === undefined }, enumerable: true },
|
|
96
|
+
[FUNCTION_DEFINITION]: { value: definition },
|
|
97
|
+
});
|
|
70
98
|
}
|
|
71
99
|
//# sourceMappingURL=function-source.js.map
|