@powersync/service-sync-rules 0.0.0-dev-20240708103353

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 (75) hide show
  1. package/LICENSE +67 -0
  2. package/README.md +129 -0
  3. package/dist/DartSchemaGenerator.d.ts +12 -0
  4. package/dist/DartSchemaGenerator.js +39 -0
  5. package/dist/DartSchemaGenerator.js.map +1 -0
  6. package/dist/ExpressionType.d.ts +33 -0
  7. package/dist/ExpressionType.js +61 -0
  8. package/dist/ExpressionType.js.map +1 -0
  9. package/dist/IdSequence.d.ts +4 -0
  10. package/dist/IdSequence.js +9 -0
  11. package/dist/IdSequence.js.map +1 -0
  12. package/dist/JsSchemaGenerator.d.ts +12 -0
  13. package/dist/JsSchemaGenerator.js +42 -0
  14. package/dist/JsSchemaGenerator.js.map +1 -0
  15. package/dist/SchemaGenerator.d.ts +14 -0
  16. package/dist/SchemaGenerator.js +26 -0
  17. package/dist/SchemaGenerator.js.map +1 -0
  18. package/dist/SourceTableInterface.d.ts +5 -0
  19. package/dist/SourceTableInterface.js +2 -0
  20. package/dist/SourceTableInterface.js.map +1 -0
  21. package/dist/SqlBucketDescriptor.d.ts +37 -0
  22. package/dist/SqlBucketDescriptor.js +111 -0
  23. package/dist/SqlBucketDescriptor.js.map +1 -0
  24. package/dist/SqlDataQuery.d.ts +39 -0
  25. package/dist/SqlDataQuery.js +239 -0
  26. package/dist/SqlDataQuery.js.map +1 -0
  27. package/dist/SqlParameterQuery.d.ts +85 -0
  28. package/dist/SqlParameterQuery.js +311 -0
  29. package/dist/SqlParameterQuery.js.map +1 -0
  30. package/dist/SqlSyncRules.d.ts +52 -0
  31. package/dist/SqlSyncRules.js +264 -0
  32. package/dist/SqlSyncRules.js.map +1 -0
  33. package/dist/StaticSchema.d.ts +26 -0
  34. package/dist/StaticSchema.js +61 -0
  35. package/dist/StaticSchema.js.map +1 -0
  36. package/dist/StaticSqlParameterQuery.d.ts +27 -0
  37. package/dist/StaticSqlParameterQuery.js +96 -0
  38. package/dist/StaticSqlParameterQuery.js.map +1 -0
  39. package/dist/TablePattern.d.ts +17 -0
  40. package/dist/TablePattern.js +56 -0
  41. package/dist/TablePattern.js.map +1 -0
  42. package/dist/TableQuerySchema.d.ts +9 -0
  43. package/dist/TableQuerySchema.js +34 -0
  44. package/dist/TableQuerySchema.js.map +1 -0
  45. package/dist/errors.d.ts +22 -0
  46. package/dist/errors.js +58 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/generators.d.ts +6 -0
  49. package/dist/generators.js +7 -0
  50. package/dist/generators.js.map +1 -0
  51. package/dist/index.d.ts +19 -0
  52. package/dist/index.js +20 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/json_schema.d.ts +3 -0
  55. package/dist/json_schema.js +52 -0
  56. package/dist/json_schema.js.map +1 -0
  57. package/dist/request_functions.d.ts +17 -0
  58. package/dist/request_functions.js +41 -0
  59. package/dist/request_functions.js.map +1 -0
  60. package/dist/sql_filters.d.ts +125 -0
  61. package/dist/sql_filters.js +599 -0
  62. package/dist/sql_filters.js.map +1 -0
  63. package/dist/sql_functions.d.ts +61 -0
  64. package/dist/sql_functions.js +863 -0
  65. package/dist/sql_functions.js.map +1 -0
  66. package/dist/sql_support.d.ts +25 -0
  67. package/dist/sql_support.js +254 -0
  68. package/dist/sql_support.js.map +1 -0
  69. package/dist/types.d.ts +262 -0
  70. package/dist/types.js +28 -0
  71. package/dist/types.js.map +1 -0
  72. package/dist/utils.d.ts +44 -0
  73. package/dist/utils.js +167 -0
  74. package/dist/utils.js.map +1 -0
  75. package/package.json +32 -0
