@rocicorp/zero 1.10.0-canary.13 → 1.10.0-canary.15

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.
Files changed (62) hide show
  1. package/out/zero/package.js +1 -1
  2. package/out/zero/package.js.map +1 -1
  3. package/out/zero-cache/src/db/create.d.ts.map +1 -1
  4. package/out/zero-cache/src/db/create.js +4 -1
  5. package/out/zero-cache/src/db/create.js.map +1 -1
  6. package/out/zero-cache/src/db/index-predicate.d.ts +4 -0
  7. package/out/zero-cache/src/db/index-predicate.d.ts.map +1 -0
  8. package/out/zero-cache/src/db/index-predicate.js +46 -0
  9. package/out/zero-cache/src/db/index-predicate.js.map +1 -0
  10. package/out/zero-cache/src/db/lite-tables.d.ts +10 -2
  11. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  12. package/out/zero-cache/src/db/lite-tables.js +8 -3
  13. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  14. package/out/zero-cache/src/db/specs.d.ts +41 -0
  15. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  16. package/out/zero-cache/src/db/specs.js +30 -3
  17. package/out/zero-cache/src/db/specs.js.map +1 -1
  18. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +34 -2
  19. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  20. package/out/zero-cache/src/services/change-source/pg/change-source.js +34 -8
  21. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  22. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  23. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +2 -1
  24. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  25. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1512 -228
  26. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  27. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +19 -0
  28. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -0
  29. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +521 -0
  30. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -0
  31. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  32. package/out/zero-cache/src/services/change-source/pg/schema/init.js +9 -0
  33. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  34. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +136 -19
  35. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  36. package/out/zero-cache/src/services/change-source/pg/schema/published.js +80 -12
  37. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  38. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +126 -19
  39. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  40. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +1 -1
  41. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  42. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +2 -0
  43. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  44. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -0
  45. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  46. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +1 -0
  47. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  48. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  49. package/out/zero-cache/src/services/replicator/change-processor.js +16 -16
  50. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  51. package/out/zero-client/src/client/version.js +1 -1
  52. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  53. package/out/zqlite/src/query-builder.js +2 -1
  54. package/out/zqlite/src/query-builder.js.map +1 -1
  55. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  56. package/out/zqlite/src/sqlite-stat-fanout.js +1 -0
  57. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  58. package/out/zqlite/src/table-source.d.ts +1 -1
  59. package/out/zqlite/src/table-source.d.ts.map +1 -1
  60. package/out/zqlite/src/table-source.js +2 -1
  61. package/out/zqlite/src/table-source.js.map +1 -1
  62. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ddl.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAC5D,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAU7E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAkBlC,eAAO,MAAM,cAAc;;;;;;;;;;aAgBzB,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAc9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAU/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAIpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAIlC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAYtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,WAAW,UAwM/D;AAGD,eAAO,MAAM,IAAI,2HAQP,CAAC;AAEX,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,WAAW,UAoC9D;AAGD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,UAMzB"}
