orez 0.4.73 → 0.5.2
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/README.md +42 -1
- package/dist/cf-do/cdc.d.ts +148 -0
- package/dist/cf-do/cdc.d.ts.map +1 -0
- package/dist/cf-do/cdc.js +719 -0
- package/dist/cf-do/cdc.js.map +1 -0
- package/dist/cf-do/row-undo.d.ts +36 -0
- package/dist/cf-do/row-undo.d.ts.map +1 -0
- package/dist/cf-do/row-undo.js +209 -0
- package/dist/cf-do/row-undo.js.map +1 -0
- package/dist/cf-do/tx-journal.d.ts +32 -10
- package/dist/cf-do/tx-journal.d.ts.map +1 -1
- package/dist/cf-do/tx-journal.js +148 -31
- package/dist/cf-do/tx-journal.js.map +1 -1
- package/dist/cf-do/watermark.d.ts +7 -0
- package/dist/cf-do/watermark.d.ts.map +1 -1
- package/dist/cf-do/watermark.js +9 -0
- package/dist/cf-do/watermark.js.map +1 -1
- package/dist/cf-do/worker.d.ts +19 -1
- package/dist/cf-do/worker.d.ts.map +1 -1
- package/dist/cf-do/worker.js +218 -46
- package/dist/cf-do/worker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +35 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/do-sql-tracking.d.ts +2 -0
- package/dist/do-sql-tracking.d.ts.map +1 -1
- package/dist/do-sql-tracking.js +11 -1
- package/dist/do-sql-tracking.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -40
- package/dist/index.js.map +1 -1
- package/dist/pg-proxy-do-backend.d.ts +8 -0
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +301 -47
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/pg-proxy.d.ts +22 -1
- package/dist/pg-proxy.d.ts.map +1 -1
- package/dist/pg-proxy.js +63 -1
- package/dist/pg-proxy.js.map +1 -1
- package/dist/pg-sqlite-compiler/index.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/index.js +9 -1
- package/dist/pg-sqlite-compiler/index.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/datetime.d.ts +2 -0
- package/dist/pg-sqlite-compiler/passes/datetime.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/passes/datetime.js +20 -18
- package/dist/pg-sqlite-compiler/passes/datetime.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/index.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/passes/index.js +6 -1
- package/dist/pg-sqlite-compiler/passes/index.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/json-functions.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/json-functions.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/json-functions.js +57 -0
- package/dist/pg-sqlite-compiler/passes/json-functions.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/row-json.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/row-json.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/row-json.js +230 -0
- package/dist/pg-sqlite-compiler/passes/row-json.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/schema.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/passes/schema.js +16 -1
- package/dist/pg-sqlite-compiler/passes/schema.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/string-functions.d.ts +11 -0
- package/dist/pg-sqlite-compiler/passes/string-functions.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/string-functions.js +37 -0
- package/dist/pg-sqlite-compiler/passes/string-functions.js.map +1 -0
- package/dist/worker/local-sql-backend.d.ts.map +1 -1
- package/dist/worker/local-sql-backend.js +114 -13
- package/dist/worker/local-sql-backend.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { walkAst } from './ast-utils.js';
|
|
2
|
+
function stringValue(node) {
|
|
3
|
+
return node?.String?.sval ?? node?.String?.str ?? null;
|
|
4
|
+
}
|
|
5
|
+
function functionName(func) {
|
|
6
|
+
const parts = func?.funcname;
|
|
7
|
+
if (!Array.isArray(parts) || parts.length === 0)
|
|
8
|
+
return null;
|
|
9
|
+
return stringValue(parts[parts.length - 1])?.toLowerCase() ?? null;
|
|
10
|
+
}
|
|
11
|
+
/** last name of a ColumnRef (e.g. `s.id` → `id`), or null for `*` / non-columns. */
|
|
12
|
+
function columnName(value) {
|
|
13
|
+
const fields = value?.ColumnRef?.fields;
|
|
14
|
+
if (!Array.isArray(fields) || fields.length === 0)
|
|
15
|
+
return null;
|
|
16
|
+
return stringValue(fields[fields.length - 1]);
|
|
17
|
+
}
|
|
18
|
+
/** true when the ColumnRef ends in `*` (bare `*` or qualified `t.*`). */
|
|
19
|
+
function isStarColumnRef(value) {
|
|
20
|
+
const fields = value?.ColumnRef?.fields;
|
|
21
|
+
if (!Array.isArray(fields) || fields.length === 0)
|
|
22
|
+
return false;
|
|
23
|
+
return fields[fields.length - 1]?.A_Star !== undefined;
|
|
24
|
+
}
|
|
25
|
+
/** qualifier of a `t.*` star (the `t`), or null for a bare `*`. */
|
|
26
|
+
function starQualifier(value) {
|
|
27
|
+
const fields = value?.ColumnRef?.fields;
|
|
28
|
+
if (!Array.isArray(fields) || fields.length < 2)
|
|
29
|
+
return null;
|
|
30
|
+
return stringValue(fields[0]);
|
|
31
|
+
}
|
|
32
|
+
/** gather every RangeVar reachable through a FROM clause, descending JoinExprs. */
|
|
33
|
+
function collectRangeVars(node, out) {
|
|
34
|
+
if (!node || typeof node !== 'object')
|
|
35
|
+
return;
|
|
36
|
+
if (Array.isArray(node)) {
|
|
37
|
+
for (const child of node)
|
|
38
|
+
collectRangeVars(child, out);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (node.RangeVar) {
|
|
42
|
+
out.push(node.RangeVar);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (node.JoinExpr) {
|
|
46
|
+
collectRangeVars(node.JoinExpr.larg, out);
|
|
47
|
+
collectRangeVars(node.JoinExpr.rarg, out);
|
|
48
|
+
}
|
|
49
|
+
// RangeSubselect etc. expose no schema-resolvable columns, so the caller
|
|
50
|
+
// declines when a star can't be expanded from a real table.
|
|
51
|
+
}
|
|
52
|
+
function stringNode(value) {
|
|
53
|
+
return { A_Const: { sval: { sval: value }, location: -1 } };
|
|
54
|
+
}
|
|
55
|
+
function columnNode(alias, column) {
|
|
56
|
+
return {
|
|
57
|
+
ColumnRef: {
|
|
58
|
+
fields: [{ String: { sval: alias } }, { String: { sval: column } }],
|
|
59
|
+
location: -1,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function decline(ctx, message) {
|
|
64
|
+
ctx.warnings.push({ kind: 'row-json-unsupported', message, near: 'row_to_json' });
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Expand a `*` / `t.*` star into the real column names of its source table,
|
|
69
|
+
* using the authoritative schema. Returns null (already warned) when the shape
|
|
70
|
+
* can't be proven, and never invents column names.
|
|
71
|
+
*/
|
|
72
|
+
function expandStar(fromClause, qualifier, ctx) {
|
|
73
|
+
let rv;
|
|
74
|
+
if (qualifier == null) {
|
|
75
|
+
// a bare `*` covers EVERY source in the FROM clause, so it is only
|
|
76
|
+
// resolvable when that clause is exactly one base table. A second table, a
|
|
77
|
+
// sub-select, a function, or a join contributes columns a single table's
|
|
78
|
+
// shape can't account for, and silently expanding just the one table would
|
|
79
|
+
// drop the rest. Decline instead of guessing.
|
|
80
|
+
rv =
|
|
81
|
+
Array.isArray(fromClause) && fromClause.length === 1
|
|
82
|
+
? fromClause[0]?.RangeVar
|
|
83
|
+
: undefined;
|
|
84
|
+
if (!rv) {
|
|
85
|
+
return decline(ctx, 'row_to_json over SELECT * needs the from clause to be a single known table');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// a qualified `t.*` names exactly one table, so it stays resolvable even
|
|
90
|
+
// amid other FROM sources — find that table wherever it sits.
|
|
91
|
+
const rangeVars = [];
|
|
92
|
+
collectRangeVars(fromClause, rangeVars);
|
|
93
|
+
rv = rangeVars.find((v) => (v.alias?.aliasname ?? v.relname) === qualifier);
|
|
94
|
+
if (!rv) {
|
|
95
|
+
return decline(ctx, `row_to_json star qualifier ${qualifier} matches no table`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const columns = ctx.schema.getTableColumns(rv.schemaname ?? 'public', rv.relname);
|
|
99
|
+
if (!columns || columns.length === 0) {
|
|
100
|
+
return decline(ctx, `row_to_json over ${rv.relname}.* needs schema info that is unavailable`);
|
|
101
|
+
}
|
|
102
|
+
return [...columns];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the output column names a subquery produces, so row_to_json can be
|
|
106
|
+
* rewritten to json_object() referencing real columns. Returns null (already
|
|
107
|
+
* warned) when the shape can't be proven. Any synthetic aliases it needs are
|
|
108
|
+
* applied to the subquery targets only on success, so a declined rewrite leaves
|
|
109
|
+
* the AST untouched.
|
|
110
|
+
*/
|
|
111
|
+
function resolveShape(subselect, ctx) {
|
|
112
|
+
const sub = subselect?.subquery?.SelectStmt;
|
|
113
|
+
const targets = sub?.targetList;
|
|
114
|
+
if (!Array.isArray(targets) || targets.length === 0) {
|
|
115
|
+
return decline(ctx, 'row_to_json subquery has no resolvable target list');
|
|
116
|
+
}
|
|
117
|
+
const resolvedTargets = [];
|
|
118
|
+
for (let i = 0; i < targets.length; i++) {
|
|
119
|
+
const target = targets[i]?.ResTarget;
|
|
120
|
+
if (!target)
|
|
121
|
+
return decline(ctx, 'row_to_json subquery has an unrecognized target');
|
|
122
|
+
// an explicit alias is already the real output column name
|
|
123
|
+
if (target.name) {
|
|
124
|
+
resolvedTargets.push({ target, columns: [target.name], needsAlias: false });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const val = target.val;
|
|
128
|
+
// `*` / `t.*`: expand from the authoritative table shape or decline
|
|
129
|
+
if (isStarColumnRef(val)) {
|
|
130
|
+
const expanded = expandStar(sub.fromClause, starQualifier(val), ctx);
|
|
131
|
+
if (!expanded)
|
|
132
|
+
return null;
|
|
133
|
+
resolvedTargets.push({ target, columns: expanded, needsAlias: false });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// a plain column reference already names its output column (`s.id` → `id`)
|
|
137
|
+
const named = columnName(val);
|
|
138
|
+
if (named) {
|
|
139
|
+
resolvedTargets.push({ target, columns: [named], needsAlias: false });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
resolvedTargets.push({ target, columns: [], needsAlias: true });
|
|
143
|
+
}
|
|
144
|
+
// The rewrite addresses each subquery column as `alias.<name>`, so the real
|
|
145
|
+
// (non-generated) output names must be unique or that reference is ambiguous:
|
|
146
|
+
// duplicate columns (a.id, b.id), duplicate explicit aliases, and a star that
|
|
147
|
+
// re-expands an explicitly-listed column all make two outputs share a name,
|
|
148
|
+
// and SQLite silently resolves the reference to just one, losing the other.
|
|
149
|
+
// SQLite matches column names case-insensitively, so compare case-folded.
|
|
150
|
+
// Decline before mutating any target so a declined rewrite leaves the AST
|
|
151
|
+
// untouched.
|
|
152
|
+
const usedNames = new Set();
|
|
153
|
+
for (const resolved of resolvedTargets) {
|
|
154
|
+
if (resolved.needsAlias)
|
|
155
|
+
continue;
|
|
156
|
+
for (const column of resolved.columns) {
|
|
157
|
+
const key = column.toLowerCase();
|
|
158
|
+
if (usedNames.has(key)) {
|
|
159
|
+
return decline(ctx, `row_to_json subquery has duplicate output column ${column}; cannot address it unambiguously`);
|
|
160
|
+
}
|
|
161
|
+
usedNames.add(key);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (let i = 0; i < resolvedTargets.length; i++) {
|
|
165
|
+
const resolved = resolvedTargets[i];
|
|
166
|
+
if (!resolved.needsAlias)
|
|
167
|
+
continue;
|
|
168
|
+
// an unnamed expression has no stable output name in SQLite. Give it a
|
|
169
|
+
// real alias that cannot collide with another target or expanded star.
|
|
170
|
+
let suffix = i + 1;
|
|
171
|
+
let generated = `_orez_col_${suffix}`;
|
|
172
|
+
while (usedNames.has(generated.toLowerCase()))
|
|
173
|
+
generated = `_orez_col_${++suffix}`;
|
|
174
|
+
resolved.target.name = generated;
|
|
175
|
+
resolved.columns = [generated];
|
|
176
|
+
usedNames.add(generated.toLowerCase());
|
|
177
|
+
}
|
|
178
|
+
return resolvedTargets.flatMap((target) => target.columns);
|
|
179
|
+
}
|
|
180
|
+
export const rowJsonPass = {
|
|
181
|
+
name: 'row-json',
|
|
182
|
+
run(rawStmt, ctx) {
|
|
183
|
+
walkAst(rawStmt, {
|
|
184
|
+
SelectStmt: (select) => {
|
|
185
|
+
const subselects = new Map();
|
|
186
|
+
for (const fromNode of select?.fromClause ?? []) {
|
|
187
|
+
const subselect = fromNode?.RangeSubselect;
|
|
188
|
+
const alias = subselect?.alias?.aliasname;
|
|
189
|
+
if (alias && subselect?.subquery?.SelectStmt) {
|
|
190
|
+
subselects.set(alias, subselect);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (subselects.size === 0)
|
|
194
|
+
return;
|
|
195
|
+
// resolve each referenced subquery shape at most once (and warn once)
|
|
196
|
+
const resolved = new Map();
|
|
197
|
+
const shapeFor = (alias) => {
|
|
198
|
+
if (!resolved.has(alias)) {
|
|
199
|
+
resolved.set(alias, resolveShape(subselects.get(alias), ctx));
|
|
200
|
+
}
|
|
201
|
+
return resolved.get(alias) ?? null;
|
|
202
|
+
};
|
|
203
|
+
walkAst(select.targetList ?? [], {
|
|
204
|
+
FuncCall: (func, parent, key) => {
|
|
205
|
+
if (functionName(func) !== 'row_to_json')
|
|
206
|
+
return;
|
|
207
|
+
const alias = columnName(func.args?.[0]);
|
|
208
|
+
if (!alias || !subselects.has(alias))
|
|
209
|
+
return;
|
|
210
|
+
const columns = shapeFor(alias);
|
|
211
|
+
if (!columns || columns.length === 0)
|
|
212
|
+
return;
|
|
213
|
+
parent[key] = {
|
|
214
|
+
FuncCall: {
|
|
215
|
+
funcname: [{ String: { sval: 'json_object' } }],
|
|
216
|
+
args: columns.flatMap((column) => [
|
|
217
|
+
stringNode(column),
|
|
218
|
+
columnNode(alias, column),
|
|
219
|
+
]),
|
|
220
|
+
funcformat: 'COERCE_EXPLICIT_CALL',
|
|
221
|
+
location: -1,
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=row-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-json.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/row-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAkFvC,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAkFvC,eAAO,MAAM,UAAU,EAAE,IAsCxB,CAAA"}
|
|
@@ -87,8 +87,23 @@ function flattenWriteTargetQualifiers(stmt) {
|
|
|
87
87
|
}
|
|
88
88
|
export const schemaPass = {
|
|
89
89
|
name: 'schema',
|
|
90
|
-
run(rawStmt) {
|
|
90
|
+
run(rawStmt, ctx) {
|
|
91
91
|
walkAst(rawStmt, {
|
|
92
|
+
AlterTableCmd: (node) => {
|
|
93
|
+
if (node.subtype !== 'AT_DropColumn' || !node.behavior)
|
|
94
|
+
return;
|
|
95
|
+
if (node.behavior === 'DROP_CASCADE') {
|
|
96
|
+
ctx.warnings.push({
|
|
97
|
+
kind: 'unsupported-alter-table-cascade',
|
|
98
|
+
message: 'SQLite DROP COLUMN does not support CASCADE',
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// PostgreSQL deparses its default DROP_RESTRICT behavior as an
|
|
103
|
+
// explicit RESTRICT clause. SQLite has the same restrictive default
|
|
104
|
+
// but rejects the keyword, so omit it from the emitted statement.
|
|
105
|
+
delete node.behavior;
|
|
106
|
+
},
|
|
92
107
|
SelectStmt: (node) => {
|
|
93
108
|
flattenSelectRangeVarQualifiers(node);
|
|
94
109
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Pass } from '../types.js';
|
|
2
|
+
/** Rewrite one libpg_query FuncCall to SQLite's ordinary trim functions. */
|
|
3
|
+
export declare function rewriteStringFunctionCall(node: any): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* PostgreSQL parses the SQL-standard TRIM forms as pg_catalog btrim/ltrim/rtrim
|
|
6
|
+
* calls with a special deparse format. That format emits `TRIM(BOTH FROM x)`,
|
|
7
|
+
* which SQLite rejects even though its trim functions have equivalent
|
|
8
|
+
* argument ordering. Emit ordinary SQLite function calls instead.
|
|
9
|
+
*/
|
|
10
|
+
export declare const stringFunctionsPass: Pass;
|
|
11
|
+
//# sourceMappingURL=string-functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-functions.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/string-functions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAavC,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAO5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,IASjC,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { walkAst } from './ast-utils.js';
|
|
2
|
+
function functionName(funcname) {
|
|
3
|
+
if (!funcname || funcname.length === 0)
|
|
4
|
+
return undefined;
|
|
5
|
+
const last = funcname[funcname.length - 1];
|
|
6
|
+
const value = last?.String?.sval ?? last?.String?.str;
|
|
7
|
+
return typeof value === 'string' ? value.toLowerCase() : undefined;
|
|
8
|
+
}
|
|
9
|
+
function stringNode(value) {
|
|
10
|
+
return { String: { sval: value } };
|
|
11
|
+
}
|
|
12
|
+
/** Rewrite one libpg_query FuncCall to SQLite's ordinary trim functions. */
|
|
13
|
+
export function rewriteStringFunctionCall(node) {
|
|
14
|
+
const name = functionName(node?.funcname);
|
|
15
|
+
if (name !== 'btrim' && name !== 'ltrim' && name !== 'rtrim')
|
|
16
|
+
return false;
|
|
17
|
+
node.funcname = [stringNode(name === 'btrim' ? 'trim' : name)];
|
|
18
|
+
node.funcformat = 'COERCE_EXPLICIT_CALL';
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* PostgreSQL parses the SQL-standard TRIM forms as pg_catalog btrim/ltrim/rtrim
|
|
23
|
+
* calls with a special deparse format. That format emits `TRIM(BOTH FROM x)`,
|
|
24
|
+
* which SQLite rejects even though its trim functions have equivalent
|
|
25
|
+
* argument ordering. Emit ordinary SQLite function calls instead.
|
|
26
|
+
*/
|
|
27
|
+
export const stringFunctionsPass = {
|
|
28
|
+
name: 'string-functions',
|
|
29
|
+
run(rawStmt, _ctx) {
|
|
30
|
+
walkAst(rawStmt, {
|
|
31
|
+
FuncCall: (node) => {
|
|
32
|
+
rewriteStringFunctionCall(node);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=string-functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-functions.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/string-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIxC,SAAS,YAAY,CAAC,QAA2B;IAC/C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,GAAG,CAAA;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CAAC,IAAS;IACjD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACzC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IAE1E,IAAI,CAAC,QAAQ,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9D,IAAI,CAAC,UAAU,GAAG,sBAAsB,CAAA;IACxC,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,IAAI,EAAE,kBAAkB;IACxB,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,OAAO,CAAC,OAAO,EAAE;YACf,QAAQ,EAAE,CAAC,IAAS,EAAE,EAAE;gBACtB,yBAAyB,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-sql-backend.d.ts","sourceRoot":"","sources":["../../src/worker/local-sql-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"local-sql-backend.d.ts","sourceRoot":"","sources":["../../src/worker/local-sql-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmBH,MAAM,WAAW,aAAa;IAC5B,IAAI,CACF,GAAG,EAAE,MAAM,EACX,GAAG,MAAM,EAAE,OAAO,EAAE,GACnB;QACD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACzC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KACvB,CAAA;IACD,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtE;;;;OAIG;IACH,2BAA2B,IAAI,MAAM,EAAE,CAAA;CACxC;AAiBD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CA4MvE"}
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* the upstream `postgres` db must NOT use this backend: it is shared with the
|
|
15
15
|
* app worker and lives in ZeroSqlDO.
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { TransactionalCdc } from '../cf-do/cdc.js';
|
|
18
|
+
import { appendPendingChange, deletePendingChanges, ensurePendingChangesTable, rollbackPendingChanges, } from '../cf-do/row-undo.js';
|
|
19
|
+
import { commitTxJournal, recoverTxJournal, rollbackTxJournal, snapshotSideEffectWriteTables, upgradeToTableSnapshot, } from '../cf-do/tx-journal.js';
|
|
18
20
|
export function createLocalSqlBackend(storage) {
|
|
19
21
|
const sqlite = storage;
|
|
20
22
|
if (!sqlite || typeof sqlite.exec !== 'function') {
|
|
@@ -34,36 +36,125 @@ export function createLocalSqlBackend(storage) {
|
|
|
34
36
|
};
|
|
35
37
|
},
|
|
36
38
|
};
|
|
39
|
+
const cdc = new TransactionalCdc(journalSql);
|
|
40
|
+
let pendingChangesReady = false;
|
|
41
|
+
function ensurePendingChanges() {
|
|
42
|
+
if (pendingChangesReady)
|
|
43
|
+
return;
|
|
44
|
+
ensurePendingChangesTable(journalSql);
|
|
45
|
+
pendingChangesReady = true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run work in a storage transaction, re-deriving the in-memory schema caches
|
|
49
|
+
* from SQLite if it aborts. transactionSync() rolls the SQLite side back on
|
|
50
|
+
* throw, but the caches are plain fields that would keep asserting state
|
|
51
|
+
* SQLite no longer has: a CDC table stays "registered and verified" with no
|
|
52
|
+
* trigger left on disk, and every later write to it goes silently uncaptured.
|
|
53
|
+
*/
|
|
54
|
+
function atomically(work) {
|
|
55
|
+
try {
|
|
56
|
+
return sql.transactionSync(work);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
pendingChangesReady = false;
|
|
60
|
+
// Reload is intentionally last: corrupt CDC metadata must throw rather
|
|
61
|
+
// than suppressing cache invalidation and silently disabling capture.
|
|
62
|
+
cdc.reload();
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
37
66
|
function executeStatement(statement) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
throw new Error('local sql backend: change tracking
|
|
67
|
+
const track = statement.track;
|
|
68
|
+
const transactionID = statement.transactionID || track?.transactionID;
|
|
69
|
+
if (track && !track.physicalTableName) {
|
|
70
|
+
throw new Error('local sql backend: change tracking requires a physical table name');
|
|
71
|
+
}
|
|
72
|
+
let snapshotsOwnStatement = false;
|
|
73
|
+
let captures = false;
|
|
74
|
+
if (track) {
|
|
75
|
+
if (!transactionID) {
|
|
76
|
+
throw new Error('local sql backend: rollback tracking requires a transaction id');
|
|
77
|
+
}
|
|
78
|
+
captures = cdc.ensureTable({
|
|
79
|
+
physicalTableName: track.physicalTableName,
|
|
80
|
+
tableName: track.tableName,
|
|
81
|
+
publish: false,
|
|
82
|
+
...(track.rowColumns?.length ? { columns: track.rowColumns } : null),
|
|
83
|
+
});
|
|
84
|
+
// DoBackend already marked this table row-journaled, betting the DO could
|
|
85
|
+
// capture before/after images for it. When it cannot, that marker promises
|
|
86
|
+
// a rollback nothing can perform, so take the table snapshot the journal
|
|
87
|
+
// would otherwise have taken, before the DML changes the table.
|
|
88
|
+
if (!captures) {
|
|
89
|
+
upgradeToTableSnapshot(journalSql, transactionID, track.physicalTableName);
|
|
90
|
+
}
|
|
91
|
+
snapshotsOwnStatement = snapshotSideEffectWriteTables(journalSql, transactionID, track.physicalTableName);
|
|
92
|
+
}
|
|
93
|
+
const suspended = cdc.beginSchemaChange(statement.sql);
|
|
94
|
+
let cursor;
|
|
95
|
+
try {
|
|
96
|
+
cursor = sql.exec(statement.sql, ...(statement.params ?? []));
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
cdc.finishSchemaChange(suspended);
|
|
42
100
|
}
|
|
43
|
-
const cursor = sql.exec(statement.sql, ...(statement.params ?? []));
|
|
44
101
|
const rows = cursor.toArray().map((row) => ({ ...row }));
|
|
45
102
|
const columns = Array.isArray(cursor.columnNames)
|
|
46
103
|
? cursor.columnNames
|
|
47
104
|
: rows.length > 0
|
|
48
105
|
? Object.keys(rows[0])
|
|
49
106
|
: [];
|
|
50
|
-
|
|
107
|
+
// Rollback-only triggers remain installed after a transaction ends. Drain
|
|
108
|
+
// them on every statement so an untracked autocommit write cannot sit in
|
|
109
|
+
// the buffer and get attached to (then undone by) the next transaction.
|
|
110
|
+
const captured = cdc.active ? cdc.drain() : [];
|
|
111
|
+
if (track && captured.length > 0) {
|
|
112
|
+
ensurePendingChanges();
|
|
113
|
+
for (const change of captured) {
|
|
114
|
+
appendPendingChange(journalSql, {
|
|
115
|
+
transactionID: transactionID,
|
|
116
|
+
physicalTableName: change.physicalTableName,
|
|
117
|
+
tableName: change.tableName,
|
|
118
|
+
publish: false,
|
|
119
|
+
op: change.op,
|
|
120
|
+
rowData: change.rowData,
|
|
121
|
+
oldData: change.oldData,
|
|
122
|
+
rowJournal: change.rowJournal,
|
|
123
|
+
oldJournal: change.oldJournal,
|
|
124
|
+
newRowid: change.newRowid,
|
|
125
|
+
oldRowid: change.oldRowid,
|
|
126
|
+
undoable: !snapshotsOwnStatement,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return track
|
|
131
|
+
? {
|
|
132
|
+
rows: track.returnRows ? rows : [],
|
|
133
|
+
columns: track.returnRows ? columns : [],
|
|
134
|
+
affectedRows: rows.length,
|
|
135
|
+
capturedChanges: 0,
|
|
136
|
+
}
|
|
137
|
+
: { rows, columns };
|
|
51
138
|
}
|
|
52
139
|
async function handle(request) {
|
|
53
140
|
const url = new URL(request.url);
|
|
54
141
|
const body = (await request.json().catch(() => ({})));
|
|
55
142
|
switch (url.pathname) {
|
|
56
143
|
case '/exec': {
|
|
57
|
-
const
|
|
144
|
+
const statement = {
|
|
58
145
|
sql: String(body.sql ?? ''),
|
|
59
146
|
params: Array.isArray(body.params) ? body.params : [],
|
|
60
147
|
track: body.track,
|
|
61
|
-
|
|
148
|
+
transactionID: String(body.transactionID || '') || undefined,
|
|
149
|
+
};
|
|
150
|
+
const result = body.track
|
|
151
|
+
? atomically(() => executeStatement(statement))
|
|
152
|
+
: executeStatement(statement);
|
|
62
153
|
return Response.json(result);
|
|
63
154
|
}
|
|
64
155
|
case '/batch': {
|
|
65
156
|
const statements = Array.isArray(body.statements) ? body.statements : [];
|
|
66
|
-
const results =
|
|
157
|
+
const results = atomically(() => statements
|
|
67
158
|
.map((statement) => typeof statement === 'string' ? { sql: statement } : statement)
|
|
68
159
|
.filter((statement) => statement?.sql?.trim())
|
|
69
160
|
.map((statement) => executeStatement(statement)));
|
|
@@ -73,14 +164,21 @@ export function createLocalSqlBackend(storage) {
|
|
|
73
164
|
const transactionID = String(body.transactionID || '');
|
|
74
165
|
if (!transactionID)
|
|
75
166
|
throw new Error('missing transactionID');
|
|
76
|
-
|
|
167
|
+
atomically(() => {
|
|
168
|
+
deletePendingChanges(journalSql, transactionID);
|
|
169
|
+
commitTxJournal(journalSql, transactionID);
|
|
170
|
+
});
|
|
77
171
|
return Response.json({ ok: true });
|
|
78
172
|
}
|
|
79
173
|
case '/rollback-tx': {
|
|
80
174
|
const transactionID = String(body.transactionID || '');
|
|
81
175
|
if (!transactionID)
|
|
82
176
|
throw new Error('missing transactionID');
|
|
83
|
-
|
|
177
|
+
atomically(() => {
|
|
178
|
+
rollbackPendingChanges(journalSql, transactionID);
|
|
179
|
+
rollbackTxJournal(journalSql, transactionID);
|
|
180
|
+
deletePendingChanges(journalSql, transactionID);
|
|
181
|
+
});
|
|
84
182
|
return Response.json({ ok: true });
|
|
85
183
|
}
|
|
86
184
|
default:
|
|
@@ -99,7 +197,10 @@ export function createLocalSqlBackend(storage) {
|
|
|
99
197
|
}
|
|
100
198
|
},
|
|
101
199
|
recoverOrphanedTransactions() {
|
|
102
|
-
return
|
|
200
|
+
return atomically(() => recoverTxJournal(journalSql, undefined, (transactionID) => {
|
|
201
|
+
rollbackPendingChanges(journalSql, transactionID);
|
|
202
|
+
deletePendingChanges(journalSql, transactionID);
|
|
203
|
+
}));
|
|
103
204
|
},
|
|
104
205
|
};
|
|
105
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-sql-backend.js","sourceRoot":"","sources":["../../src/worker/local-sql-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"local-sql-backend.js","sourceRoot":"","sources":["../../src/worker/local-sql-backend.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orez",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "PGlite-powered zero-sync development backend. No Docker required.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"@electric-sql/pglite": "0.4.1",
|
|
92
92
|
"@electric-sql/pglite-tools": "^0.3.1",
|
|
93
93
|
"@pgsql/traverse": "17.2.6",
|
|
94
|
-
"bedrock-sqlite": "0.
|
|
94
|
+
"bedrock-sqlite": "0.5.2",
|
|
95
95
|
"citty": "^0.2.0",
|
|
96
96
|
"pg-gateway": "0.3.0-beta.4",
|
|
97
97
|
"pgsql-parser": "^17.9.11",
|