pg-to-sqlite 0.5.20 → 0.5.21
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/dist/pg-sqlite-compiler/compiler.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/compiler.js +9 -3
- package/dist/pg-sqlite-compiler/compiler.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/array.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/array.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/array.js +223 -0
- package/dist/pg-sqlite-compiler/passes/array.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/index.d.ts +3 -0
- package/dist/pg-sqlite-compiler/passes/index.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/passes/index.js +2 -1
- package/dist/pg-sqlite-compiler/passes/index.js.map +1 -1
- package/dist/pg-sqlite-compiler/types.d.ts +9 -0
- package/dist/pg-sqlite-compiler/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/compiler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,YAAY,CAAA;AA0B3E,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM;gBADX,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,GAAG,EAAE,MAAM;CAKvB;AAYD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/compiler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,YAAY,CAAA;AA0B3E,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM;gBADX,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,GAAG,EAAE,MAAM;CAKvB;AAYD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,CA2C/E;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,GAAE,cAAmB,GACxB,aAAa,EAAE,CAEjB;AAED,YAAY,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAA"}
|
|
@@ -49,9 +49,10 @@ export function compile(pgSql, opts = {}) {
|
|
|
49
49
|
const version = opts.pgVersion ?? DEFAULT_VERSION;
|
|
50
50
|
const passes = opts.passes;
|
|
51
51
|
const warnings = [];
|
|
52
|
+
const arrayParamNumbers = new Set();
|
|
52
53
|
const trimmed = stripTrailingSemicolon(pgSql.trim());
|
|
53
54
|
if (!trimmed)
|
|
54
|
-
return { sql: '', warnings };
|
|
55
|
+
return { sql: '', warnings, arrayParamNumbers: [] };
|
|
55
56
|
// parseSync returns a ParseResult: { version, stmts: [{ stmt: {...} }, ...] }
|
|
56
57
|
const parsed = parseSync(trimmed);
|
|
57
58
|
const stmts = Array.isArray(parsed?.stmts) ? parsed.stmts : [];
|
|
@@ -59,20 +60,25 @@ export function compile(pgSql, opts = {}) {
|
|
|
59
60
|
const result = {
|
|
60
61
|
sql: trimmed,
|
|
61
62
|
warnings: [{ kind: 'parse-empty', message: 'no statements parsed' }],
|
|
63
|
+
arrayParamNumbers: [],
|
|
62
64
|
};
|
|
63
65
|
throwIfStrict(opts, result.warnings, result.sql);
|
|
64
66
|
return result;
|
|
65
67
|
}
|
|
66
68
|
// Run all passes on each top-level RawStmt entry (so passes can walk from root).
|
|
67
69
|
for (let i = 0; i < stmts.length; i++) {
|
|
68
|
-
runPasses(stmts[i], { schema, warnings, passes });
|
|
70
|
+
runPasses(stmts[i], { schema, warnings, passes, arrayParamNumbers });
|
|
69
71
|
}
|
|
70
72
|
throwIfStrict(opts, warnings, trimmed);
|
|
71
73
|
const quotedByMarker = markSQLiteKeywordIdentifiers(stmts);
|
|
72
74
|
const emitted = normalizeEscapeStringLiterals(restoreSQLiteKeywordIdentifierMarkers(deparseSync({ version: parsed.version ?? version, stmts }), quotedByMarker));
|
|
73
75
|
const sql = stripTrailingSemicolon(emitted.trim());
|
|
74
76
|
throwIfStrict(opts, warnings, sql);
|
|
75
|
-
return {
|
|
77
|
+
return {
|
|
78
|
+
sql,
|
|
79
|
+
warnings,
|
|
80
|
+
arrayParamNumbers: [...arrayParamNumbers].sort((a, b) => a - b),
|
|
81
|
+
};
|
|
76
82
|
}
|
|
77
83
|
export function compileMany(pgSqls, opts = {}) {
|
|
78
84
|
return pgSqls.map((s) => compile(s, opts));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EACL,4BAA4B,EAC5B,qCAAqC,GACtC,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,MAAM,eAAe,GAAG,MAAM,CAAA;AAE9B,MAAM,WAAW,GAAe;IAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;IACxB,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS;CACjC,CAAA;AAED,SAAS,sBAAsB,CAAC,CAAS;IACvC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,CAAC,EAAE,CAAA;IAChF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtB,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW;IAChD,8EAA8E;IAC9E,uEAAuE;IACvE,2EAA2E;IAC3E,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,IAAY,EAAE,EAAE;QACpE,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B;IACA;IAFX,YACW,QAAmC,EACnC,GAAW;QAEpB,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAA;QAH9D,aAAQ,GAAR,QAAQ,CAA2B;QACnC,QAAG,GAAH,GAAG,CAAQ;QAGpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAED,SAAS,aAAa,CACpB,IAAoB,EACpB,QAAmC,EACnC,GAAW;IAEX,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,OAAuB,EAAE;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAA;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,CAAA;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,MAAM,QAAQ,GAA8B,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/array.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,aAAa,CAAA;AA4LpD,eAAO,MAAM,SAAS,EAAE,IAsCvB,CAAA"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { walkAst } from './ast-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* PG's `col = ANY(<array>)` is the portable variable-length IN list: one bind
|
|
4
|
+
* slot holds the whole array, so callers don't have to build `IN ($1,$2,$3)`
|
|
5
|
+
* per call. SQLite has no ANY/ALL operator, so passing it through fails at
|
|
6
|
+
* prepare with "no such function: ANY" — the same shape as the json_agg gap.
|
|
7
|
+
*
|
|
8
|
+
* The rewrite mirrors what the DO proxy already does for its own SQL:
|
|
9
|
+
*
|
|
10
|
+
* col = ANY(<array>) → col IN (SELECT value FROM json_each(<array>))
|
|
11
|
+
* col <> ALL(<array>) → NOT (col IN (SELECT value FROM json_each(<array>)))
|
|
12
|
+
*
|
|
13
|
+
* json_each() reads a JSON array, so the operand has to arrive as JSON text:
|
|
14
|
+
*
|
|
15
|
+
* - ARRAY[...] / '{a,b}' literals are folded to a JSON string here.
|
|
16
|
+
* - a bind param can't be: its value shows up at execute, not compile. So we
|
|
17
|
+
* record its number in `arrayParamNumbers` and the caller JSON-encodes that
|
|
18
|
+
* slot. Everything else (a column already holding JSON text) passes through.
|
|
19
|
+
*
|
|
20
|
+
* `= ANY(SELECT …)` is a SubLink, not an A_Expr, and is left alone.
|
|
21
|
+
*/
|
|
22
|
+
function operatorName(expr) {
|
|
23
|
+
const parts = expr?.name;
|
|
24
|
+
if (!Array.isArray(parts) || parts.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const value = parts[parts.length - 1]?.String?.sval;
|
|
27
|
+
return typeof value === 'string' ? value : null;
|
|
28
|
+
}
|
|
29
|
+
function stringConst(value) {
|
|
30
|
+
return { A_Const: { sval: { sval: value } } };
|
|
31
|
+
}
|
|
32
|
+
/** `{a,"b c",NULL}` → ['a', 'b c', null]; null when not an array literal. */
|
|
33
|
+
function parsePgArrayLiteral(value) {
|
|
34
|
+
if (value[0] !== '{' || value[value.length - 1] !== '}')
|
|
35
|
+
return null;
|
|
36
|
+
const items = [];
|
|
37
|
+
let i = 1;
|
|
38
|
+
while (i < value.length - 1) {
|
|
39
|
+
if (value[i] === ',') {
|
|
40
|
+
i++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (value[i] === '"') {
|
|
44
|
+
i++;
|
|
45
|
+
let out = '';
|
|
46
|
+
while (i < value.length - 1) {
|
|
47
|
+
const ch = value[i];
|
|
48
|
+
if (ch === '\\') {
|
|
49
|
+
if (i + 1 < value.length - 1)
|
|
50
|
+
out += value[i + 1];
|
|
51
|
+
i += 2;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (ch === '"') {
|
|
55
|
+
i++;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
out += ch;
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
items.push(out);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const start = i;
|
|
65
|
+
while (i < value.length - 1 && value[i] !== ',')
|
|
66
|
+
i++;
|
|
67
|
+
const token = value.slice(start, i);
|
|
68
|
+
items.push(token === 'NULL' ? null : token);
|
|
69
|
+
}
|
|
70
|
+
return items;
|
|
71
|
+
}
|
|
72
|
+
const NON_LITERAL = Symbol('non-literal');
|
|
73
|
+
function literalValue(node) {
|
|
74
|
+
const constValue = node?.A_Const;
|
|
75
|
+
if (constValue) {
|
|
76
|
+
if (Object.hasOwn(constValue, 'isnull'))
|
|
77
|
+
return null;
|
|
78
|
+
if (Object.hasOwn(constValue, 'sval'))
|
|
79
|
+
return constValue.sval?.sval ?? '';
|
|
80
|
+
if (Object.hasOwn(constValue, 'ival'))
|
|
81
|
+
return constValue.ival?.ival ?? 0;
|
|
82
|
+
if (Object.hasOwn(constValue, 'fval')) {
|
|
83
|
+
const raw = constValue.fval?.fval ?? '';
|
|
84
|
+
const parsed = Number(raw);
|
|
85
|
+
return Number.isFinite(parsed) ? parsed : raw;
|
|
86
|
+
}
|
|
87
|
+
if (Object.hasOwn(constValue, 'boolval'))
|
|
88
|
+
return constValue.boolval?.boolval === true;
|
|
89
|
+
}
|
|
90
|
+
if (node?.A_ArrayExpr)
|
|
91
|
+
return arrayLiteralValue(node.A_ArrayExpr);
|
|
92
|
+
return NON_LITERAL;
|
|
93
|
+
}
|
|
94
|
+
function arrayLiteralValue(arrayExpr) {
|
|
95
|
+
const values = [];
|
|
96
|
+
for (const element of arrayExpr?.elements ?? []) {
|
|
97
|
+
const value = literalValue(element);
|
|
98
|
+
if (value === NON_LITERAL)
|
|
99
|
+
return NON_LITERAL;
|
|
100
|
+
values.push(value);
|
|
101
|
+
}
|
|
102
|
+
return values;
|
|
103
|
+
}
|
|
104
|
+
/** Strip casts down to the node that carries the value (`$1::text[]` → `$1`). */
|
|
105
|
+
function unwrapTypeCast(node) {
|
|
106
|
+
let current = node;
|
|
107
|
+
while (current?.TypeCast)
|
|
108
|
+
current = current.TypeCast.arg;
|
|
109
|
+
return current;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Turn an ANY/ALL operand into something json_each() can read, recording the
|
|
113
|
+
* bind slot when the value only exists at execute time.
|
|
114
|
+
*/
|
|
115
|
+
function jsonArrayOperand(node, ctx) {
|
|
116
|
+
const inner = unwrapTypeCast(node);
|
|
117
|
+
const paramNumber = inner?.ParamRef?.number;
|
|
118
|
+
if (typeof paramNumber === 'number') {
|
|
119
|
+
ctx.arrayParamNumbers?.add(paramNumber);
|
|
120
|
+
return inner;
|
|
121
|
+
}
|
|
122
|
+
if (inner?.A_ArrayExpr) {
|
|
123
|
+
const values = arrayLiteralValue(inner.A_ArrayExpr);
|
|
124
|
+
if (values !== NON_LITERAL)
|
|
125
|
+
return stringConst(JSON.stringify(values));
|
|
126
|
+
return inner;
|
|
127
|
+
}
|
|
128
|
+
const literal = inner?.A_Const?.sval?.sval;
|
|
129
|
+
if (typeof literal === 'string') {
|
|
130
|
+
const items = parsePgArrayLiteral(literal);
|
|
131
|
+
if (items)
|
|
132
|
+
return stringConst(JSON.stringify(items));
|
|
133
|
+
}
|
|
134
|
+
return inner;
|
|
135
|
+
}
|
|
136
|
+
function jsonEachSelect(operand) {
|
|
137
|
+
return {
|
|
138
|
+
SelectStmt: {
|
|
139
|
+
targetList: [
|
|
140
|
+
{
|
|
141
|
+
ResTarget: {
|
|
142
|
+
val: { ColumnRef: { fields: [{ String: { sval: 'value' } }], location: -1 } },
|
|
143
|
+
location: -1,
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
fromClause: [
|
|
148
|
+
{
|
|
149
|
+
RangeFunction: {
|
|
150
|
+
functions: [
|
|
151
|
+
{
|
|
152
|
+
List: {
|
|
153
|
+
items: [
|
|
154
|
+
{
|
|
155
|
+
FuncCall: {
|
|
156
|
+
funcname: [{ String: { sval: 'json_each' } }],
|
|
157
|
+
args: [operand],
|
|
158
|
+
funcformat: 'COERCE_EXPLICIT_CALL',
|
|
159
|
+
location: -1,
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
limitOption: 'LIMIT_OPTION_DEFAULT',
|
|
171
|
+
op: 'SETOP_NONE',
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** `testexpr IN (SELECT value FROM json_each(operand))` */
|
|
176
|
+
function inJsonEach(testexpr, operand) {
|
|
177
|
+
return {
|
|
178
|
+
SubLink: {
|
|
179
|
+
subLinkType: 'ANY_SUBLINK',
|
|
180
|
+
testexpr,
|
|
181
|
+
subselect: jsonEachSelect(operand),
|
|
182
|
+
location: -1,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export const arrayPass = {
|
|
187
|
+
name: 'array',
|
|
188
|
+
run(rawStmt, ctx) {
|
|
189
|
+
walkAst(rawStmt, {
|
|
190
|
+
A_Expr: (node, parent, key) => {
|
|
191
|
+
if (!parent)
|
|
192
|
+
return;
|
|
193
|
+
const op = operatorName(node);
|
|
194
|
+
if (node.kind === 'AEXPR_OP_ANY' && op === '=') {
|
|
195
|
+
parent[key] = inJsonEach(node.lexpr, jsonArrayOperand(node.rexpr, ctx));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (node.kind === 'AEXPR_OP_ALL' && op === '<>') {
|
|
199
|
+
parent[key] = {
|
|
200
|
+
BoolExpr: {
|
|
201
|
+
boolop: 'NOT_EXPR',
|
|
202
|
+
args: [inJsonEach(node.lexpr, jsonArrayOperand(node.rexpr, ctx))],
|
|
203
|
+
location: -1,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// every other ANY/ALL operator (> ANY, <= ALL, LIKE ANY …) has no
|
|
209
|
+
// json_each equivalent that preserves semantics, so say so rather than
|
|
210
|
+
// emit SQL that dies at prepare.
|
|
211
|
+
if (node.kind === 'AEXPR_OP_ANY' || node.kind === 'AEXPR_OP_ALL') {
|
|
212
|
+
const form = node.kind === 'AEXPR_OP_ANY' ? 'ANY' : 'ALL';
|
|
213
|
+
ctx.warnings.push({
|
|
214
|
+
kind: 'unsupported-array-operator',
|
|
215
|
+
near: 'A_Expr',
|
|
216
|
+
message: `${op ?? '?'} ${form}(...) is not supported by pg-to-sqlite`,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/array.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* first (so other passes see SQLite-native type names), datetime runs after
|
|
7
7
|
* (function-form → SQLValueFunction), catalog rewrites last (after every
|
|
8
8
|
* other pass has stabilized).
|
|
9
|
+
*
|
|
10
|
+
* array runs ahead of types: it reads the operand's original `$1::text[]` cast
|
|
11
|
+
* to find the bind slot, and types would have already flattened that cast.
|
|
9
12
|
*/
|
|
10
13
|
import type { Pass, PassContext } from '../types.js';
|
|
11
14
|
export declare const DEFAULT_PASSES: Pass[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/index.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEpD,eAAO,MAAM,cAAc,EAAE,IAAI,EAehC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAc9D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { arrayPass } from './array.js';
|
|
1
2
|
import { catalogPass } from './catalog.js';
|
|
2
3
|
import { datetimePass } from './datetime.js';
|
|
3
4
|
import { dmlCtePass } from './dml-cte.js';
|
|
@@ -10,6 +11,7 @@ import { unsupportedPass } from './unsupported.js';
|
|
|
10
11
|
export const DEFAULT_PASSES = [
|
|
11
12
|
// structural rewrites first so later passes see the final statement shape
|
|
12
13
|
dmlCtePass,
|
|
14
|
+
arrayPass,
|
|
13
15
|
typesPass,
|
|
14
16
|
datetimePass,
|
|
15
17
|
stringFunctionsPass,
|
|
@@ -20,7 +22,6 @@ export const DEFAULT_PASSES = [
|
|
|
20
22
|
unsupportedPass,
|
|
21
23
|
// future:
|
|
22
24
|
// castPass,
|
|
23
|
-
// arrayPass,
|
|
24
25
|
// insertPass,
|
|
25
26
|
];
|
|
26
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAgBlD,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,0EAA0E;IAC1E,UAAU;IACV,SAAS;IACT,SAAS;IACT,YAAY;IACZ,mBAAmB;IACnB,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,UAAU;IACV,eAAe;IACf,UAAU;IACV,cAAc;IACd,gBAAgB;CACjB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,OAAY,EAAE,GAAgB;IACtD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,OAAO,CAAA;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,cAAc,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,WAAW,GAAG,CAAC,OAAO,EAAE;aACnD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -30,6 +30,13 @@ export interface CompileWarning {
|
|
|
30
30
|
export interface CompileResult {
|
|
31
31
|
sql: string;
|
|
32
32
|
warnings: CompileWarning[];
|
|
33
|
+
/**
|
|
34
|
+
* 1-based numbers of the `$n` slots that were an array operand of ANY/ALL.
|
|
35
|
+
* The emitted SQL reads them with json_each(), so the caller must bind these
|
|
36
|
+
* as JSON array text (`JSON.stringify(value)`) instead of a PG array literal.
|
|
37
|
+
* Empty when the statement binds no array params.
|
|
38
|
+
*/
|
|
39
|
+
arrayParamNumbers: number[];
|
|
33
40
|
}
|
|
34
41
|
export interface CompileOptions {
|
|
35
42
|
schema?: SchemaInfo;
|
|
@@ -43,6 +50,8 @@ export interface CompileOptions {
|
|
|
43
50
|
export interface PassContext {
|
|
44
51
|
schema: SchemaInfo;
|
|
45
52
|
warnings: CompileWarning[];
|
|
53
|
+
/** Collects bind slots that must be encoded as JSON array text. */
|
|
54
|
+
arrayParamNumbers?: Set<number>;
|
|
46
55
|
/**
|
|
47
56
|
* Optional pass list — if set, runPasses uses these instead of the default
|
|
48
57
|
* pipeline. Otherwise the full default pipeline runs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,wEAAwE;IACxE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAEhF,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAE/C,sCAAsC;IACtC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IAEpD,0EAA0E;IAC1E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;CAC9E;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,cAAc,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,wEAAwE;IACxE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAEhF,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAE/C,sCAAsC;IACtC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IAEpD,0EAA0E;IAC1E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;CAC9E;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAA;CAChB;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAE/B;;;OAGG;IACH,MAAM,CAAC,EAAE,IAAI,EAAE,CAAA;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1C"}
|