1
+ {"version":3,"file":"ddl.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { IndexPredicate, PublishedTableSpec } from '../../../../db/specs.ts';
2
+ export declare const unsupportedPredicateReasons: readonly ["unpublished-column", "unsupported-type", "unsupported-operator", "unsupported-function", "unsupported-cast", "unsupported-syntax", "non-deterministic-collation"];
3
+ export type UnsupportedPredicateReason = (typeof unsupportedPredicateReasons)[number];
4
+ export type PredicateTranslation = {
5
+ readonly supported: true;
6
+ readonly predicate: IndexPredicate;
7
+ } | {
8
+ readonly supported: false;
9
+ readonly reason: UnsupportedPredicateReason;
10
+ };
11
+ type PredicateColumnSpec = PublishedTableSpec['columns'][string] & {
12
+ readonly collationIsDeterministic?: boolean | null | undefined;
13
+ };
14
+ type PredicateTableSpec = Omit<PublishedTableSpec, 'columns'> & {
15
+ readonly columns: Readonly<Record<string, PredicateColumnSpec>>;
16
+ };
17
+ export declare function translatePostgresIndexPredicate(sql: string, table: PredicateTableSpec): PredicateTranslation;
18
+ export {};
19
+ //# sourceMappingURL=index-predicate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-predicate.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/index-predicate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAkBjC,eAAO,MAAM,2BAA2B,8KAQ9B,CAAC;AAEX,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,oBAAoB,GAC5B;IAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;CAAC,GAC9D;IAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAA;CAAC,CAAC;AAE7E,KAAK,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG;IACjE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;CAChE,CAAC;AAEF,KAAK,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAG;IAC9D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;CACjE,CAAC;AAgEF,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,kBAAkB,GACxB,oBAAoB,CAetB"}
@@ -0,0 +1,521 @@
1
+ //#region ../zero-cache/src/services/change-source/pg/schema/index-predicate.ts
2
+ var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
3
+ var INTEGER_RE = /^[+-]?\d+$/;
4
+ var WHITESPACE_RE = /\s/;
5
+ var OPERATOR_TOKEN_RE = /^(?:::|<>|!=|<=|>=|=|<|>)/;
6
+ var INTEGER_TOKEN_RE = /^[+-]?\d+/;
7
+ var WORD_TOKEN_RE = /^[A-Za-z_][A-Za-z0-9_$]*/;
8
+ var SIMPLE_ESCAPES = {
9
+ b: "\b",
10
+ f: "\f",
11
+ n: "\n",
12
+ r: "\r",
13
+ t: " ",
14
+ v: "\v"
15
+ };
16
+ var UnsupportedPredicateError = class extends Error {
17
+ reason;
18
+ constructor(reason) {
19
+ super(reason);
20
+ this.reason = reason;
21
+ }
22
+ };
23
+ function translatePostgresIndexPredicate(sql, table) {
24
+ try {
25
+ const parser = new Parser(tokenize(sql));
26
+ const expression = parser.parse();
27
+ parser.expect("EOF");
28
+ return {
29
+ supported: true,
30
+ predicate: normalize(expression, table)
31
+ };
32
+ } catch (error) {
33
+ return {
34
+ supported: false,
35
+ reason: error instanceof UnsupportedPredicateError ? error.reason : "unsupported-syntax"
36
+ };
37
+ }
38
+ }
39
+ var Parser = class {
40
+ #tokens;
41
+ #position = 0;
42
+ constructor(tokens) {
43
+ this.#tokens = tokens;
44
+ }
45
+ parse() {
46
+ return this.#parseOr();
47
+ }
48
+ #parseOr() {
49
+ const expressions = [this.#parseAnd()];
50
+ while (this.#take("OR")) expressions.push(this.#parseAnd());
51
+ return expressions.length === 1 ? expressions[0] : {
52
+ type: "or",
53
+ expressions
54
+ };
55
+ }
56
+ #parseAnd() {
57
+ const expressions = [this.#parseNot()];
58
+ while (this.#take("AND")) expressions.push(this.#parseNot());
59
+ return expressions.length === 1 ? expressions[0] : {
60
+ type: "and",
61
+ expressions
62
+ };
63
+ }
64
+ #parseNot() {
65
+ if (this.#take("NOT")) return {
66
+ type: "not",
67
+ expression: this.#parseNot()
68
+ };
69
+ return this.#parseComparison();
70
+ }
71
+ #parseComparison() {
72
+ const left = this.#parseOperand();
73
+ if (this.#take("IS")) {
74
+ const not = this.#take("NOT");
75
+ const token = this.#tokens[this.#position++];
76
+ if (token?.type !== "literal" || token.literalType !== "null") throw new UnsupportedPredicateError("unsupported-operator");
77
+ return {
78
+ type: "null-test",
79
+ expression: left,
80
+ not
81
+ };
82
+ }
83
+ const op = this.#tokens[this.#position]?.type;
84
+ if (isComparison(op)) {
85
+ this.#position++;
86
+ return {
87
+ type: "comparison",
88
+ left,
89
+ op,
90
+ right: this.#parseOperand()
91
+ };
92
+ }
93
+ const next = this.#tokens[this.#position];
94
+ if (next?.type === "identifier" && next.value.toUpperCase() === "COLLATE") throw new UnsupportedPredicateError("non-deterministic-collation");
95
+ if (next?.type === "identifier" && unsupportedOperatorWords.has(next.value.toUpperCase())) throw new UnsupportedPredicateError("unsupported-operator");
96
+ return left;
97
+ }
98
+ #parseOperand() {
99
+ let expression = this.#parsePrimary();
100
+ while (this.#take("::")) expression = {
101
+ type: "cast",
102
+ expression,
103
+ cast: this.#parseCastName()
104
+ };
105
+ return expression;
106
+ }
107
+ #parsePrimary() {
108
+ if (this.#take("(")) {
109
+ const expression = this.#parseOr();
110
+ this.expect(")");
111
+ return expression;
112
+ }
113
+ const token = this.#tokens[this.#position++];
114
+ if (token?.type === "literal") return {
115
+ type: "literal",
116
+ value: token.value,
117
+ literalType: token.literalType
118
+ };
119
+ if (token?.type === "identifier") {
120
+ if (this.#tokens[this.#position]?.type === "(") throw new UnsupportedPredicateError("unsupported-function");
121
+ if (this.#tokens[this.#position]?.type === ".") throw new UnsupportedPredicateError("unsupported-syntax");
122
+ if (token.value.toUpperCase() === "COLLATE") throw new UnsupportedPredicateError("non-deterministic-collation");
123
+ return {
124
+ type: "column",
125
+ name: token.value
126
+ };
127
+ }
128
+ throw new UnsupportedPredicateError("unsupported-syntax");
129
+ }
130
+ #parseCastName() {
131
+ const first = this.#expectIdentifier();
132
+ const parts = [first];
133
+ while (this.#take(".")) parts.push(this.#expectIdentifier());
134
+ const next = this.#tokens[this.#position];
135
+ if (first.toLowerCase() === "character" && next?.type === "identifier" && next.value.toLowerCase() === "varying") parts.push(this.#expectIdentifier());
136
+ if (this.#tokens[this.#position]?.type === "(") throw new UnsupportedPredicateError("unsupported-cast");
137
+ return parts.join(".");
138
+ }
139
+ #expectIdentifier() {
140
+ const token = this.#tokens[this.#position++];
141
+ if (token?.type !== "identifier") throw new UnsupportedPredicateError("unsupported-cast");
142
+ return token.value;
143
+ }
144
+ #take(type) {
145
+ if (this.#tokens[this.#position]?.type !== type) return false;
146
+ this.#position++;
147
+ return true;
148
+ }
149
+ expect(type) {
150
+ if (!this.#take(type)) throw new UnsupportedPredicateError("unsupported-syntax");
151
+ }
152
+ };
153
+ var unsupportedOperatorWords = new Set([
154
+ "ALL",
155
+ "ANY",
156
+ "BETWEEN",
157
+ "ILIKE",
158
+ "IN",
159
+ "LIKE",
160
+ "SIMILAR"
161
+ ]);
162
+ function normalize(expression, table) {
163
+ switch (expression.type) {
164
+ case "and":
165
+ case "or": {
166
+ const conditions = expression.expressions.map((expr) => normalize(expr, table));
167
+ return {
168
+ type: expression.type,
169
+ conditions: conditions.flatMap((condition) => condition.type === expression.type ? condition.conditions : [condition])
170
+ };
171
+ }
172
+ case "not": {
173
+ const booleanColumn = resolveBareBooleanColumn(expression.expression, table);
174
+ if (booleanColumn) return booleanComparison(booleanColumn, false);
175
+ return {
176
+ type: "not",
177
+ condition: normalize(expression.expression, table)
178
+ };
179
+ }
180
+ case "column": {
181
+ const column = resolveColumn(expression, table);
182
+ if (column.category !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
183
+ return booleanComparison(column.name, true);
184
+ }
185
+ case "cast": {
186
+ const column = resolveColumnOperand(expression, table);
187
+ if (column.category !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
188
+ return booleanComparison(column.name, true);
189
+ }
190
+ case "null-test": return {
191
+ type: "null-test",
192
+ column: resolveNullTestColumn(expression.expression, table),
193
+ op: expression.not ? "IS NOT NULL" : "IS NULL"
194
+ };
195
+ case "comparison": return normalizeComparison(expression, table);
196
+ case "literal": throw new UnsupportedPredicateError("unsupported-syntax");
197
+ }
198
+ }
199
+ function resolveNullTestColumn(expression, table) {
200
+ if (expression.type === "cast") return resolveColumnOperand(expression, table).name;
201
+ if (expression.type === "column" && !table.columns[expression.name]) throw new UnsupportedPredicateError("unpublished-column");
202
+ if (expression.type === "column") return expression.name;
203
+ throw new UnsupportedPredicateError("unsupported-syntax");
204
+ }
205
+ function resolveBareBooleanColumn(expression, table) {
206
+ if (expression.type !== "column" && expression.type !== "cast") return;
207
+ const column = resolveColumnOperand(expression, table);
208
+ return column.category === "boolean" ? column.name : void 0;
209
+ }
210
+ function booleanComparison(column, value) {
211
+ return {
212
+ type: "comparison",
213
+ column,
214
+ op: "=",
215
+ value: {
216
+ type: "boolean",
217
+ value
218
+ }
219
+ };
220
+ }
221
+ function normalizeComparison(expression, table) {
222
+ const column = resolveColumnOperand(expression.left, table);
223
+ const op = expression.op === "!=" ? "<>" : expression.op;
224
+ if (column.category !== "integer" && op !== "=" && op !== "<>") throw new UnsupportedPredicateError("unsupported-operator");
225
+ const value = resolveLiteral(expression.right, column);
226
+ return {
227
+ type: "comparison",
228
+ column: column.name,
229
+ op,
230
+ value
231
+ };
232
+ }
233
+ function resolveColumnOperand(expression, table) {
234
+ if (expression.type === "column") return resolveColumn(expression, table);
235
+ if (expression.type !== "cast") throw new UnsupportedPredicateError("unsupported-syntax");
236
+ const column = resolveColumnOperand(expression.expression, table);
237
+ const cast = canonicalTypeName(expression.cast);
238
+ switch (column.category) {
239
+ case "integer": {
240
+ const rank = integerRank(cast);
241
+ if (rank === void 0 || rank < column.rank) throw new UnsupportedPredicateError("unsupported-cast");
242
+ return {
243
+ ...column,
244
+ rank
245
+ };
246
+ }
247
+ case "text":
248
+ if (cast !== "text" && cast !== "varchar") throw new UnsupportedPredicateError("unsupported-cast");
249
+ return column;
250
+ case "boolean":
251
+ if (cast !== "bool") throw new UnsupportedPredicateError("unsupported-cast");
252
+ return column;
253
+ case "uuid":
254
+ if (cast !== "uuid") throw new UnsupportedPredicateError("unsupported-cast");
255
+ return column;
256
+ case "enum":
257
+ if (lastTypeName(expression.cast) !== column.enumName.toLowerCase()) throw new UnsupportedPredicateError("unsupported-cast");
258
+ return column;
259
+ }
260
+ }
261
+ function resolveColumn(expression, table) {
262
+ const spec = table.columns[expression.name];
263
+ if (!spec) throw new UnsupportedPredicateError("unpublished-column");
264
+ const dataType = canonicalTypeName(spec.dataType);
265
+ if (dataType === "bool") return {
266
+ category: "boolean",
267
+ name: expression.name
268
+ };
269
+ const rank = integerRank(dataType);
270
+ if (rank !== void 0) return {
271
+ category: "integer",
272
+ name: expression.name,
273
+ rank
274
+ };
275
+ if (dataType === "text" || dataType === "varchar") {
276
+ if (spec.collationIsDeterministic === false) throw new UnsupportedPredicateError("non-deterministic-collation");
277
+ return {
278
+ category: "text",
279
+ name: expression.name
280
+ };
281
+ }
282
+ if (dataType === "uuid") return {
283
+ category: "uuid",
284
+ name: expression.name
285
+ };
286
+ if (spec.pgTypeClass === "e") return {
287
+ category: "enum",
288
+ name: expression.name,
289
+ enumName: spec.dataType.toLowerCase()
290
+ };
291
+ throw new UnsupportedPredicateError("unsupported-type");
292
+ }
293
+ function resolveLiteral(expression, column) {
294
+ let literal = expression;
295
+ let cast;
296
+ while (literal.type === "cast") {
297
+ cast = literal.cast;
298
+ literal = literal.expression;
299
+ }
300
+ if (literal.type !== "literal" || literal.value === null) throw new UnsupportedPredicateError("unsupported-syntax");
301
+ switch (column.category) {
302
+ case "boolean":
303
+ validateLiteralCast(cast, new Set(["bool"]));
304
+ if (literal.literalType !== "boolean") throw new UnsupportedPredicateError("unsupported-type");
305
+ return {
306
+ type: "boolean",
307
+ value: literal.value
308
+ };
309
+ case "integer":
310
+ if (cast !== void 0) {
311
+ const castRank = integerRank(canonicalTypeName(cast));
312
+ if (castRank === void 0 || castRank > column.rank) throw new UnsupportedPredicateError("unsupported-cast");
313
+ }
314
+ if (literal.literalType !== "integer" && !(literal.literalType === "string" && cast !== void 0)) throw new UnsupportedPredicateError("unsupported-type");
315
+ return {
316
+ type: "integer",
317
+ value: canonicalInteger(String(literal.value), column.rank)
318
+ };
319
+ case "text":
320
+ validateLiteralCast(cast, new Set(["text", "varchar"]));
321
+ if (literal.literalType !== "string") throw new UnsupportedPredicateError("unsupported-type");
322
+ return {
323
+ type: "string",
324
+ value: String(literal.value)
325
+ };
326
+ case "enum":
327
+ if (cast !== void 0 && lastTypeName(cast) !== column.enumName.toLowerCase()) throw new UnsupportedPredicateError("unsupported-cast");
328
+ if (literal.literalType !== "string") throw new UnsupportedPredicateError("unsupported-type");
329
+ return {
330
+ type: "string",
331
+ value: String(literal.value)
332
+ };
333
+ case "uuid": {
334
+ validateLiteralCast(cast, new Set(["uuid"]));
335
+ const value = String(literal.value).toLowerCase();
336
+ if (literal.literalType !== "string" || !UUID_RE.test(value)) throw new UnsupportedPredicateError("unsupported-type");
337
+ return {
338
+ type: "string",
339
+ value
340
+ };
341
+ }
342
+ }
343
+ }
344
+ function validateLiteralCast(cast, allowed) {
345
+ if (cast !== void 0 && !allowed.has(canonicalTypeName(cast))) throw new UnsupportedPredicateError("unsupported-cast");
346
+ }
347
+ function canonicalInteger(value, rank) {
348
+ if (!INTEGER_RE.test(value)) throw new UnsupportedPredicateError("unsupported-type");
349
+ let integer;
350
+ try {
351
+ integer = BigInt(value);
352
+ } catch {
353
+ throw new UnsupportedPredicateError("unsupported-type");
354
+ }
355
+ const bounds = [
356
+ [-32768n, 32767n],
357
+ [-2147483648n, 2147483647n],
358
+ [-9223372036854775808n, 9223372036854775807n]
359
+ ];
360
+ if (integer < bounds[rank][0] || integer > bounds[rank][1]) throw new UnsupportedPredicateError("unsupported-type");
361
+ return integer.toString();
362
+ }
363
+ function canonicalTypeName(type) {
364
+ const name = lastTypeName(type).replace(/\s+/g, " ");
365
+ switch (name) {
366
+ case "boolean": return "bool";
367
+ case "smallint": return "int2";
368
+ case "integer": return "int4";
369
+ case "bigint": return "int8";
370
+ case "character varying": return "varchar";
371
+ default: return name;
372
+ }
373
+ }
374
+ function lastTypeName(type) {
375
+ return type.split(".").at(-1)?.toLowerCase() ?? "";
376
+ }
377
+ function integerRank(type) {
378
+ switch (type) {
379
+ case "int2": return 0;
380
+ case "int4": return 1;
381
+ case "int8": return 2;
382
+ default: return;
383
+ }
384
+ }
385
+ function isComparison(type) {
386
+ return type === "=" || type === "<>" || type === "!=" || type === "<" || type === "<=" || type === ">" || type === ">=";
387
+ }
388
+ function tokenize(sql) {
389
+ const tokens = [];
390
+ for (let i = 0; i < sql.length;) {
391
+ const char = sql[i];
392
+ if (WHITESPACE_RE.test(char)) {
393
+ i++;
394
+ continue;
395
+ }
396
+ if (char === "\"") {
397
+ const result = readQuoted(sql, i, "\"", false);
398
+ tokens.push({
399
+ type: "identifier",
400
+ value: result.value
401
+ });
402
+ i = result.end;
403
+ continue;
404
+ }
405
+ const escapeString = (char === "E" || char === "e") && sql[i + 1] === "'";
406
+ if (char === "'" || escapeString) {
407
+ const result = readQuoted(sql, i + (escapeString ? 1 : 0), "'", escapeString);
408
+ tokens.push({
409
+ type: "literal",
410
+ literalType: "string",
411
+ value: result.value
412
+ });
413
+ i = result.end;
414
+ continue;
415
+ }
416
+ const operator = OPERATOR_TOKEN_RE.exec(sql.slice(i))?.[0];
417
+ if (operator) {
418
+ tokens.push({ type: operator });
419
+ i += operator.length;
420
+ continue;
421
+ }
422
+ if (char === "(" || char === ")" || char === ".") {
423
+ tokens.push({ type: char });
424
+ i++;
425
+ continue;
426
+ }
427
+ const integer = INTEGER_TOKEN_RE.exec(sql.slice(i))?.[0];
428
+ if (integer) {
429
+ tokens.push({
430
+ type: "literal",
431
+ literalType: "integer",
432
+ value: integer
433
+ });
434
+ i += integer.length;
435
+ continue;
436
+ }
437
+ const word = WORD_TOKEN_RE.exec(sql.slice(i))?.[0];
438
+ if (word) {
439
+ const keyword = word.toUpperCase();
440
+ if (unsupportedOperatorWords.has(keyword)) throw new UnsupportedPredicateError("unsupported-operator");
441
+ if (keyword === "TRUE" || keyword === "FALSE") tokens.push({
442
+ type: "literal",
443
+ literalType: "boolean",
444
+ value: keyword === "TRUE"
445
+ });
446
+ else if (keyword === "NULL") tokens.push({
447
+ type: "literal",
448
+ literalType: "null",
449
+ value: null
450
+ });
451
+ else if (keyword === "AND" || keyword === "OR" || keyword === "NOT" || keyword === "IS") tokens.push({ type: keyword });
452
+ else tokens.push({
453
+ type: "identifier",
454
+ value: word.toLowerCase()
455
+ });
456
+ i += word.length;
457
+ continue;
458
+ }
459
+ tokens.push({
460
+ type: "unsupported",
461
+ value: char
462
+ });
463
+ i++;
464
+ }
465
+ tokens.push({ type: "EOF" });
466
+ return tokens;
467
+ }
468
+ function readQuoted(sql, start, quote, escapes) {
469
+ let value = "";
470
+ for (let i = start + 1; i < sql.length; i++) {
471
+ const char = sql[i];
472
+ if (char === quote) if (sql[i + 1] === quote) {
473
+ value += quote;
474
+ i++;
475
+ } else return {
476
+ value,
477
+ end: i + 1
478
+ };
479
+ else if (escapes && char === "\\") {
480
+ const escape = sql[++i];
481
+ if (escape === void 0) throw new UnsupportedPredicateError("unsupported-syntax");
482
+ if (escape === "x") {
483
+ const hex = readEscapeDigits(sql, i + 1, 2, 16, 1);
484
+ value += String.fromCharCode(hex.value);
485
+ i = hex.end - 1;
486
+ } else if (escape === "u" || escape === "U") {
487
+ const hex = readEscapeDigits(sql, i + 1, escape === "u" ? 4 : 8, 16);
488
+ try {
489
+ value += String.fromCodePoint(hex.value);
490
+ } catch {
491
+ throw new UnsupportedPredicateError("unsupported-syntax");
492
+ }
493
+ i = hex.end - 1;
494
+ } else if (escape >= "0" && escape <= "7") {
495
+ let octal = escape;
496
+ while (octal.length < 3 && sql[i + 1] !== void 0 && sql[i + 1] >= "0" && sql[i + 1] <= "7") octal += sql[++i];
497
+ value += String.fromCharCode(Number.parseInt(octal, 8));
498
+ } else if (escape === "\n") {} else if (escape === "\r" && sql[i + 1] === "\n") i++;
499
+ else value += SIMPLE_ESCAPES[escape] ?? escape;
500
+ } else value += char;
501
+ }
502
+ throw new UnsupportedPredicateError("unsupported-syntax");
503
+ }
504
+ function readEscapeDigits(sql, start, length, radix, minLength = length) {
505
+ let end = start;
506
+ while (end < start + length) {
507
+ const digit = sql[end];
508
+ if (digit === void 0 || !(digit >= "0" && digit <= "9" || digit.toLowerCase() >= "a" && digit.toLowerCase() <= "f")) break;
509
+ end++;
510
+ }
511
+ const digits = sql.slice(start, end);
512
+ if (digits.length < minLength) throw new UnsupportedPredicateError("unsupported-syntax");
513
+ return {
514
+ value: Number.parseInt(digits, radix),
515
+ end
516
+ };
517
+ }
518
+ //#endregion
519
+ export { translatePostgresIndexPredicate };
520
+
521
+ //# sourceMappingURL=index-predicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-predicate.js","names":["#tokens","#parseOr","#parseAnd","#take","#parseNot","#parseComparison","#parseOperand","#position","#parsePrimary","#parseCastName","#expectIdentifier"],"sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/index-predicate.ts"],"sourcesContent":["import * as PostgresTypeClass from '../../../../db/postgres-type-class-enum.ts';\nimport type {\n IndexPredicate,\n IndexPredicateValue,\n PublishedTableSpec,\n} from '../../../../db/specs.ts';\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\nconst INTEGER_RE = /^[+-]?\\d+$/;\nconst WHITESPACE_RE = /\\s/;\nconst OPERATOR_TOKEN_RE = /^(?:::|<>|!=|<=|>=|=|<|>)/;\nconst INTEGER_TOKEN_RE = /^[+-]?\\d+/;\nconst WORD_TOKEN_RE = /^[A-Za-z_][A-Za-z0-9_$]*/;\nconst SIMPLE_ESCAPES: Readonly<Record<string, string>> = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\v',\n};\n\nexport const unsupportedPredicateReasons = [\n 'unpublished-column',\n 'unsupported-type',\n 'unsupported-operator',\n 'unsupported-function',\n 'unsupported-cast',\n 'unsupported-syntax',\n 'non-deterministic-collation',\n] as const;\n\nexport type UnsupportedPredicateReason =\n (typeof unsupportedPredicateReasons)[number];\n\nexport type PredicateTranslation =\n | {readonly supported: true; readonly predicate: IndexPredicate}\n | {readonly supported: false; readonly reason: UnsupportedPredicateReason};\n\ntype PredicateColumnSpec = PublishedTableSpec['columns'][string] & {\n readonly collationIsDeterministic?: boolean | null | undefined;\n};\n\ntype PredicateTableSpec = Omit<PublishedTableSpec, 'columns'> & {\n readonly columns: Readonly<Record<string, PredicateColumnSpec>>;\n};\n\ntype Expr =\n | {readonly type: 'column'; readonly name: string}\n | {\n readonly type: 'literal';\n readonly value: boolean | string | null;\n readonly literalType: 'boolean' | 'integer' | 'string' | 'null';\n }\n | {readonly type: 'cast'; readonly expression: Expr; readonly cast: string}\n | {readonly type: 'not'; readonly expression: Expr}\n | {\n readonly type: 'and' | 'or';\n readonly expressions: readonly Expr[];\n }\n | {\n readonly type: 'comparison';\n readonly left: Expr;\n readonly op: '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=';\n readonly right: Expr;\n }\n | {\n readonly type: 'null-test';\n readonly expression: Expr;\n readonly not: boolean;\n };\n\ntype Token =\n | {readonly type: 'identifier'; readonly value: string}\n | {\n readonly type: 'literal';\n readonly value: boolean | string | null;\n readonly literalType: 'boolean' | 'integer' | 'string' | 'null';\n }\n | {\n readonly type:\n | '('\n | ')'\n | '.'\n | '::'\n | '='\n | '<>'\n | '!='\n | '<'\n | '<='\n | '>'\n | '>='\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IS'\n | 'EOF';\n }\n | {readonly type: 'unsupported'; readonly value: string};\n\nclass UnsupportedPredicateError extends Error {\n readonly reason: UnsupportedPredicateReason;\n\n constructor(reason: UnsupportedPredicateReason) {\n super(reason);\n this.reason = reason;\n }\n}\n\nexport function translatePostgresIndexPredicate(\n sql: string,\n table: PredicateTableSpec,\n): PredicateTranslation {\n try {\n const parser = new Parser(tokenize(sql));\n const expression = parser.parse();\n parser.expect('EOF');\n return {supported: true, predicate: normalize(expression, table)};\n } catch (error) {\n return {\n supported: false,\n reason:\n error instanceof UnsupportedPredicateError\n ? error.reason\n : 'unsupported-syntax',\n };\n }\n}\n\nclass Parser {\n readonly #tokens: readonly Token[];\n #position = 0;\n\n constructor(tokens: readonly Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): Expr {\n return this.#parseOr();\n }\n\n #parseOr(): Expr {\n const expressions = [this.#parseAnd()];\n while (this.#take('OR')) expressions.push(this.#parseAnd());\n return expressions.length === 1\n ? expressions[0]\n : {type: 'or', expressions};\n }\n\n #parseAnd(): Expr {\n const expressions = [this.#parseNot()];\n while (this.#take('AND')) expressions.push(this.#parseNot());\n return expressions.length === 1\n ? expressions[0]\n : {type: 'and', expressions};\n }\n\n #parseNot(): Expr {\n if (this.#take('NOT')) {\n return {type: 'not', expression: this.#parseNot()};\n }\n return this.#parseComparison();\n }\n\n #parseComparison(): Expr {\n const left = this.#parseOperand();\n if (this.#take('IS')) {\n const not = this.#take('NOT');\n const token = this.#tokens[this.#position++];\n if (token?.type !== 'literal' || token.literalType !== 'null') {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n return {type: 'null-test', expression: left, not};\n }\n const op = this.#tokens[this.#position]?.type;\n if (isComparison(op)) {\n this.#position++;\n return {\n type: 'comparison',\n left,\n op,\n right: this.#parseOperand(),\n };\n }\n const next = this.#tokens[this.#position];\n if (next?.type === 'identifier' && next.value.toUpperCase() === 'COLLATE') {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n if (\n next?.type === 'identifier' &&\n unsupportedOperatorWords.has(next.value.toUpperCase())\n ) {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n return left;\n }\n\n #parseOperand(): Expr {\n let expression = this.#parsePrimary();\n while (this.#take('::')) {\n expression = {\n type: 'cast',\n expression,\n cast: this.#parseCastName(),\n };\n }\n return expression;\n }\n\n #parsePrimary(): Expr {\n if (this.#take('(')) {\n const expression = this.#parseOr();\n this.expect(')');\n return expression;\n }\n const token = this.#tokens[this.#position++];\n if (token?.type === 'literal') {\n return {\n type: 'literal',\n value: token.value,\n literalType: token.literalType,\n };\n }\n if (token?.type === 'identifier') {\n if (this.#tokens[this.#position]?.type === '(') {\n throw new UnsupportedPredicateError('unsupported-function');\n }\n if (this.#tokens[this.#position]?.type === '.') {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n if (token.value.toUpperCase() === 'COLLATE') {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n return {type: 'column', name: token.value};\n }\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n\n #parseCastName(): string {\n const first = this.#expectIdentifier();\n const parts = [first];\n while (this.#take('.')) parts.push(this.#expectIdentifier());\n const next = this.#tokens[this.#position];\n if (\n first.toLowerCase() === 'character' &&\n next?.type === 'identifier' &&\n next.value.toLowerCase() === 'varying'\n ) {\n parts.push(this.#expectIdentifier());\n }\n if (this.#tokens[this.#position]?.type === '(') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return parts.join('.');\n }\n\n #expectIdentifier(): string {\n const token = this.#tokens[this.#position++];\n if (token?.type !== 'identifier') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return token.value;\n }\n\n #take(type: Token['type']): boolean {\n if (this.#tokens[this.#position]?.type !== type) return false;\n this.#position++;\n return true;\n }\n\n expect(type: Token['type']): void {\n if (!this.#take(type)) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n }\n}\n\nconst unsupportedOperatorWords = new Set([\n 'ALL',\n 'ANY',\n 'BETWEEN',\n 'ILIKE',\n 'IN',\n 'LIKE',\n 'SIMILAR',\n]);\n\nfunction normalize(\n expression: Expr,\n table: PredicateTableSpec,\n): IndexPredicate {\n switch (expression.type) {\n case 'and':\n case 'or': {\n const conditions = expression.expressions.map(expr =>\n normalize(expr, table),\n );\n return {\n type: expression.type,\n conditions: conditions.flatMap(condition =>\n condition.type === expression.type\n ? condition.conditions\n : [condition],\n ),\n };\n }\n case 'not': {\n const booleanColumn = resolveBareBooleanColumn(\n expression.expression,\n table,\n );\n if (booleanColumn) {\n return booleanComparison(booleanColumn, false);\n }\n return {type: 'not', condition: normalize(expression.expression, table)};\n }\n case 'column': {\n const column = resolveColumn(expression, table);\n if (column.category !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return booleanComparison(column.name, true);\n }\n case 'cast': {\n const column = resolveColumnOperand(expression, table);\n if (column.category !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return booleanComparison(column.name, true);\n }\n case 'null-test': {\n const column = resolveNullTestColumn(expression.expression, table);\n return {\n type: 'null-test',\n column,\n op: expression.not ? 'IS NOT NULL' : 'IS NULL',\n };\n }\n case 'comparison':\n return normalizeComparison(expression, table);\n case 'literal':\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n}\n\nfunction resolveNullTestColumn(\n expression: Expr,\n table: PredicateTableSpec,\n): string {\n if (expression.type === 'cast') {\n return resolveColumnOperand(expression, table).name;\n }\n if (expression.type === 'column' && !table.columns[expression.name]) {\n throw new UnsupportedPredicateError('unpublished-column');\n }\n if (expression.type === 'column') return expression.name;\n throw new UnsupportedPredicateError('unsupported-syntax');\n}\n\nfunction resolveBareBooleanColumn(\n expression: Expr,\n table: PredicateTableSpec,\n): string | undefined {\n if (expression.type !== 'column' && expression.type !== 'cast') {\n return undefined;\n }\n const column = resolveColumnOperand(expression, table);\n return column.category === 'boolean' ? column.name : undefined;\n}\n\nfunction booleanComparison(column: string, value: boolean): IndexPredicate {\n return {\n type: 'comparison',\n column,\n op: '=',\n value: {type: 'boolean', value},\n };\n}\n\ntype ColumnCategory =\n | {readonly category: 'boolean'; readonly name: string}\n | {\n readonly category: 'integer';\n readonly name: string;\n readonly rank: 0 | 1 | 2;\n }\n | {readonly category: 'text'; readonly name: string}\n | {\n readonly category: 'enum';\n readonly name: string;\n readonly enumName: string;\n }\n | {readonly category: 'uuid'; readonly name: string};\n\nfunction normalizeComparison(\n expression: Extract<Expr, {type: 'comparison'}>,\n table: PredicateTableSpec,\n): IndexPredicate {\n const column = resolveColumnOperand(expression.left, table);\n const op = expression.op === '!=' ? '<>' : expression.op;\n if (column.category !== 'integer' && op !== '=' && op !== '<>') {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n const value = resolveLiteral(expression.right, column);\n return {type: 'comparison', column: column.name, op, value};\n}\n\nfunction resolveColumnOperand(\n expression: Expr,\n table: PredicateTableSpec,\n): ColumnCategory {\n if (expression.type === 'column') return resolveColumn(expression, table);\n if (expression.type !== 'cast') {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n const column = resolveColumnOperand(expression.expression, table);\n const cast = canonicalTypeName(expression.cast);\n switch (column.category) {\n case 'integer': {\n const rank = integerRank(cast);\n if (rank === undefined || rank < column.rank) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return {...column, rank};\n }\n case 'text':\n if (cast !== 'text' && cast !== 'varchar') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'boolean':\n if (cast !== 'bool') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'uuid':\n if (cast !== 'uuid') {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n case 'enum':\n if (lastTypeName(expression.cast) !== column.enumName.toLowerCase()) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n return column;\n }\n}\n\nfunction resolveColumn(\n expression: Extract<Expr, {type: 'column'}>,\n table: PredicateTableSpec,\n): ColumnCategory {\n const spec = table.columns[expression.name];\n if (!spec) throw new UnsupportedPredicateError('unpublished-column');\n const dataType = canonicalTypeName(spec.dataType);\n if (dataType === 'bool') return {category: 'boolean', name: expression.name};\n const rank = integerRank(dataType);\n if (rank !== undefined) {\n return {category: 'integer', name: expression.name, rank};\n }\n if (dataType === 'text' || dataType === 'varchar') {\n if (spec.collationIsDeterministic === false) {\n throw new UnsupportedPredicateError('non-deterministic-collation');\n }\n return {category: 'text', name: expression.name};\n }\n if (dataType === 'uuid') return {category: 'uuid', name: expression.name};\n if (spec.pgTypeClass === PostgresTypeClass.Enum) {\n return {\n category: 'enum',\n name: expression.name,\n enumName: spec.dataType.toLowerCase(),\n };\n }\n throw new UnsupportedPredicateError('unsupported-type');\n}\n\nfunction resolveLiteral(\n expression: Expr,\n column: ColumnCategory,\n): IndexPredicateValue {\n let literal = expression;\n let cast: string | undefined;\n while (literal.type === 'cast') {\n cast = literal.cast;\n literal = literal.expression;\n }\n if (literal.type !== 'literal' || literal.value === null) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n\n switch (column.category) {\n case 'boolean': {\n validateLiteralCast(cast, new Set(['bool']));\n if (literal.literalType !== 'boolean') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'boolean', value: literal.value as boolean};\n }\n case 'integer': {\n if (cast !== undefined) {\n const castRank = integerRank(canonicalTypeName(cast));\n if (castRank === undefined || castRank > column.rank) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n }\n if (\n literal.literalType !== 'integer' &&\n !(literal.literalType === 'string' && cast !== undefined)\n ) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {\n type: 'integer',\n value: canonicalInteger(String(literal.value), column.rank),\n };\n }\n case 'text':\n validateLiteralCast(cast, new Set(['text', 'varchar']));\n if (literal.literalType !== 'string') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value: String(literal.value)};\n case 'enum':\n if (\n cast !== undefined &&\n lastTypeName(cast) !== column.enumName.toLowerCase()\n ) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n if (literal.literalType !== 'string') {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value: String(literal.value)};\n case 'uuid': {\n validateLiteralCast(cast, new Set(['uuid']));\n const value = String(literal.value).toLowerCase();\n if (literal.literalType !== 'string' || !UUID_RE.test(value)) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return {type: 'string', value};\n }\n }\n}\n\nfunction validateLiteralCast(\n cast: string | undefined,\n allowed: ReadonlySet<string>,\n): void {\n if (cast !== undefined && !allowed.has(canonicalTypeName(cast))) {\n throw new UnsupportedPredicateError('unsupported-cast');\n }\n}\n\nfunction canonicalInteger(value: string, rank: 0 | 1 | 2): string {\n if (!INTEGER_RE.test(value)) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n let integer: bigint;\n try {\n integer = BigInt(value);\n } catch {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n const bounds = [\n [-32768n, 32767n],\n [-2147483648n, 2147483647n],\n [-9223372036854775808n, 9223372036854775807n],\n ] as const;\n if (integer < bounds[rank][0] || integer > bounds[rank][1]) {\n throw new UnsupportedPredicateError('unsupported-type');\n }\n return integer.toString();\n}\n\nfunction canonicalTypeName(type: string): string {\n const name = lastTypeName(type).replace(/\\s+/g, ' ');\n switch (name) {\n case 'boolean':\n return 'bool';\n case 'smallint':\n return 'int2';\n case 'integer':\n return 'int4';\n case 'bigint':\n return 'int8';\n case 'character varying':\n return 'varchar';\n default:\n return name;\n }\n}\n\nfunction lastTypeName(type: string): string {\n return type.split('.').at(-1)?.toLowerCase() ?? '';\n}\n\nfunction integerRank(type: string): 0 | 1 | 2 | undefined {\n switch (type) {\n case 'int2':\n return 0;\n case 'int4':\n return 1;\n case 'int8':\n return 2;\n default:\n return undefined;\n }\n}\n\nfunction isComparison(\n type: Token['type'] | undefined,\n): type is '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=' {\n return (\n type === '=' ||\n type === '<>' ||\n type === '!=' ||\n type === '<' ||\n type === '<=' ||\n type === '>' ||\n type === '>='\n );\n}\n\nfunction tokenize(sql: string): readonly Token[] {\n const tokens: Token[] = [];\n for (let i = 0; i < sql.length;) {\n const char = sql[i];\n if (WHITESPACE_RE.test(char)) {\n i++;\n continue;\n }\n if (char === '\"') {\n const result = readQuoted(sql, i, '\"', false);\n tokens.push({type: 'identifier', value: result.value});\n i = result.end;\n continue;\n }\n const escapeString = (char === 'E' || char === 'e') && sql[i + 1] === \"'\";\n if (char === \"'\" || escapeString) {\n const result = readQuoted(\n sql,\n i + (escapeString ? 1 : 0),\n \"'\",\n escapeString,\n );\n tokens.push({\n type: 'literal',\n literalType: 'string',\n value: result.value,\n });\n i = result.end;\n continue;\n }\n const operator = OPERATOR_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (operator) {\n tokens.push({\n type: operator as '::' | '=' | '<>' | '!=' | '<' | '<=' | '>' | '>=',\n });\n i += operator.length;\n continue;\n }\n if (char === '(' || char === ')' || char === '.') {\n tokens.push({type: char});\n i++;\n continue;\n }\n const integer = INTEGER_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (integer) {\n tokens.push({type: 'literal', literalType: 'integer', value: integer});\n i += integer.length;\n continue;\n }\n const word = WORD_TOKEN_RE.exec(sql.slice(i))?.[0];\n if (word) {\n const keyword = word.toUpperCase();\n if (unsupportedOperatorWords.has(keyword)) {\n throw new UnsupportedPredicateError('unsupported-operator');\n }\n if (keyword === 'TRUE' || keyword === 'FALSE') {\n tokens.push({\n type: 'literal',\n literalType: 'boolean',\n value: keyword === 'TRUE',\n });\n } else if (keyword === 'NULL') {\n tokens.push({type: 'literal', literalType: 'null', value: null});\n } else if (\n keyword === 'AND' ||\n keyword === 'OR' ||\n keyword === 'NOT' ||\n keyword === 'IS'\n ) {\n tokens.push({type: keyword});\n } else {\n tokens.push({type: 'identifier', value: word.toLowerCase()});\n }\n i += word.length;\n continue;\n }\n tokens.push({type: 'unsupported', value: char});\n i++;\n }\n tokens.push({type: 'EOF'});\n return tokens;\n}\n\nfunction readQuoted(\n sql: string,\n start: number,\n quote: '\"' | \"'\",\n escapes: boolean,\n): {readonly value: string; readonly end: number} {\n let value = '';\n for (let i = start + 1; i < sql.length; i++) {\n const char = sql[i];\n if (char === quote) {\n if (sql[i + 1] === quote) {\n value += quote;\n i++;\n } else {\n return {value, end: i + 1};\n }\n } else if (escapes && char === '\\\\') {\n const escape = sql[++i];\n if (escape === undefined) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n if (escape === 'x') {\n const hex = readEscapeDigits(sql, i + 1, 2, 16, 1);\n value += String.fromCharCode(hex.value);\n i = hex.end - 1;\n } else if (escape === 'u' || escape === 'U') {\n const hex = readEscapeDigits(sql, i + 1, escape === 'u' ? 4 : 8, 16);\n try {\n value += String.fromCodePoint(hex.value);\n } catch {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n i = hex.end - 1;\n } else if (escape >= '0' && escape <= '7') {\n let octal = escape;\n while (\n octal.length < 3 &&\n sql[i + 1] !== undefined &&\n sql[i + 1] >= '0' &&\n sql[i + 1] <= '7'\n ) {\n octal += sql[++i];\n }\n value += String.fromCharCode(Number.parseInt(octal, 8));\n } else if (escape === '\\n') {\n // A backslash-newline pair is a line continuation.\n } else if (escape === '\\r' && sql[i + 1] === '\\n') {\n i++;\n } else {\n value += SIMPLE_ESCAPES[escape] ?? escape;\n }\n } else {\n value += char;\n }\n }\n throw new UnsupportedPredicateError('unsupported-syntax');\n}\n\nfunction readEscapeDigits(\n sql: string,\n start: number,\n length: number,\n radix: 16,\n minLength = length,\n): {readonly value: number; readonly end: number} {\n let end = start;\n while (end < start + length) {\n const digit = sql[end];\n if (\n digit === undefined ||\n !(\n (digit >= '0' && digit <= '9') ||\n (digit.toLowerCase() >= 'a' && digit.toLowerCase() <= 'f')\n )\n ) {\n break;\n }\n end++;\n }\n const digits = sql.slice(start, end);\n if (digits.length < minLength) {\n throw new UnsupportedPredicateError('unsupported-syntax');\n }\n return {value: Number.parseInt(digits, radix), end};\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAQjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAY7E;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf;AA4MD,eAAO,MAAM,sBAAsB,QAMwB,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAQjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAY7E;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAyND,eAAO,MAAM,sBAAsB,QAMwB,CAAC"}
@@ -129,6 +129,15 @@ function getIncrementalMigrations(shard) {
129
129
  ALTER TABLE ${sql(upstreamSchema(shard))}.replicas
130
130
  ADD COLUMN "backupV5" BOOL DEFAULT false;
131
131
  `;
132
+ } },
133
+ 26: { migrateSchema: async (lc, sql) => {
134
+ const [{ publications }] = await sql`
135
+ SELECT publications FROM ${sql(shardConfigTable)}`;
136
+ await setupTriggers(lc, sql, {
137
+ ...shard,
138
+ publications
139
+ });
140
+ lc.info?.(`Upgraded DDL event triggers`);
132
141
  } }
133
142
  };
134
143
  }