@@ -0,0 +1,599 @@
1
+ import { ExpressionType, TYPE_NONE } from './ExpressionType.js';
2
+ import { SqlRuleError } from './errors.js';
3
+ import { BASIC_OPERATORS, OPERATOR_IS_NOT_NULL, OPERATOR_IS_NULL, OPERATOR_JSON_EXTRACT_JSON, OPERATOR_JSON_EXTRACT_SQL, OPERATOR_NOT, SQL_FUNCTIONS, castOperator, sqliteTypeOf } from './sql_functions.js';
4
+ import { SQLITE_FALSE, SQLITE_TRUE, andFilters, compileStaticOperator, getOperatorFunction, isClauseError, isParameterMatchClause, isParameterValueClause, isRowValueClause, isStaticValueClause, orFilters, toBooleanParameterSetClause } from './sql_support.js';
5
+ import { isJsonValue } from './utils.js';
6
+ import { JSONBig } from '@powersync/service-jsonbig';
7
+ import { REQUEST_FUNCTIONS } from './request_functions.js';
8
+ export const MATCH_CONST_FALSE = [];
9
+ export const MATCH_CONST_TRUE = [{}];
10
+ Object.freeze(MATCH_CONST_TRUE);
11
+ Object.freeze(MATCH_CONST_FALSE);
12
+ export class SqlTools {
13
+ constructor(options) {
14
+ this.errors = [];
15
+ this.default_table = options.table;
16
+ this.schema = options.schema;
17
+ if (options.value_tables) {
18
+ this.value_tables = options.value_tables;
19
+ }
20
+ else if (this.default_table) {
21
+ this.value_tables = [this.default_table];
22
+ }
23
+ else {
24
+ this.value_tables = [];
25
+ }
26
+ this.parameter_tables = options.parameter_tables ?? [];
27
+ this.sql = options.sql;
28
+ this.supports_expanding_parameters = options.supports_expanding_parameters ?? false;
29
+ this.supports_parameter_expressions = options.supports_parameter_expressions ?? false;
30
+ }
31
+ error(message, expr) {
32
+ this.errors.push(new SqlRuleError(message, this.sql, expr));
33
+ return { error: true };
34
+ }
35
+ warn(message, expr) {
36
+ const error = new SqlRuleError(message, this.sql, expr);
37
+ error.type = 'warning';
38
+ this.errors.push(error);
39
+ }
40
+ /**
41
+ * Compile the where clause into a ParameterMatchClause.
42
+ *
43
+ * A ParameterMatchClause takes a data row, and returns filter values that
44
+ * would make the expression true for the row.
45
+ */
46
+ compileWhereClause(where) {
47
+ const base = this.compileClause(where);
48
+ return toBooleanParameterSetClause(base);
49
+ }
50
+ compileRowValueExtractor(expr) {
51
+ const clause = this.compileClause(expr);
52
+ if (!isRowValueClause(clause) && !isClauseError(clause)) {
53
+ return this.error('Parameter match expression is not allowed here', expr ?? undefined);
54
+ }
55
+ return clause;
56
+ }
57
+ compileParameterValueExtractor(expr) {
58
+ const clause = this.compileClause(expr);
59
+ if (isClauseError(clause) || isStaticValueClause(clause) || isParameterValueClause(clause)) {
60
+ return clause;
61
+ }
62
+ return this.error('Parameter match expression is not allowed here', expr ?? undefined);
63
+ }
64
+ /**
65
+ * Given an expression, return a compiled clause.
66
+ */
67
+ compileClause(expr) {
68
+ if (expr == null) {
69
+ return staticValueClause(SQLITE_TRUE);
70
+ }
71
+ else if (isStatic(expr)) {
72
+ const value = staticValue(expr);
73
+ return staticValueClause(value);
74
+ }
75
+ else if (expr.type == 'ref') {
76
+ const column = expr.name;
77
+ if (column == '*') {
78
+ return this.error('* not supported here', expr);
79
+ }
80
+ if (this.refHasSchema(expr)) {
81
+ return this.error(`Schema is not supported in column references`, expr);
82
+ }
83
+ if (this.isParameterRef(expr)) {
84
+ return this.getParameterRefClause(expr);
85
+ }
86
+ else if (this.isTableRef(expr)) {
87
+ const table = this.getTableName(expr);
88
+ this.checkRef(table, expr);
89
+ return {
90
+ evaluate(tables) {
91
+ return tables[table]?.[column];
92
+ },
93
+ getType(schema) {
94
+ return schema.getType(table, column);
95
+ }
96
+ };
97
+ }
98
+ else {
99
+ const ref = [expr.table?.schema, expr.table?.name, expr.name]
100
+ .filter((e) => e != null)
101
+ .join('.');
102
+ return this.error(`Undefined reference: ${ref}`, expr);
103
+ }
104
+ }
105
+ else if (expr.type == 'binary') {
106
+ const { left, right, op } = expr;
107
+ const leftFilter = this.compileClause(left);
108
+ const rightFilter = this.compileClause(right);
109
+ if (isClauseError(leftFilter) || isClauseError(rightFilter)) {
110
+ return { error: true };
111
+ }
112
+ if (op == 'AND') {
113
+ try {
114
+ return andFilters(leftFilter, rightFilter);
115
+ }
116
+ catch (e) {
117
+ return this.error(e.message, expr);
118
+ }
119
+ }
120
+ else if (op == 'OR') {
121
+ try {
122
+ return orFilters(leftFilter, rightFilter);
123
+ }
124
+ catch (e) {
125
+ return this.error(e.message, expr);
126
+ }
127
+ }
128
+ else if (op == '=') {
129
+ // Options:
130
+ // 1. row value, row value
131
+ // 2. row value, parameter value
132
+ // 3. static true, parameterMatch - not supported yet
133
+ // 4. parameter value, parameter value
134
+ let staticFilter1;
135
+ let otherFilter1;
136
+ if (this.supports_parameter_expressions &&
137
+ isParameterValueClause(leftFilter) &&
138
+ isParameterValueClause(rightFilter)) {
139
+ // 4. parameterValue, parameterValue
140
+ // This includes (static value, parameter value)
141
+ // Not applicable to data queries (composeFunction will error).
142
+ // Some of those cases can still be handled with case (2),
143
+ // so we filter for supports_parameter_expressions above.
144
+ const fnImpl = getOperatorFunction('=');
145
+ return this.composeFunction(fnImpl, [leftFilter, rightFilter], [left, right]);
146
+ }
147
+ if (!isRowValueClause(leftFilter) && !isRowValueClause(rightFilter)) {
148
+ return this.error(`Cannot have bucket parameters on both sides of = operator`, expr);
149
+ }
150
+ else if (isRowValueClause(leftFilter)) {
151
+ staticFilter1 = leftFilter;
152
+ otherFilter1 = rightFilter;
153
+ }
154
+ else {
155
+ staticFilter1 = rightFilter;
156
+ otherFilter1 = leftFilter;
157
+ }
158
+ const staticFilter = staticFilter1;
159
+ const otherFilter = otherFilter1;
160
+ if (isRowValueClause(otherFilter)) {
161
+ // 1. row value = row value
162
+ return compileStaticOperator(op, leftFilter, rightFilter);
163
+ }
164
+ else if (isParameterValueClause(otherFilter)) {
165
+ // 2. row value = parameter value
166
+ const inputParam = basicInputParameter(otherFilter);
167
+ return {
168
+ error: false,
169
+ inputParameters: [inputParam],
170
+ unbounded: false,
171
+ filterRow(tables) {
172
+ const value = staticFilter.evaluate(tables);
173
+ if (value == null) {
174
+ // null never matches on =
175
+ // Should technically return null, but "false" is sufficient here
176
+ return MATCH_CONST_FALSE;
177
+ }
178
+ if (!isJsonValue(value)) {
179
+ // Cannot persist this, e.g. BLOB
180
+ return MATCH_CONST_FALSE;
181
+ }
182
+ return [{ [inputParam.key]: value }];
183
+ },
184
+ usesAuthenticatedRequestParameters: otherFilter.usesAuthenticatedRequestParameters,
185
+ usesUnauthenticatedRequestParameters: otherFilter.usesUnauthenticatedRequestParameters
186
+ };
187
+ }
188
+ else if (isParameterMatchClause(otherFilter)) {
189
+ // 3. row value = parameterMatch
190
+ // (bucket.param = 'something') = staticValue
191
+ // To implement this, we need to ensure the static value here can only be true.
192
+ return this.error(`Parameter match clauses cannot be used here`, expr);
193
+ }
194
+ else {
195
+ throw new Error('Unexpected');
196
+ }
197
+ }
198
+ else if (op == 'IN') {
199
+ // Options:
200
+ // static IN static
201
+ // parameterValue IN static
202
+ if (isRowValueClause(leftFilter) && isRowValueClause(rightFilter)) {
203
+ // static1 IN static2
204
+ return compileStaticOperator(op, leftFilter, rightFilter);
205
+ }
206
+ else if (isParameterValueClause(leftFilter) && isRowValueClause(rightFilter)) {
207
+ // token_parameters.value IN table.some_array
208
+ // bucket.param IN table.some_array
209
+ const inputParam = basicInputParameter(leftFilter);
210
+ return {
211
+ error: false,
212
+ inputParameters: [inputParam],
213
+ unbounded: true,
214
+ filterRow(tables) {
215
+ const aValue = rightFilter.evaluate(tables);
216
+ if (aValue == null) {
217
+ return MATCH_CONST_FALSE;
218
+ }
219
+ const values = JSON.parse(aValue);
220
+ if (!Array.isArray(values)) {
221
+ throw new Error('Not an array');
222
+ }
223
+ return values.map((value) => {
224
+ return { [inputParam.key]: value };
225
+ });
226
+ },
227
+ usesAuthenticatedRequestParameters: leftFilter.usesAuthenticatedRequestParameters,
228
+ usesUnauthenticatedRequestParameters: leftFilter.usesUnauthenticatedRequestParameters
229
+ };
230
+ }
231
+ else if (this.supports_expanding_parameters &&
232
+ isRowValueClause(leftFilter) &&
233
+ isParameterValueClause(rightFilter)) {
234
+ // table.some_value IN token_parameters.some_array
235
+ // This expands into "table_some_value = <value>" for each value of the array.
236
+ // We only support one such filter per query
237
+ const key = `${rightFilter.key}[*]`;
238
+ const inputParam = {
239
+ key: key,
240
+ expands: true,
241
+ filteredRowToLookupValue: (filterParameters) => {
242
+ return filterParameters[key];
243
+ },
244
+ parametersToLookupValue: (parameters) => {
245
+ return rightFilter.lookupParameterValue(parameters);
246
+ }
247
+ };
248
+ return {
249
+ error: false,
250
+ inputParameters: [inputParam],
251
+ unbounded: false,
252
+ filterRow(tables) {
253
+ const value = leftFilter.evaluate(tables);
254
+ if (!isJsonValue(value)) {
255
+ // Cannot persist, e.g. BLOB
256
+ return MATCH_CONST_FALSE;
257
+ }
258
+ return [{ [inputParam.key]: value }];
259
+ },
260
+ usesAuthenticatedRequestParameters: rightFilter.usesAuthenticatedRequestParameters,
261
+ usesUnauthenticatedRequestParameters: rightFilter.usesUnauthenticatedRequestParameters
262
+ };
263
+ }
264
+ else {
265
+ return this.error(`Unsupported usage of IN operator`, expr);
266
+ }
267
+ }
268
+ else if (BASIC_OPERATORS.has(op)) {
269
+ const fnImpl = getOperatorFunction(op);
270
+ return this.composeFunction(fnImpl, [leftFilter, rightFilter], [left, right]);
271
+ }
272
+ else {
273
+ return this.error(`Operator not supported: ${op}`, expr);
274
+ }
275
+ }
276
+ else if (expr.type == 'unary') {
277
+ if (expr.op == 'NOT') {
278
+ const clause = this.compileClause(expr.operand);
279
+ return this.composeFunction(OPERATOR_NOT, [clause], [expr.operand]);
280
+ }
281
+ else if (expr.op == 'IS NULL') {
282
+ const clause = this.compileClause(expr.operand);
283
+ return this.composeFunction(OPERATOR_IS_NULL, [clause], [expr.operand]);
284
+ }
285
+ else if (expr.op == 'IS NOT NULL') {
286
+ const clause = this.compileClause(expr.operand);
287
+ return this.composeFunction(OPERATOR_IS_NOT_NULL, [clause], [expr.operand]);
288
+ }
289
+ else {
290
+ return this.error(`Operator ${expr.op} is not supported`, expr);
291
+ }
292
+ }
293
+ else if (expr.type == 'call' && expr.function?.name != null) {
294
+ const schema = expr.function.schema; // schema.function()
295
+ const fn = expr.function.name;
296
+ if (schema == null) {
297
+ // Just fn()
298
+ const fnImpl = SQL_FUNCTIONS[fn];
299
+ if (fnImpl == null) {
300
+ return this.error(`Function '${fn}' is not defined`, expr);
301
+ }
302
+ const argClauses = expr.args.map((arg) => this.compileClause(arg));
303
+ const composed = this.composeFunction(fnImpl, argClauses, expr.args);
304
+ return composed;
305
+ }
306
+ else if (schema == 'request') {
307
+ // Special function
308
+ if (!this.supports_parameter_expressions) {
309
+ return this.error(`${schema} schema is not available in data queries`, expr);
310
+ }
311
+ if (expr.args.length > 0) {
312
+ return this.error(`Function '${schema}.${fn}' does not take arguments`, expr);
313
+ }
314
+ if (fn in REQUEST_FUNCTIONS) {
315
+ const fnImpl = REQUEST_FUNCTIONS[fn];
316
+ return {
317
+ key: 'request.parameters()',
318
+ lookupParameterValue(parameters) {
319
+ return fnImpl.call(parameters);
320
+ },
321
+ usesAuthenticatedRequestParameters: fnImpl.usesAuthenticatedRequestParameters,
322
+ usesUnauthenticatedRequestParameters: fnImpl.usesUnauthenticatedRequestParameters
323
+ };
324
+ }
325
+ else {
326
+ return this.error(`Function '${schema}.${fn}' is not defined`, expr);
327
+ }
328
+ }
329
+ else {
330
+ // Unknown function with schema
331
+ return this.error(`Function '${schema}.${fn}' is not defined`, expr);
332
+ }
333
+ }
334
+ else if (expr.type == 'member') {
335
+ const operand = this.compileClause(expr.operand);
336
+ if (!(typeof expr.member == 'string' && (expr.op == '->>' || expr.op == '->'))) {
337
+ return this.error(`Unsupported member operation ${expr.op}`, expr);
338
+ }
339
+ const debugArgs = [expr.operand, expr];
340
+ const args = [operand, staticValueClause(expr.member)];
341
+ if (expr.op == '->') {
342
+ return this.composeFunction(OPERATOR_JSON_EXTRACT_JSON, args, debugArgs);
343
+ }
344
+ else {
345
+ return this.composeFunction(OPERATOR_JSON_EXTRACT_SQL, args, debugArgs);
346
+ }
347
+ }
348
+ else if (expr.type == 'cast') {
349
+ const operand = this.compileClause(expr.operand);
350
+ const to = expr.to?.name?.toLowerCase();
351
+ const castFn = castOperator(to);
352
+ if (castFn == null) {
353
+ return this.error(`CAST not supported for '${to}'`, expr);
354
+ }
355
+ return this.composeFunction(castFn, [operand], [expr.operand]);
356
+ }
357
+ else {
358
+ return this.error(`${expr.type} not supported here`, expr);
359
+ }
360
+ }
361
+ /**
362
+ * "some_column" => "some_column"
363
+ * "table.some_column" => "some_column".
364
+ * "some_function() AS some_column" => "some_column"
365
+ * "some_function() some_column" => "some_column"
366
+ * "some_function()" => error
367
+ */
368
+ getOutputName(column) {
369
+ let alias = column.alias?.name;
370
+ if (alias) {
371
+ return alias;
372
+ }
373
+ const expr = column.expr;
374
+ if (expr.type == 'ref') {
375
+ return expr.name;
376
+ }
377
+ throw new SqlRuleError(`alias is required`, this.sql, column.expr);
378
+ }
379
+ getSpecificOutputName(column) {
380
+ const name = this.getOutputName(column);
381
+ if (name == '*') {
382
+ throw new SqlRuleError('* is not supported here - use explicit columns', this.sql, column.expr);
383
+ }
384
+ return name;
385
+ }
386
+ /**
387
+ * Check if an expression is a parameter_table reference.
388
+ */
389
+ isParameterRef(expr) {
390
+ if (expr.type != 'ref') {
391
+ return false;
392
+ }
393
+ return this.parameter_tables.includes(expr.table?.name ?? '');
394
+ }
395
+ /**
396
+ * Check if an expression is a value_tables reference.
397
+ *
398
+ * This means the expression can be evaluated directly on a value row.
399
+ */
400
+ isTableRef(expr) {
401
+ if (expr.type != 'ref') {
402
+ return false;
403
+ }
404
+ try {
405
+ this.getTableName(expr);
406
+ return true;
407
+ }
408
+ catch (e) {
409
+ return false;
410
+ }
411
+ }
412
+ checkRef(table, ref) {
413
+ if (this.schema) {
414
+ const type = this.schema.getType(table, ref.name);
415
+ if (type.typeFlags == TYPE_NONE) {
416
+ this.warn(`Column not found: ${ref.name}`, ref);
417
+ }
418
+ }
419
+ }
420
+ getParameterRefClause(expr) {
421
+ const table = expr.table.name;
422
+ const column = expr.name;
423
+ return {
424
+ key: `${table}.${column}`,
425
+ lookupParameterValue: (parameters) => {
426
+ const pt = parameters[table];
427
+ return pt?.[column] ?? null;
428
+ },
429
+ usesAuthenticatedRequestParameters: table == 'token_parameters',
430
+ usesUnauthenticatedRequestParameters: table == 'user_parameters'
431
+ };
432
+ }
433
+ refHasSchema(ref) {
434
+ return ref.table?.schema != null;
435
+ }
436
+ /**
437
+ * Get the table name from an expression.
438
+ *
439
+ * Only "value" tables are supported here, not parameter values.
440
+ */
441
+ getTableName(ref) {
442
+ if (this.refHasSchema(ref)) {
443
+ throw new SqlRuleError(`Specifying schema in column references is not supported`, this.sql, ref);
444
+ }
445
+ if (ref.table?.name == null && this.default_table != null) {
446
+ return this.default_table;
447
+ }
448
+ else if (this.value_tables.includes(ref.table?.name ?? '')) {
449
+ return ref.table.name;
450
+ }
451
+ else if (ref.table?.name == null) {
452
+ throw new SqlRuleError(`Table name required`, this.sql, ref);
453
+ }
454
+ else {
455
+ throw new SqlRuleError(`Undefined table ${ref.table?.name}`, this.sql, ref);
456
+ }
457
+ }
458
+ /**
459
+ * Given a function, compile a clause with the function over compiled arguments.
460
+ *
461
+ * For functions with multiple arguments, the following combinations are supported:
462
+ * fn(StaticValueClause, StaticValueClause) => StaticValueClause
463
+ * fn(ParameterValueClause, ParameterValueClause) => ParameterValueClause
464
+ * fn(RowValueClause, RowValueClause) => RowValueClause
465
+ * fn(ParameterValueClause, StaticValueClause) => ParameterValueClause
466
+ * fn(RowValueClause, StaticValueClause) => RowValueClause
467
+ *
468
+ * This is not supported, and will likely never be supported:
469
+ * fn(ParameterValueClause, RowValueClause) => error
470
+ *
471
+ * @param fnImpl The function or operator implementation
472
+ * @param argClauses The compiled argument clauses
473
+ * @param debugArgExpressions The original parsed expressions, for debug info only
474
+ * @returns a compiled function clause
475
+ */
476
+ composeFunction(fnImpl, argClauses, debugArgExpressions) {
477
+ let argsType = 'static';
478
+ for (let i = 0; i < argClauses.length; i++) {
479
+ const debugArg = debugArgExpressions[i];
480
+ const clause = argClauses[i];
481
+ if (isClauseError(clause)) {
482
+ // Return immediately on error
483
+ return clause;
484
+ }
485
+ else if (isStaticValueClause(clause)) {
486
+ // argsType unchanged
487
+ }
488
+ else if (isParameterValueClause(clause)) {
489
+ if (!this.supports_parameter_expressions) {
490
+ return this.error(`Cannot use bucket parameters in expressions`, debugArg);
491
+ }
492
+ if (argsType == 'static' || argsType == 'param') {
493
+ argsType = 'param';
494
+ }
495
+ else {
496
+ return this.error(`Cannot use table values and parameters in the same clauses`, debugArg);
497
+ }
498
+ }
499
+ else if (isRowValueClause(clause)) {
500
+ if (argsType == 'static' || argsType == 'row') {
501
+ argsType = 'row';
502
+ }
503
+ else {
504
+ return this.error(`Cannot use table values and parameters in the same clauses`, debugArg);
505
+ }
506
+ }
507
+ else {
508
+ return this.error(`Parameter match clauses cannot be used here`, debugArg);
509
+ }
510
+ }
511
+ if (argsType == 'row' || argsType == 'static') {
512
+ return {
513
+ evaluate: (tables) => {
514
+ const args = argClauses.map((e) => e.evaluate(tables));
515
+ return fnImpl.call(...args);
516
+ },
517
+ getType(schema) {
518
+ const argTypes = argClauses.map((e) => e.getType(schema));
519
+ return fnImpl.getReturnType(argTypes);
520
+ }
521
+ };
522
+ }
523
+ else if (argsType == 'param') {
524
+ const argStrings = argClauses.map((e) => e.key);
525
+ const name = `${fnImpl.debugName}(${argStrings.join(',')})`;
526
+ const usesAuthenticatedRequestParameters = argClauses.find((clause) => isParameterValueClause(clause) && clause.usesAuthenticatedRequestParameters) !=
527
+ null;
528
+ const usesUnauthenticatedRequestParameters = argClauses.find((clause) => isParameterValueClause(clause) && clause.usesUnauthenticatedRequestParameters) !=
529
+ null;
530
+ return {
531
+ key: name,
532
+ lookupParameterValue: (parameters) => {
533
+ const args = argClauses.map((e) => {
534
+ if (isParameterValueClause(e)) {
535
+ return e.lookupParameterValue(parameters);
536
+ }
537
+ else if (isStaticValueClause(e)) {
538
+ return e.value;
539
+ }
540
+ else {
541
+ throw new Error('unreachable condition');
542
+ }
543
+ });
544
+ return fnImpl.call(...args);
545
+ },
546
+ usesAuthenticatedRequestParameters,
547
+ usesUnauthenticatedRequestParameters
548
+ };
549
+ }
550
+ else {
551
+ throw new Error('unreachable condition');
552
+ }
553
+ }
554
+ parameterFunction() { }
555
+ }
556
+ function isStatic(expr) {
557
+ return ['integer', 'string', 'numeric', 'boolean', 'null'].includes(expr.type);
558
+ }
559
+ function staticValue(expr) {
560
+ if (expr.type == 'boolean') {
561
+ return expr.value ? SQLITE_TRUE : SQLITE_FALSE;
562
+ }
563
+ else if (expr.type == 'integer') {
564
+ return BigInt(expr.value);
565
+ }
566
+ else {
567
+ return expr.value;
568
+ }
569
+ }
570
+ function staticValueClause(value) {
571
+ return {
572
+ value: value,
573
+ // RowValueClause compatibility
574
+ evaluate: () => value,
575
+ getType() {
576
+ return ExpressionType.fromTypeText(sqliteTypeOf(value));
577
+ },
578
+ // ParamterValueClause compatibility
579
+ key: JSONBig.stringify(value),
580
+ lookupParameterValue(_parameters) {
581
+ return value;
582
+ },
583
+ usesAuthenticatedRequestParameters: false,
584
+ usesUnauthenticatedRequestParameters: false
585
+ };
586
+ }
587
+ function basicInputParameter(clause) {
588
+ return {
589
+ key: clause.key,
590
+ expands: false,
591
+ filteredRowToLookupValue: (filterParameters) => {
592
+ return filterParameters[clause.key];
593
+ },
594
+ parametersToLookupValue: (parameters) => {
595
+ return clause.lookupParameterValue(parameters);
596
+ }
597
+ };
598
+ }
599
+ //# sourceMappingURL=sql_filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql_filters.js","sourceRoot":"","sources":["../src/sql_filters.ts"],"names":[],"mappings":"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"}