@typesql/pg 0.0.3 → 0.1.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 +32 -0
- package/README.md +41 -23
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -0
- package/dist/client.d.ts +7 -29
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +44 -73
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/introspect/cli.d.ts +24 -0
- package/dist/introspect/cli.d.ts.map +1 -0
- package/dist/introspect/cli.js +121 -0
- package/dist/introspect/cli.js.map +1 -0
- package/dist/introspect/emit.d.ts +30 -0
- package/dist/introspect/emit.d.ts.map +1 -0
- package/dist/introspect/emit.js +144 -0
- package/dist/introspect/emit.js.map +1 -0
- package/dist/introspect/index.d.ts +5 -0
- package/dist/introspect/index.d.ts.map +1 -0
- package/dist/introspect/index.js +5 -0
- package/dist/introspect/index.js.map +1 -0
- package/dist/introspect/introspect.d.ts +67 -0
- package/dist/introspect/introspect.d.ts.map +1 -0
- package/dist/introspect/introspect.js +109 -0
- package/dist/introspect/introspect.js.map +1 -0
- package/dist/introspect/nullability.d.ts +60 -0
- package/dist/introspect/nullability.d.ts.map +1 -0
- package/dist/introspect/nullability.js +354 -0
- package/dist/introspect/nullability.js.map +1 -0
- package/dist/type-map.d.ts +42 -14
- package/dist/type-map.d.ts.map +1 -1
- package/package.json +10 -3
- package/src/bin.ts +5 -0
- package/src/client.ts +45 -77
- package/src/index.ts +14 -14
- package/src/introspect/cli.ts +138 -0
- package/src/introspect/emit.ts +168 -0
- package/src/introspect/index.ts +12 -0
- package/src/introspect/introspect.ts +221 -0
- package/src/introspect/nullability.ts +356 -0
- package/src/type-map.ts +42 -14
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nullability of view columns, derived from the view's query tree.
|
|
3
|
+
*
|
|
4
|
+
* Postgres records no NOT NULL information for view (or materialized view) columns. Its rewrite
|
|
5
|
+
* rule (`pg_rewrite.ev_action`, the `_RETURN` rule) holds the parsed query, though, and from
|
|
6
|
+
* PostgreSQL 16 every column reference in it carries `varnullingrels`, the outer joins that can
|
|
7
|
+
* null it. A view column is NOT NULL here only when its expression provably cannot be NULL: a
|
|
8
|
+
* NOT NULL table column that no outer join nulls, a non-NULL constant, a cast or a strict
|
|
9
|
+
* operator over such values, a CASE whose every branch is NOT NULL, `count(*)`, ... Anything
|
|
10
|
+
* else (function calls outside a short list, scalar subqueries, set-returning function columns)
|
|
11
|
+
* is nullable. On PostgreSQL 15 and older every column reference counts as nullable.
|
|
12
|
+
*
|
|
13
|
+
* This module has no imports so that scripts/pg-catalog-from-pg.mjs can load it with Node's
|
|
14
|
+
* type stripping.
|
|
15
|
+
*/
|
|
16
|
+
/** Tokens of the text form of a node tree (`outfuncs.c`). `[ … ]` datum bytes are skipped. */
|
|
17
|
+
function tokenize(s) {
|
|
18
|
+
const out = [];
|
|
19
|
+
let i = 0;
|
|
20
|
+
while (i < s.length) {
|
|
21
|
+
const c = s[i];
|
|
22
|
+
if (c === " " || c === "\n" || c === "\t") {
|
|
23
|
+
i++;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (c === "(" || c === ")" || c === "{" || c === "}") {
|
|
27
|
+
out.push(c);
|
|
28
|
+
i++;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (c === "[") {
|
|
32
|
+
i = s.indexOf("]", i) + 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (c === '"') {
|
|
36
|
+
let v = "";
|
|
37
|
+
i++;
|
|
38
|
+
while (i < s.length && s[i] !== '"') {
|
|
39
|
+
if (s[i] === "\\")
|
|
40
|
+
i++;
|
|
41
|
+
v += s[i++];
|
|
42
|
+
}
|
|
43
|
+
i++;
|
|
44
|
+
out.push({ str: v });
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
let v = "";
|
|
48
|
+
while (i < s.length && !" \n\t(){}".includes(s[i])) {
|
|
49
|
+
if (s[i] === "\\")
|
|
50
|
+
i++;
|
|
51
|
+
v += s[i++];
|
|
52
|
+
}
|
|
53
|
+
out.push(v);
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/** Parse a node tree into plain values: nodes as objects, lists as arrays, `<>` as null. */
|
|
58
|
+
export function parseNodeTree(text) {
|
|
59
|
+
const toks = tokenize(text);
|
|
60
|
+
let p = 0;
|
|
61
|
+
const isLabel = (t) => typeof t === "string" && t.startsWith(":");
|
|
62
|
+
const value = () => {
|
|
63
|
+
const t = toks[p++];
|
|
64
|
+
if (t === "{") {
|
|
65
|
+
const node = { _: toks[p++] };
|
|
66
|
+
while (p < toks.length && toks[p] !== "}") {
|
|
67
|
+
const label = toks[p++];
|
|
68
|
+
if (!isLabel(label))
|
|
69
|
+
continue; // a datum's length before its skipped bytes
|
|
70
|
+
if (toks[p] === "}" || isLabel(toks[p])) {
|
|
71
|
+
node[label.slice(1)] = null;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
node[label.slice(1)] = value();
|
|
75
|
+
}
|
|
76
|
+
p++;
|
|
77
|
+
return node;
|
|
78
|
+
}
|
|
79
|
+
if (t === "(") {
|
|
80
|
+
const list = [];
|
|
81
|
+
while (p < toks.length && toks[p] !== ")")
|
|
82
|
+
list.push(value());
|
|
83
|
+
p++;
|
|
84
|
+
return list;
|
|
85
|
+
}
|
|
86
|
+
if (t === undefined || t === "<>")
|
|
87
|
+
return null;
|
|
88
|
+
return typeof t === "object" ? t.str : t;
|
|
89
|
+
};
|
|
90
|
+
return value();
|
|
91
|
+
}
|
|
92
|
+
const list = (x) => (Array.isArray(x) ? x : []);
|
|
93
|
+
const node = (x) => (x !== null && typeof x === "object" && !Array.isArray(x) ? x : null);
|
|
94
|
+
const str = (x) => (typeof x === "string" ? x : null);
|
|
95
|
+
// ───────────────────────────── function knowledge ─────────────────────────────
|
|
96
|
+
/** `pg_catalog` functions that return a non-NULL value for non-NULL arguments. */
|
|
97
|
+
const NON_NULL_FUNCTIONS = new Set([
|
|
98
|
+
"current_database", "current_user", "session_user", "current_schema", "pg_get_userbyid", "pg_my_temp_schema",
|
|
99
|
+
"nameconcatoid", "pg_has_role", "has_table_privilege", "has_column_privilege", "has_any_column_privilege",
|
|
100
|
+
"has_function_privilege", "has_schema_privilege", "has_sequence_privilege", "has_type_privilege",
|
|
101
|
+
"pg_relation_is_updatable", "pg_column_is_updatable", "pg_is_other_temp_schema",
|
|
102
|
+
"now", "statement_timestamp", "transaction_timestamp", "clock_timestamp",
|
|
103
|
+
"lower", "upper", "length", "char_length", "octet_length", "concat", "concat_ws", "md5", "btrim", "ltrim", "rtrim",
|
|
104
|
+
"abs", "round", "trunc", "floor", "ceil", "ceiling", "date_trunc", "age",
|
|
105
|
+
]);
|
|
106
|
+
/** `pg_stat_get_*` accessors returning a number report 0 when no statistics exist, except these. */
|
|
107
|
+
const NULLABLE_STAT_FUNCTIONS = new Set([
|
|
108
|
+
"pg_stat_get_db_checksum_failures", "pg_stat_get_backend_pid", "pg_stat_get_backend_dbid", "pg_stat_get_backend_userid",
|
|
109
|
+
]);
|
|
110
|
+
const isNonNullStatFunction = (name, ret) => name.startsWith("pg_stat_get_") && (ret === "int8" || ret === "int4" || ret === "float8") && !NULLABLE_STAT_FUNCTIONS.has(name);
|
|
111
|
+
/** Aggregates that never return NULL. */
|
|
112
|
+
const NON_NULL_AGGREGATES = new Set(["count"]);
|
|
113
|
+
/** Window functions that never return NULL. */
|
|
114
|
+
const NON_NULL_WINDOW_FUNCTIONS = new Set(["count", "row_number", "rank", "dense_rank", "percent_rank", "cume_dist"]);
|
|
115
|
+
/**
|
|
116
|
+
* Set-returning functions in FROM and their output columns (1-based) that are never NULL. A
|
|
117
|
+
* strict set-returning function returns no rows for NULL arguments, so the arguments do not
|
|
118
|
+
* matter. `jsonb_each` values are `jsonb` (a JSON null is `'null'::jsonb`, not SQL NULL);
|
|
119
|
+
* the `_text` variants turn a JSON null into SQL NULL.
|
|
120
|
+
*/
|
|
121
|
+
const NON_NULL_SRF_COLUMNS = {
|
|
122
|
+
generate_series: [1], generate_subscripts: [1],
|
|
123
|
+
jsonb_each: [1, 2], json_each: [1, 2], jsonb_each_text: [1], json_each_text: [1],
|
|
124
|
+
jsonb_object_keys: [1], json_object_keys: [1], jsonb_array_elements: [1], json_array_elements: [1],
|
|
125
|
+
regexp_matches: [1], regexp_split_to_table: [1],
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* `pg_catalog` operators that can return NULL for non-NULL operands: JSON field and path access
|
|
129
|
+
* (a missing key) and jsonpath matches (an unknown result). Other built-in operators are strict
|
|
130
|
+
* and return a value for non-NULL operands; operators outside `pg_catalog` count as nullable.
|
|
131
|
+
*/
|
|
132
|
+
const NULLABLE_OPERATORS = new Set(["->", "->>", "#>", "#>>", "@@", "@?"]);
|
|
133
|
+
// ───────────────────────────── analysis ─────────────────────────────
|
|
134
|
+
/** Per-column NOT NULL of views and materialized views; caches what it reads. */
|
|
135
|
+
export class ViewNullability {
|
|
136
|
+
query;
|
|
137
|
+
options;
|
|
138
|
+
views = new Map();
|
|
139
|
+
atts = new Map();
|
|
140
|
+
procs = null;
|
|
141
|
+
operators = null;
|
|
142
|
+
constructor(query, options = {}) {
|
|
143
|
+
this.query = query;
|
|
144
|
+
this.options = options;
|
|
145
|
+
}
|
|
146
|
+
/** NOT NULL flags of the view's columns, in column order. `relid` is the view's `pg_class.oid`. */
|
|
147
|
+
notNull(relid) {
|
|
148
|
+
const key = String(relid);
|
|
149
|
+
let cached = this.views.get(key);
|
|
150
|
+
if (!cached) {
|
|
151
|
+
cached = this.analyze(key);
|
|
152
|
+
this.views.set(key, cached);
|
|
153
|
+
}
|
|
154
|
+
return cached;
|
|
155
|
+
}
|
|
156
|
+
async analyze(relid) {
|
|
157
|
+
const { rows } = await this.query(`SELECT r.ev_action, c.relname FROM pg_rewrite r JOIN pg_class c ON c.oid = r.ev_class
|
|
158
|
+
WHERE r.ev_class = $1 AND r.rulename = '_RETURN'`, [relid]);
|
|
159
|
+
const row = rows[0];
|
|
160
|
+
if (!row)
|
|
161
|
+
return [];
|
|
162
|
+
const query = node(list(parseNodeTree(row.ev_action))[0]);
|
|
163
|
+
if (!query)
|
|
164
|
+
return [];
|
|
165
|
+
const out = [];
|
|
166
|
+
for (const te of list(query["targetList"])) {
|
|
167
|
+
const entry = node(te);
|
|
168
|
+
if (!entry || entry["resjunk"] === "true")
|
|
169
|
+
continue;
|
|
170
|
+
const name = str(entry["resname"]) ?? "";
|
|
171
|
+
out.push((await this.expr(entry["expr"], query)) || (this.options.notNull?.(row.relname, name) ?? false));
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
loadProcs() {
|
|
176
|
+
this.procs ??= this.query(`SELECT p.oid::int8::text AS oid, p.proname AS name, t.typname AS ret, p.pronamespace = 'pg_catalog'::regnamespace AS system
|
|
177
|
+
FROM pg_proc p JOIN pg_type t ON t.oid = p.prorettype`).then(({ rows }) => new Map(rows.map((r) => [r.oid, r])));
|
|
178
|
+
return this.procs;
|
|
179
|
+
}
|
|
180
|
+
loadOperators() {
|
|
181
|
+
this.operators ??= this.query(`SELECT o.oid::int8::text AS oid, o.oprname AS name, '' AS ret, o.oprnamespace = 'pg_catalog'::regnamespace AS system
|
|
182
|
+
FROM pg_operator o`).then(({ rows }) => new Map(rows.map((r) => [r.oid, r])));
|
|
183
|
+
return this.operators;
|
|
184
|
+
}
|
|
185
|
+
/** A built-in operator that returns a value for non-NULL operands. */
|
|
186
|
+
async strictOperator(e) {
|
|
187
|
+
const op = (await this.loadOperators()).get(str(e["opno"]) ?? "");
|
|
188
|
+
return op?.system === true && !NULLABLE_OPERATORS.has(op.name);
|
|
189
|
+
}
|
|
190
|
+
columns(relid) {
|
|
191
|
+
let cached = this.atts.get(relid);
|
|
192
|
+
if (!cached) {
|
|
193
|
+
cached = this.query(
|
|
194
|
+
// NOT NULL: the column's constraint, or a NOT NULL domain anywhere in its domain chain.
|
|
195
|
+
`SELECT a.attnum, c.relkind,
|
|
196
|
+
a.attnotnull OR coalesce((
|
|
197
|
+
WITH RECURSIVE chain(oid, nn) AS (
|
|
198
|
+
SELECT t.oid, t.typnotnull FROM pg_type t WHERE t.oid = a.atttypid AND t.typtype = 'd'
|
|
199
|
+
UNION ALL
|
|
200
|
+
SELECT b.oid, b.typnotnull FROM chain JOIN pg_type d ON d.oid = chain.oid
|
|
201
|
+
JOIN pg_type b ON b.oid = d.typbasetype AND b.typtype = 'd')
|
|
202
|
+
SELECT bool_or(nn) FROM chain), false) AS notnull
|
|
203
|
+
FROM pg_attribute a JOIN pg_class c ON c.oid = a.attrelid
|
|
204
|
+
WHERE a.attrelid = $1 AND a.attnum > 0 AND NOT a.attisdropped`, [relid]).then(({ rows }) => rows);
|
|
205
|
+
this.atts.set(relid, cached);
|
|
206
|
+
}
|
|
207
|
+
return cached;
|
|
208
|
+
}
|
|
209
|
+
/** Is output column `attno` (1-based) of a (sub)query NOT NULL? */
|
|
210
|
+
async queryColumn(query, attno) {
|
|
211
|
+
if (query["setOperations"]) {
|
|
212
|
+
// UNION / INTERSECT / EXCEPT: every arm (a subquery in the range table) must be NOT NULL.
|
|
213
|
+
for (const r of list(query["rtable"])) {
|
|
214
|
+
const rte = node(r);
|
|
215
|
+
const sub = node(rte?.["subquery"]);
|
|
216
|
+
if (rte?.["rtekind"] === "1" && sub && !(await this.queryColumn(sub, attno)))
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
const entries = list(query["targetList"]).map(node).filter((t) => t !== null && t["resjunk"] !== "true");
|
|
222
|
+
const te = entries[attno - 1];
|
|
223
|
+
return te ? this.expr(te["expr"], query) : false;
|
|
224
|
+
}
|
|
225
|
+
async variable(v, query) {
|
|
226
|
+
// No varnullingrels (PostgreSQL ≤ 15): outer joins are not visible, so nothing is proven.
|
|
227
|
+
if (!("varnullingrels" in v) || v["varlevelsup"] !== "0")
|
|
228
|
+
return false;
|
|
229
|
+
if (list(v["varnullingrels"]).length > 1)
|
|
230
|
+
return false; // `(b 3)`: an outer join can null it
|
|
231
|
+
// ROLLUP / CUBE / GROUPING SETS null the grouped columns (PostgreSQL ≤ 17 does not mark them).
|
|
232
|
+
if (list(query["groupingSets"]).length > 0)
|
|
233
|
+
return false;
|
|
234
|
+
const rte = node(list(query["rtable"])[Number(v["varno"]) - 1]);
|
|
235
|
+
const attno = Number(v["varattno"]);
|
|
236
|
+
if (!rte || !(attno > 0))
|
|
237
|
+
return false;
|
|
238
|
+
switch (rte["rtekind"]) {
|
|
239
|
+
case "0": { // relation
|
|
240
|
+
const relid = str(rte["relid"]);
|
|
241
|
+
const att = (await this.columns(relid)).find((a) => a.attnum === attno);
|
|
242
|
+
if (!att)
|
|
243
|
+
return false;
|
|
244
|
+
if (att.relkind === "v" || att.relkind === "m")
|
|
245
|
+
return (await this.notNull(relid))[attno - 1] ?? false;
|
|
246
|
+
return att.notnull;
|
|
247
|
+
}
|
|
248
|
+
case "1": { // subquery
|
|
249
|
+
const sub = node(rte["subquery"]);
|
|
250
|
+
return sub ? this.queryColumn(sub, attno) : false;
|
|
251
|
+
}
|
|
252
|
+
case "2": // join alias variable
|
|
253
|
+
return this.expr(list(rte["joinaliasvars"])[attno - 1] ?? null, query);
|
|
254
|
+
case "3": // function in FROM
|
|
255
|
+
return this.functionColumn(rte, attno);
|
|
256
|
+
case "9": // PostgreSQL 18 GROUP BY expressions
|
|
257
|
+
return this.expr(list(rte["groupexprs"])[attno - 1] ?? null, query);
|
|
258
|
+
default:
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/** Column `attno` of a single set-returning function in FROM (`WITH ORDINALITY` adds a NOT NULL counter). */
|
|
263
|
+
async functionColumn(rte, attno) {
|
|
264
|
+
const functions = list(rte["functions"]);
|
|
265
|
+
const only = node(functions[0]);
|
|
266
|
+
if (functions.length !== 1 || !only)
|
|
267
|
+
return false;
|
|
268
|
+
const count = Number(str(only["funccolcount"]));
|
|
269
|
+
if (rte["funcordinality"] === "true" && attno === count + 1)
|
|
270
|
+
return true;
|
|
271
|
+
const call = node(only["funcexpr"]);
|
|
272
|
+
if (call?._ !== "FUNCEXPR")
|
|
273
|
+
return false;
|
|
274
|
+
const proc = (await this.loadProcs()).get(str(call["funcid"]) ?? "");
|
|
275
|
+
return proc?.system === true && (NON_NULL_SRF_COLUMNS[proc.name]?.includes(attno) ?? false);
|
|
276
|
+
}
|
|
277
|
+
async all(args, query) {
|
|
278
|
+
for (const a of list(args))
|
|
279
|
+
if (!(await this.expr(a, query)))
|
|
280
|
+
return false;
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
async expr(value, query) {
|
|
284
|
+
const e = node(value);
|
|
285
|
+
if (!e)
|
|
286
|
+
return false;
|
|
287
|
+
switch (e._) {
|
|
288
|
+
case "VAR":
|
|
289
|
+
return this.variable(e, query);
|
|
290
|
+
case "CONST":
|
|
291
|
+
return e["constisnull"] === "false";
|
|
292
|
+
case "RELABELTYPE":
|
|
293
|
+
case "COERCEVIAIO":
|
|
294
|
+
case "COERCETODOMAIN":
|
|
295
|
+
case "ARRAYCOERCEEXPR":
|
|
296
|
+
case "COLLATEEXPR":
|
|
297
|
+
return this.expr(e["arg"], query);
|
|
298
|
+
case "FUNCEXPR": {
|
|
299
|
+
if (e["funcretset"] !== "false")
|
|
300
|
+
return false;
|
|
301
|
+
const proc = (await this.loadProcs()).get(str(e["funcid"]) ?? "");
|
|
302
|
+
// format_type(type, typmod) is not strict: a NULL typmod still gives a name.
|
|
303
|
+
if (proc?.system && proc.name === "format_type")
|
|
304
|
+
return this.expr(list(e["args"])[0] ?? null, query);
|
|
305
|
+
// Explicit and implicit casts (funcformat 1, 2) keep a non-NULL input non-NULL.
|
|
306
|
+
const castLike = e["funcformat"] === "1" || e["funcformat"] === "2";
|
|
307
|
+
const known = proc?.system === true && (NON_NULL_FUNCTIONS.has(proc.name) || isNonNullStatFunction(proc.name, proc.ret));
|
|
308
|
+
return (castLike || known) && this.all(e["args"], query);
|
|
309
|
+
}
|
|
310
|
+
case "BOOLEXPR":
|
|
311
|
+
return this.all(e["args"], query);
|
|
312
|
+
case "OPEXPR":
|
|
313
|
+
return (await this.strictOperator(e)) && this.all(e["args"], query);
|
|
314
|
+
case "SCALARARRAYOPEXPR": {
|
|
315
|
+
// `x = ANY (arr)` is NULL when there is no match and `arr` holds a NULL: only an
|
|
316
|
+
// `ARRAY[…]` of NOT NULL elements is safe.
|
|
317
|
+
const [left, right] = list(e["args"]);
|
|
318
|
+
const array = node(right);
|
|
319
|
+
return (await this.strictOperator(e)) && array?._ === "ARRAYEXPR"
|
|
320
|
+
&& (await this.expr(left ?? null, query)) && this.all(array["elements"], query);
|
|
321
|
+
}
|
|
322
|
+
case "DISTINCTEXPR":
|
|
323
|
+
case "NULLTEST":
|
|
324
|
+
case "BOOLEANTEST":
|
|
325
|
+
case "ARRAYEXPR":
|
|
326
|
+
case "ROW":
|
|
327
|
+
return true;
|
|
328
|
+
case "COALESCEEXPR":
|
|
329
|
+
case "MINMAXEXPR":
|
|
330
|
+
for (const a of list(e["args"]))
|
|
331
|
+
if (await this.expr(a, query))
|
|
332
|
+
return true;
|
|
333
|
+
return false;
|
|
334
|
+
case "CASEEXPR":
|
|
335
|
+
for (const w of list(e["args"]))
|
|
336
|
+
if (!(await this.expr(node(w)?.["result"], query)))
|
|
337
|
+
return false;
|
|
338
|
+
return this.expr(e["defresult"], query);
|
|
339
|
+
case "SUBLINK": // EXISTS (0) and ARRAY (6) sublinks are never NULL
|
|
340
|
+
return e["subLinkType"] === "0" || e["subLinkType"] === "6";
|
|
341
|
+
case "AGGREF": {
|
|
342
|
+
const proc = (await this.loadProcs()).get(str(e["aggfnoid"]) ?? "");
|
|
343
|
+
return proc?.system === true && NON_NULL_AGGREGATES.has(proc.name);
|
|
344
|
+
}
|
|
345
|
+
case "WINDOWFUNC": {
|
|
346
|
+
const proc = (await this.loadProcs()).get(str(e["winfnoid"]) ?? "");
|
|
347
|
+
return proc?.system === true && NON_NULL_WINDOW_FUNCTIONS.has(proc.name);
|
|
348
|
+
}
|
|
349
|
+
default:
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=nullability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullability.js","sourceRoot":"","sources":["../../src/introspect/nullability.ts"],"names":[],"mappings":"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"}
|
package/dist/type-map.d.ts
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
import type { DefaultTypeMap } from "@typesql/core";
|
|
1
|
+
import type { DefaultParamTypeMap, DefaultTypeMap } from "@typesql/core";
|
|
2
2
|
/**
|
|
3
3
|
* The object node-postgres returns for an `interval` column (package `postgres-interval` 1.x,
|
|
4
4
|
* wired up by `pg-types`). Fields are only present when non-zero; `toPostgres()` renders the
|
|
5
5
|
* value back to Postgres syntax and `toISO()`/`toISOString()` produce an ISO 8601 duration.
|
|
6
|
+
*
|
|
7
|
+
* Written inline in `PgTypeMap` (this alias only reads it back), so row types stay plain
|
|
8
|
+
* object types: declaration emit in a package without a direct `@typesql/pg` dependency does
|
|
9
|
+
* not need to name `PgInterval` (TS2883).
|
|
6
10
|
*/
|
|
7
|
-
export
|
|
8
|
-
years?: number;
|
|
9
|
-
months?: number;
|
|
10
|
-
days?: number;
|
|
11
|
-
hours?: number;
|
|
12
|
-
minutes?: number;
|
|
13
|
-
seconds?: number;
|
|
14
|
-
milliseconds?: number;
|
|
15
|
-
toPostgres(): string;
|
|
16
|
-
toISO(): string;
|
|
17
|
-
toISOString(): string;
|
|
18
|
-
}
|
|
11
|
+
export type PgInterval = PgTypeMap["interval"];
|
|
19
12
|
/**
|
|
20
13
|
* Canonical Postgres type name → TS type as `pg` 8.x returns it with its default type
|
|
21
14
|
* parsers (`pg-types` 2.x, text protocol). Verified against `pg-types/lib/textParsers.js`:
|
|
@@ -50,13 +43,48 @@ export interface PgInterval {
|
|
|
50
43
|
* line[], lseg[], box[], path[], polygon[], int4range[], int8range[], tsrange[],
|
|
51
44
|
* tstzrange[], daterange[], macaddr8[], regclass[]/regtype[]/regproc[], record[].
|
|
52
45
|
* Register your own parser (`pg.types.setTypeParser`) or cast in SQL if you depend on these.
|
|
46
|
+
* The two that `PgCatalog` columns use are declared here as the text pg returns: `aclitem[]`
|
|
47
|
+
* (`relacl`, `datacl`, ...) and `"char"[]` (`proargmodes`).
|
|
53
48
|
*/
|
|
54
49
|
export interface PgTypeMap extends Omit<DefaultTypeMap, "bytea" | "interval" | "record" | "void"> {
|
|
50
|
+
/** What parameters accept on top of the row types. */
|
|
51
|
+
$params: PgParamTypeMap;
|
|
55
52
|
bytea: Buffer;
|
|
56
|
-
interval:
|
|
53
|
+
interval: {
|
|
54
|
+
years?: number;
|
|
55
|
+
months?: number;
|
|
56
|
+
days?: number;
|
|
57
|
+
hours?: number;
|
|
58
|
+
minutes?: number;
|
|
59
|
+
seconds?: number;
|
|
60
|
+
milliseconds?: number;
|
|
61
|
+
toPostgres(): string;
|
|
62
|
+
toISO(): string;
|
|
63
|
+
toISOString(): string;
|
|
64
|
+
};
|
|
57
65
|
/** Anonymous `ROW(...)` results have no parser: raw text such as `"(1,foo)"`. */
|
|
58
66
|
record: string;
|
|
59
67
|
/** `void`-returning functions (`pg_sleep`) yield an empty string. */
|
|
60
68
|
void: string;
|
|
69
|
+
/** No array parser: the raw `{...}` text, e.g. `"{postgres=arwdDxtm/postgres}"`. */
|
|
70
|
+
"aclitem[]": string;
|
|
71
|
+
/** No array parser for `"char"[]`: the raw `{...}` text, e.g. `"{i,o}"`. */
|
|
72
|
+
"char[]": string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* TS types `pg` parameters accept on top of the row type (`PgTypeMap["$params"]`). Verified
|
|
76
|
+
* against `pg/lib/utils.js` (`prepareValue`, 8.x): a `Date` is sent as a timestamp with the
|
|
77
|
+
* local offset, `Buffer`/typed arrays as bytea, a `bigint` or number with `toString()`, and
|
|
78
|
+
* objects with `toPostgres()` (such as `PgInterval`) through it; Postgres parses the text.
|
|
79
|
+
*
|
|
80
|
+
* int8, numeric, money number | bigint | string
|
|
81
|
+
* date, timestamp, timestamptz Date | string
|
|
82
|
+
* interval string, besides the `PgInterval` row type
|
|
83
|
+
* bytea Uint8Array, besides `Buffer`
|
|
84
|
+
*
|
|
85
|
+
* Plain objects are `JSON.stringify`d and arrays become Postgres array literals, so neither is
|
|
86
|
+
* listed for other types.
|
|
87
|
+
*/
|
|
88
|
+
export interface PgParamTypeMap extends DefaultParamTypeMap {
|
|
61
89
|
}
|
|
62
90
|
//# sourceMappingURL=type-map.d.ts.map
|
package/dist/type-map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-map.d.ts","sourceRoot":"","sources":["../src/type-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"type-map.d.ts","sourceRoot":"","sources":["../src/type-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/F,sDAAsD;IACtD,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,IAAI,MAAM,CAAC;QACrB,KAAK,IAAI,MAAM,CAAC;QAChB,WAAW,IAAI,MAAM,CAAC;KACvB,CAAC;IACF,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB;CAAG"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typesql/pg",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "node-postgres (pg) adapter for typesql.",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "node-postgres (pg) adapter for typesql, with `typesql introspect` to generate a schema from a live database.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -16,8 +16,15 @@
|
|
|
16
16
|
".": {
|
|
17
17
|
"types": "./dist/index.d.ts",
|
|
18
18
|
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./introspect": {
|
|
21
|
+
"types": "./dist/introspect/index.d.ts",
|
|
22
|
+
"default": "./dist/introspect/index.js"
|
|
19
23
|
}
|
|
20
24
|
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"typesql": "./dist/bin.js"
|
|
27
|
+
},
|
|
21
28
|
"files": [
|
|
22
29
|
"dist",
|
|
23
30
|
"src",
|
|
@@ -28,7 +35,7 @@
|
|
|
28
35
|
"access": "public"
|
|
29
36
|
},
|
|
30
37
|
"dependencies": {
|
|
31
|
-
"@typesql/core": "0.0
|
|
38
|
+
"@typesql/core": "0.1.0"
|
|
32
39
|
},
|
|
33
40
|
"peerDependencies": {
|
|
34
41
|
"pg": ">=8"
|