@powersync/service-sync-rules 0.0.0-dev-20260803144812 → 0.0.0-dev-20260929095716
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -14
- package/dist/BucketSource.d.ts +2 -2
- package/dist/ConnectionConfig.d.ts +39 -0
- package/dist/ConnectionConfig.js +97 -0
- package/dist/ConnectionConfig.js.map +1 -0
- package/dist/HydratedSyncConfig.d.ts +11 -2
- package/dist/HydratedSyncConfig.js +18 -4
- package/dist/HydratedSyncConfig.js.map +1 -1
- package/dist/HydrationState.d.ts +2 -0
- package/dist/HydrationState.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +15 -0
- package/dist/SqlSyncRules.js +3 -1
- package/dist/SqlSyncRules.js.map +1 -1
- package/dist/StorageVersion.js +2 -1
- package/dist/StorageVersion.js.map +1 -1
- package/dist/SyncConfig.d.ts +11 -3
- package/dist/SyncConfig.js +16 -11
- package/dist/SyncConfig.js.map +1 -1
- package/dist/SyncConfigParserHooks.d.ts +103 -0
- package/dist/SyncConfigParserHooks.js +11 -0
- package/dist/SyncConfigParserHooks.js.map +1 -0
- package/dist/compatibility.d.ts +2 -1
- package/dist/compatibility.js +4 -2
- package/dist/compatibility.js.map +1 -1
- package/dist/compiler/bucket_resolver.d.ts +1 -0
- package/dist/compiler/bucket_resolver.js +22 -12
- package/dist/compiler/bucket_resolver.js.map +1 -1
- package/dist/compiler/compatibility.d.ts +38 -9
- package/dist/compiler/compatibility.js +81 -11
- package/dist/compiler/compatibility.js.map +1 -1
- package/dist/compiler/compiler.d.ts +84 -16
- package/dist/compiler/compiler.js +112 -16
- package/dist/compiler/compiler.js.map +1 -1
- package/dist/compiler/equality.d.ts +2 -2
- package/dist/compiler/equality.js +2 -2
- package/dist/compiler/expression.d.ts +20 -18
- package/dist/compiler/expression.js +23 -14
- package/dist/compiler/expression.js.map +1 -1
- package/dist/compiler/filter.d.ts +4 -4
- package/dist/compiler/filter.js +5 -4
- package/dist/compiler/filter.js.map +1 -1
- package/dist/compiler/ir_to_sync_plan.d.ts +4 -2
- package/dist/compiler/ir_to_sync_plan.js +40 -36
- package/dist/compiler/ir_to_sync_plan.js.map +1 -1
- package/dist/compiler/parser.d.ts +1 -1
- package/dist/compiler/parser.js +2 -2
- package/dist/compiler/querier_graph.js +43 -24
- package/dist/compiler/querier_graph.js.map +1 -1
- package/dist/compiler/rows.d.ts +23 -29
- package/dist/compiler/rows.js +83 -59
- package/dist/compiler/rows.js.map +1 -1
- package/dist/compiler/sqlite.js +1 -2
- package/dist/compiler/sqlite.js.map +1 -1
- package/dist/compiler/table.d.ts +5 -4
- package/dist/compiler/table.js +6 -7
- package/dist/compiler/table.js.map +1 -1
- package/dist/events/CompiledEventSourceQuery.d.ts +51 -0
- package/dist/events/CompiledEventSourceQuery.js +119 -0
- package/dist/events/CompiledEventSourceQuery.js.map +1 -0
- package/dist/events/EventDescriptor.d.ts +26 -0
- package/dist/events/EventDescriptor.js +2 -0
- package/dist/events/EventDescriptor.js.map +1 -0
- package/dist/from_yaml.d.ts +14 -1
- package/dist/from_yaml.js +101 -39
- package/dist/from_yaml.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +7 -0
- package/dist/json.js +2 -0
- package/dist/json.js.map +1 -0
- package/dist/json_schema.d.ts +11 -0
- package/dist/json_schema.js +27 -4
- package/dist/json_schema.js.map +1 -1
- package/dist/legacy/BaseSqlDataQuery.d.ts +12 -0
- package/dist/legacy/BaseSqlDataQuery.js +3 -0
- package/dist/legacy/BaseSqlDataQuery.js.map +1 -1
- package/dist/legacy/SqlBucketDescriptor.d.ts +9 -0
- package/dist/legacy/SqlBucketDescriptor.js +6 -0
- package/dist/legacy/SqlBucketDescriptor.js.map +1 -1
- package/dist/legacy/SqlDataQuery.d.ts +6 -0
- package/dist/legacy/SqlDataQuery.js +3 -0
- package/dist/legacy/SqlDataQuery.js.map +1 -1
- package/dist/legacy/SqlParameterQuery.d.ts +4 -0
- package/dist/legacy/SqlParameterQuery.js +1 -0
- package/dist/legacy/SqlParameterQuery.js.map +1 -1
- package/dist/legacy/StaticSqlParameterQuery.d.ts +4 -0
- package/dist/legacy/StaticSqlParameterQuery.js +1 -0
- package/dist/legacy/StaticSqlParameterQuery.js.map +1 -1
- package/dist/legacy/TableQuerySchema.d.ts +1 -0
- package/dist/legacy/TableQuerySchema.js +1 -0
- package/dist/legacy/TableQuerySchema.js.map +1 -1
- package/dist/legacy/TableValuedFunctionSqlParameterQuery.d.ts +4 -0
- package/dist/legacy/TableValuedFunctionSqlParameterQuery.js +1 -0
- package/dist/legacy/TableValuedFunctionSqlParameterQuery.js.map +1 -1
- package/dist/legacy/sql_filters.d.ts +13 -0
- package/dist/legacy/sql_filters.js +10 -0
- package/dist/legacy/sql_filters.js.map +1 -1
- package/dist/legacy/sql_support.d.ts +33 -0
- package/dist/legacy/sql_support.js +33 -0
- package/dist/legacy/sql_support.js.map +1 -1
- package/dist/legacy/streams/filter.d.ts +22 -0
- package/dist/legacy/streams/filter.js +19 -0
- package/dist/legacy/streams/filter.js.map +1 -1
- package/dist/legacy/streams/from_sql.d.ts +3 -0
- package/dist/legacy/streams/from_sql.js +4 -1
- package/dist/legacy/streams/from_sql.js.map +1 -1
- package/dist/legacy/streams/functions.d.ts +3 -0
- package/dist/legacy/streams/functions.js +3 -0
- package/dist/legacy/streams/functions.js.map +1 -1
- package/dist/legacy/streams/parameter.d.ts +10 -0
- package/dist/legacy/streams/stream.d.ts +7 -1
- package/dist/legacy/streams/stream.js +7 -1
- package/dist/legacy/streams/stream.js.map +1 -1
- package/dist/legacy/streams/variant.d.ts +6 -0
- package/dist/legacy/streams/variant.js +1 -0
- package/dist/legacy/streams/variant.js.map +1 -1
- package/dist/legacy/validators.d.ts +1 -0
- package/dist/legacy/validators.js +1 -0
- package/dist/legacy/validators.js.map +1 -1
- package/dist/schema-generators/RustSchemaGenerator.d.ts +22 -0
- package/dist/schema-generators/RustSchemaGenerator.js +120 -0
- package/dist/schema-generators/RustSchemaGenerator.js.map +1 -0
- package/dist/schema-generators/generators.d.ts +2 -0
- package/dist/schema-generators/generators.js +2 -0
- package/dist/schema-generators/generators.js.map +1 -1
- package/dist/schema-generators/schema-generators.d.ts +1 -0
- package/dist/schema-generators/schema-generators.js +1 -0
- package/dist/schema-generators/schema-generators.js.map +1 -1
- package/dist/sql_functions.d.ts +1 -1
- package/dist/sync_plan/evaluator/bucket_data_source.js +11 -53
- package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
- package/dist/sync_plan/evaluator/bucket_source.js +1 -1
- package/dist/sync_plan/evaluator/index.d.ts +2 -7
- package/dist/sync_plan/evaluator/index.js +7 -7
- package/dist/sync_plan/evaluator/index.js.map +1 -1
- package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +1 -1
- package/dist/sync_plan/evaluator/parameter_evaluator.js +12 -8
- package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
- package/dist/sync_plan/evaluator/row_projection.d.ts +22 -0
- package/dist/sync_plan/evaluator/row_projection.js +71 -0
- package/dist/sync_plan/evaluator/row_projection.js.map +1 -0
- package/dist/sync_plan/plan.d.ts +43 -6
- package/dist/sync_plan/plan_equality_serialized.d.ts +12 -2
- package/dist/sync_plan/plan_equality_serialized.js +56 -0
- package/dist/sync_plan/plan_equality_serialized.js.map +1 -1
- package/dist/sync_plan/schema_inference.d.ts +1 -1
- package/dist/sync_plan/schema_inference.js +1 -1
- package/dist/sync_plan/serialize.d.ts +52 -5
- package/dist/sync_plan/serialize.js +125 -20
- package/dist/sync_plan/serialize.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +43 -12
- package/dist/utils.js.map +1 -1
- package/dist/yaml_source_locations.d.ts +14 -0
- package/dist/yaml_source_locations.js +117 -0
- package/dist/yaml_source_locations.js.map +1 -0
- package/dist/yaml_validation.js.map +1 -1
- package/package.json +2 -1
- package/schema/sync_rules.json +49 -3
- package/dist/events/SqlEventDescriptor.d.ts +0 -20
- package/dist/events/SqlEventDescriptor.js +0 -51
- package/dist/events/SqlEventDescriptor.js.map +0 -1
- package/dist/events/SqlEventSourceQuery.d.ts +0 -20
- package/dist/events/SqlEventSourceQuery.js +0 -125
- package/dist/events/SqlEventSourceQuery.js.map +0 -1
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
import { parse } from 'pgsql-ast-parser';
|
|
2
|
+
import { SqlRuleError } from '../errors.js';
|
|
2
3
|
import { DangerousParameterDetector } from './detect_dangerous_parameters.js';
|
|
3
4
|
import { HashSet } from './equality.js';
|
|
4
5
|
import { NodeLocations } from './expression.js';
|
|
6
|
+
import { RowExpression, SingleDependencyExpression } from './filter.js';
|
|
5
7
|
import { CompilerModelToSyncPlan } from './ir_to_sync_plan.js';
|
|
6
8
|
import { StreamQueryParser } from './parser.js';
|
|
7
9
|
import { QuerierGraphBuilder } from './querier_graph.js';
|
|
10
|
+
import { EventRowEvaluator } from './rows.js';
|
|
8
11
|
import { SqlScope } from './scope.js';
|
|
9
12
|
/**
|
|
10
|
-
* State for compiling sync
|
|
13
|
+
* State for compiling Sync Streams and replication events into a sync plan.
|
|
11
14
|
*
|
|
12
|
-
* The
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* relations. This allows the compiler to efficiently de-duplicate parameters and buckets.
|
|
15
|
+
* The compiler stores a mutable intermediate representation that is essentially a copy of the resulting
|
|
16
|
+
* {@link SyncPlan}. Stream compilation uses JavaScript classes with behavioral equality, while events use plain
|
|
17
|
+
* compiler records. Stream queries and event definitions remain separate within that model.
|
|
16
18
|
*
|
|
17
|
-
*
|
|
19
|
+
* The stream compilation process is as follows: Each data query for a stream is first parsed by
|
|
18
20
|
* {@link StreamQueryParser} into a canonicalized intermediate representation (see that class for details).
|
|
19
21
|
* Then, {@link QuerierGraphBuilder} analyzes a chain of `AND` expressions to identify parameters (as partition keys)
|
|
20
22
|
* and their instantiation, as well as static filters that need to be added to reach row.
|
|
21
23
|
*/
|
|
22
24
|
export class SyncStreamsCompiler {
|
|
23
25
|
options;
|
|
24
|
-
output =
|
|
26
|
+
output = {
|
|
27
|
+
streams: new CompiledStreamQueries(),
|
|
28
|
+
events: []
|
|
29
|
+
};
|
|
25
30
|
locations = new NodeLocations();
|
|
26
31
|
constructor(options) {
|
|
27
32
|
this.options = options;
|
|
@@ -51,7 +56,7 @@ export class SyncStreamsCompiler {
|
|
|
51
56
|
return parser.parseAsSubquery(stmt);
|
|
52
57
|
}
|
|
53
58
|
/**
|
|
54
|
-
* Utility for compiling a
|
|
59
|
+
* Utility for compiling a Sync Stream.
|
|
55
60
|
*
|
|
56
61
|
* @param options Name, priority and `auto_subscribe` state for the stream.
|
|
57
62
|
*/
|
|
@@ -94,10 +99,108 @@ export class SyncStreamsCompiler {
|
|
|
94
99
|
}
|
|
95
100
|
};
|
|
96
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Compiles the payload queries for a named replication event.
|
|
104
|
+
*
|
|
105
|
+
* Event queries intentionally support a smaller surface than stream queries: They must project and filter a single
|
|
106
|
+
* physical source table and cannot depend on request parameters, joins, subqueries or table-valued functions.
|
|
107
|
+
*/
|
|
108
|
+
event(name) {
|
|
109
|
+
const event = { name, sourceQueries: [] };
|
|
110
|
+
this.output.events.push(event);
|
|
111
|
+
return {
|
|
112
|
+
addSourceQuery: (sql, errors) => {
|
|
113
|
+
const stmt = tryParse(sql, errors);
|
|
114
|
+
if (stmt == null) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
let statementToCompile = stmt;
|
|
118
|
+
if (this.options.compileEventPayloadFilters === false && stmt.type == 'select' && stmt.where != null) {
|
|
119
|
+
errors.report('`WHERE` clauses in legacy event payload queries are ignored. Redeploy this sync config with edition 3 to validate and enable them.', stmt.where, { isWarning: true });
|
|
120
|
+
statementToCompile = { ...stmt, where: undefined };
|
|
121
|
+
}
|
|
122
|
+
const parser = new StreamQueryParser({
|
|
123
|
+
compiler: this,
|
|
124
|
+
originalText: sql,
|
|
125
|
+
locations: this.locations,
|
|
126
|
+
parentScope: new SqlScope({}),
|
|
127
|
+
errors
|
|
128
|
+
});
|
|
129
|
+
const query = parser.parse(statementToCompile);
|
|
130
|
+
if (query == null) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (query.joined.length != 0) {
|
|
134
|
+
errors.report('Event payload queries must SELECT from a single physical source table.', query.span.location);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const variants = [];
|
|
138
|
+
let valid = true;
|
|
139
|
+
for (const variant of query.where.terms) {
|
|
140
|
+
const filters = [];
|
|
141
|
+
for (const term of variant.terms) {
|
|
142
|
+
if (!(term instanceof SingleDependencyExpression) ||
|
|
143
|
+
term.dependsOnConnection ||
|
|
144
|
+
(term.resultSet != null && term.resultSet !== query.sourceTable)) {
|
|
145
|
+
errors.report('Event payload queries cannot depend on request parameters or other tables.', term instanceof SingleDependencyExpression ? term.expression.location.location : term.location);
|
|
146
|
+
valid = false;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
filters.push(new RowExpression(term));
|
|
150
|
+
}
|
|
151
|
+
variants.push(new EventRowEvaluator({
|
|
152
|
+
columns: query.resultColumns,
|
|
153
|
+
syntacticSource: query.sourceTable,
|
|
154
|
+
filters,
|
|
155
|
+
partitionBy: [],
|
|
156
|
+
addedFunctions: []
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
if (valid) {
|
|
160
|
+
event.sourceQueries.push({ sql, sourceTable: query.sourceTable, variants });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @returns A sync plan representing an immutable snapshot of the compiler output.
|
|
167
|
+
*/
|
|
168
|
+
toSyncPlan() {
|
|
169
|
+
const translator = new CompilerModelToSyncPlan();
|
|
170
|
+
return translator.translate(this.output);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Compiles raw event definitions from legacy sync plans into the current plan representation.
|
|
175
|
+
*
|
|
176
|
+
* All definitions share one compiler to match normal sync-config compilation. Callers should reject fatal errors
|
|
177
|
+
* rather than carrying invalid legacy event evaluators into a {@link SyncPlan}.
|
|
178
|
+
*/
|
|
179
|
+
export function compileEventDefinitions(definitions, options) {
|
|
180
|
+
const compiler = new SyncStreamsCompiler(options);
|
|
181
|
+
const errors = [];
|
|
182
|
+
for (const [name, queries] of Object.entries(definitions)) {
|
|
183
|
+
const event = compiler.event(name);
|
|
184
|
+
for (const sql of queries) {
|
|
185
|
+
event.addSourceQuery(sql, {
|
|
186
|
+
report(message, location, reportOptions) {
|
|
187
|
+
const error = new SqlRuleError(message, sql, location);
|
|
188
|
+
error.type = reportOptions?.isWarning ? 'warning' : 'fatal';
|
|
189
|
+
errors.push(error);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { events: compiler.toSyncPlan().events, errors };
|
|
97
195
|
}
|
|
98
196
|
function tryParse(sql, errors) {
|
|
99
197
|
try {
|
|
100
|
-
const
|
|
198
|
+
const statements = parse(sql, { locationTracking: true });
|
|
199
|
+
if (statements.length != 1) {
|
|
200
|
+
errors.report('Only a single SELECT statement is supported', statements[1]?._location ?? { start: 0, end: sql.length });
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const [stmt] = statements;
|
|
101
204
|
return stmt;
|
|
102
205
|
}
|
|
103
206
|
catch (e) {
|
|
@@ -132,12 +235,5 @@ export class CompiledStreamQueries {
|
|
|
132
235
|
canonicalizePointLookup(lookup) {
|
|
133
236
|
return this._pointLookups.getOrInsert(lookup)[0];
|
|
134
237
|
}
|
|
135
|
-
/**
|
|
136
|
-
* @returns A sync plan representing an immutable snapshot of this intermediate representation.
|
|
137
|
-
*/
|
|
138
|
-
toSyncPlan() {
|
|
139
|
-
const translator = new CompilerModelToSyncPlan();
|
|
140
|
-
return translator.translate(this);
|
|
141
|
-
}
|
|
142
238
|
}
|
|
143
239
|
//# sourceMappingURL=compiler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAqB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { SqliteParameterValue } from '../types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Stable value-based hashcodes for JavaScript. The
|
|
3
|
+
* Stable value-based hashcodes for JavaScript. The Sync Streams compiler uses hashmaps derived from this to efficiently
|
|
4
4
|
* de-duplicate equivalent expressions and lookups.
|
|
5
5
|
*
|
|
6
6
|
* This is copied from Dart SDK sources, which in turn based the algorithm on Jenkins hash functions.
|
|
7
7
|
*
|
|
8
8
|
* Because hash codes are stable across restarts, they should not be used for untrusted inputs to avoid attacks
|
|
9
9
|
* provoking hash collisions and subpar hashmap performance. The sync rules package only uses these hashes to compile
|
|
10
|
-
*
|
|
10
|
+
* Sync Streams, but the compiled IR processing source rows does not need these hashes.
|
|
11
11
|
*/
|
|
12
12
|
export declare class StableHasher {
|
|
13
13
|
private static readonly seed;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Stable value-based hashcodes for JavaScript. The
|
|
2
|
+
* Stable value-based hashcodes for JavaScript. The Sync Streams compiler uses hashmaps derived from this to efficiently
|
|
3
3
|
* de-duplicate equivalent expressions and lookups.
|
|
4
4
|
*
|
|
5
5
|
* This is copied from Dart SDK sources, which in turn based the algorithm on Jenkins hash functions.
|
|
6
6
|
*
|
|
7
7
|
* Because hash codes are stable across restarts, they should not be used for untrusted inputs to avoid attacks
|
|
8
8
|
* provoking hash collisions and subpar hashmap performance. The sync rules package only uses these hashes to compile
|
|
9
|
-
*
|
|
9
|
+
* Sync Streams, but the compiled IR processing source rows does not need these hashes.
|
|
10
10
|
*/
|
|
11
11
|
export class StableHasher {
|
|
12
12
|
static seed = 614160925; // 'PowerSync'.hashCode on the Dart VM
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Expr, NodeLocation, PGNode } from 'pgsql-ast-parser';
|
|
2
2
|
import { SqlExpression } from '../sync_plan/expression.js';
|
|
3
3
|
import { ConnectionParameterSource } from '../sync_plan/plan.js';
|
|
4
|
-
import {
|
|
4
|
+
import { EqualsIgnoringPrimaryResultSet, TableValuedFunctionEquality } from './compatibility.js';
|
|
5
5
|
import { ParsingErrorListener } from './compiler.js';
|
|
6
|
-
import { StableHasher } from './equality.js';
|
|
6
|
+
import { Equatable, StableHasher } from './equality.js';
|
|
7
7
|
import { SourceResultSet } from './table.js';
|
|
8
8
|
/**
|
|
9
9
|
* An analyzed SQL expression tracking dependencies on non-static data (i.e. rows or connection sources).
|
|
10
10
|
*
|
|
11
|
-
* Consider the
|
|
11
|
+
* Consider the Sync Stream `SELECT * FROM issues WHERE is_public OR auth.param('is_admin')`. To be able to explicitly
|
|
12
12
|
* track dependencies referenced in expressions, we transform them into a {@link SyncExpression}. For the `WHERE` clause
|
|
13
13
|
* in that example, the {@link sqlExpression} would be `?1 OR (?2 ->> 'is_admin')`, where `?1` is a {@link ColumnInRow}
|
|
14
14
|
* and `?2` is a {@link ConnectionParameter}.
|
|
@@ -16,7 +16,7 @@ import { SourceResultSet } from './table.js';
|
|
|
16
16
|
* Once in this form, it's easy to reason about dependencies in expressions (used to later generate parameter match
|
|
17
17
|
* clauses) and to evaluate expressions at runtime (by preparing them as a statement and binding external values).
|
|
18
18
|
*/
|
|
19
|
-
export declare class SyncExpression implements
|
|
19
|
+
export declare class SyncExpression implements EqualsIgnoringPrimaryResultSet {
|
|
20
20
|
#private;
|
|
21
21
|
/**
|
|
22
22
|
* The AST node backing {@link sql}.
|
|
@@ -46,26 +46,26 @@ export declare class SyncExpression implements EqualsIgnoringResultSet {
|
|
|
46
46
|
* We use this to be able to compose expressions, e.g. to possibly merge them.
|
|
47
47
|
*/
|
|
48
48
|
node: SqlExpression<ExpressionInput>, locations: NodeLocations);
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet, tableValued: TableValuedFunctionEquality): boolean;
|
|
50
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
51
51
|
}
|
|
52
52
|
export type ExpressionInput = ColumnInRow | RowMetadata | ConnectionParameter;
|
|
53
53
|
/**
|
|
54
54
|
* An expression input resolved against a row of a result set: either a column value or metadata about the row's
|
|
55
55
|
* source table.
|
|
56
56
|
*/
|
|
57
|
-
export declare abstract class RowReference implements
|
|
57
|
+
export declare abstract class RowReference implements EqualsIgnoringPrimaryResultSet {
|
|
58
58
|
readonly syntacticOrigin: Expr;
|
|
59
59
|
readonly resultSet: SourceResultSet;
|
|
60
60
|
constructor(syntacticOrigin: Expr, resultSet: SourceResultSet);
|
|
61
|
-
abstract
|
|
62
|
-
abstract
|
|
61
|
+
abstract equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet, tableValued: TableValuedFunctionEquality): boolean;
|
|
62
|
+
abstract assumingSamePrimaryResultSetEqualityHashCode(tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
63
63
|
}
|
|
64
64
|
export declare class ColumnInRow extends RowReference {
|
|
65
65
|
readonly column: string;
|
|
66
66
|
constructor(syntacticOrigin: Expr, resultSet: SourceResultSet, column: string);
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet, tableValued: TableValuedFunctionEquality): boolean;
|
|
68
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
69
69
|
}
|
|
70
70
|
export type RowMetadataKind = 'schema' | 'table_name' | 'table_suffix';
|
|
71
71
|
/**
|
|
@@ -76,21 +76,23 @@ export type RowMetadataKind = 'schema' | 'table_name' | 'table_suffix';
|
|
|
76
76
|
export declare class RowMetadata extends RowReference {
|
|
77
77
|
readonly kind: RowMetadataKind;
|
|
78
78
|
constructor(syntacticOrigin: Expr, resultSet: SourceResultSet, kind: RowMetadataKind);
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet): boolean;
|
|
80
|
+
assumingSamePrimaryResultSetEqualityHashCode(_tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
81
81
|
}
|
|
82
|
-
export declare class ConnectionParameter implements
|
|
82
|
+
export declare class ConnectionParameter implements EqualsIgnoringPrimaryResultSet, Equatable {
|
|
83
83
|
readonly syntacticOrigin: Expr;
|
|
84
84
|
readonly source: ConnectionParameterSource;
|
|
85
85
|
constructor(syntacticOrigin: Expr, source: ConnectionParameterSource);
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
equals(other: unknown): boolean;
|
|
87
|
+
buildHash(hasher: StableHasher): void;
|
|
88
|
+
equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet): boolean;
|
|
89
|
+
assumingSamePrimaryResultSetEqualityHashCode(_tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
88
90
|
}
|
|
89
91
|
/**
|
|
90
92
|
* Tracks the original source location for translated {@link SqlExpression} nodes.
|
|
91
93
|
*
|
|
92
94
|
* We want to serialize translated expressions for sync plan, so embedding source offsets in them expands the size of
|
|
93
|
-
* sync plans and is tedious. We only need access to node locations while compiling
|
|
95
|
+
* sync plans and is tedious. We only need access to node locations while compiling Sync Streams, which we store in this
|
|
94
96
|
* in-memory map.
|
|
95
97
|
*/
|
|
96
98
|
export declare class NodeLocations {
|
|
@@ -102,7 +104,7 @@ export interface SourceLocation {
|
|
|
102
104
|
/**
|
|
103
105
|
* An error reporter that can understand the given {@link location}.
|
|
104
106
|
*
|
|
105
|
-
* Because
|
|
107
|
+
* Because Sync Streams might be composed of multiple source statements (like common table expressions) that can
|
|
106
108
|
* ultimately only be fully analyzed together, this is necessary to ensure we can report errors on the correct source
|
|
107
109
|
* everywhere.
|
|
108
110
|
*/
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { getLocation } from '../errors.js';
|
|
2
2
|
import { ExpressionToSqlite } from '../sync_plan/expression_to_sql.js';
|
|
3
3
|
import { RecursiveExpressionVisitor } from '../sync_plan/expression_visitor.js';
|
|
4
|
-
import { equalsIgnoringResultSetList } from './compatibility.js';
|
|
5
4
|
/**
|
|
6
5
|
* An analyzed SQL expression tracking dependencies on non-static data (i.e. rows or connection sources).
|
|
7
6
|
*
|
|
8
|
-
* Consider the
|
|
7
|
+
* Consider the Sync Stream `SELECT * FROM issues WHERE is_public OR auth.param('is_admin')`. To be able to explicitly
|
|
9
8
|
* track dependencies referenced in expressions, we transform them into a {@link SyncExpression}. For the `WHERE` clause
|
|
10
9
|
* in that example, the {@link sqlExpression} would be `?1 OR (?2 ->> 'is_admin')`, where `?1` is a {@link ColumnInRow}
|
|
11
10
|
* and `?2` is a {@link ConnectionParameter}.
|
|
@@ -53,14 +52,14 @@ export class SyncExpression {
|
|
|
53
52
|
this.node = node;
|
|
54
53
|
this.locations = locations;
|
|
55
54
|
}
|
|
56
|
-
|
|
55
|
+
equalsAssumingSamePrimaryResultSet(other, tableValued) {
|
|
57
56
|
return (other instanceof SyncExpression &&
|
|
58
57
|
other.sql == this.sql &&
|
|
59
|
-
|
|
58
|
+
tableValued.listEquality.equals(other.instantiation, this.instantiation));
|
|
60
59
|
}
|
|
61
|
-
|
|
60
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued, hasher) {
|
|
62
61
|
hasher.addString(this.sql);
|
|
63
|
-
|
|
62
|
+
tableValued.listEquality.hash(hasher, this.instantiation);
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
class FindExternalData extends RecursiveExpressionVisitor {
|
|
@@ -90,11 +89,14 @@ export class ColumnInRow extends RowReference {
|
|
|
90
89
|
super(syntacticOrigin, resultSet);
|
|
91
90
|
this.column = column;
|
|
92
91
|
}
|
|
93
|
-
|
|
94
|
-
return other instanceof ColumnInRow &&
|
|
92
|
+
equalsAssumingSamePrimaryResultSet(other, tableValued) {
|
|
93
|
+
return (other instanceof ColumnInRow &&
|
|
94
|
+
other.column == this.column &&
|
|
95
|
+
tableValued.resultSetEquals(other.resultSet, this.resultSet));
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued, hasher) {
|
|
97
98
|
hasher.addString(this.column);
|
|
99
|
+
tableValued.hashResultSet(hasher, this.resultSet);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
/**
|
|
@@ -108,10 +110,11 @@ export class RowMetadata extends RowReference {
|
|
|
108
110
|
super(syntacticOrigin, resultSet);
|
|
109
111
|
this.kind = kind;
|
|
110
112
|
}
|
|
111
|
-
|
|
113
|
+
equalsAssumingSamePrimaryResultSet(other) {
|
|
114
|
+
// Row metadata is always on the primary result set, so no need to hash the result set here.
|
|
112
115
|
return other instanceof RowMetadata && other.kind == this.kind;
|
|
113
116
|
}
|
|
114
|
-
|
|
117
|
+
assumingSamePrimaryResultSetEqualityHashCode(_tableValued, hasher) {
|
|
115
118
|
hasher.addString(`table.${this.kind}`);
|
|
116
119
|
}
|
|
117
120
|
}
|
|
@@ -122,18 +125,24 @@ export class ConnectionParameter {
|
|
|
122
125
|
this.syntacticOrigin = syntacticOrigin;
|
|
123
126
|
this.source = source;
|
|
124
127
|
}
|
|
125
|
-
|
|
128
|
+
equals(other) {
|
|
126
129
|
return other instanceof ConnectionParameter && other.source == this.source;
|
|
127
130
|
}
|
|
128
|
-
|
|
131
|
+
buildHash(hasher) {
|
|
129
132
|
hasher.addString(this.source);
|
|
130
133
|
}
|
|
134
|
+
equalsAssumingSamePrimaryResultSet(other) {
|
|
135
|
+
return this.equals(other);
|
|
136
|
+
}
|
|
137
|
+
assumingSamePrimaryResultSetEqualityHashCode(_tableValued, hasher) {
|
|
138
|
+
return this.buildHash(hasher);
|
|
139
|
+
}
|
|
131
140
|
}
|
|
132
141
|
/**
|
|
133
142
|
* Tracks the original source location for translated {@link SqlExpression} nodes.
|
|
134
143
|
*
|
|
135
144
|
* We want to serialize translated expressions for sync plan, so embedding source offsets in them expands the size of
|
|
136
|
-
* sync plans and is tedious. We only need access to node locations while compiling
|
|
145
|
+
* sync plans and is tedious. We only need access to node locations while compiling Sync Streams, which we store in this
|
|
137
146
|
* in-memory map.
|
|
138
147
|
*/
|
|
139
148
|
export class NodeLocations {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/compiler/expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/compiler/expression.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NodeLocation } from 'pgsql-ast-parser';
|
|
2
|
-
import {
|
|
2
|
+
import { EqualsIgnoringPrimaryResultSet, TableValuedFunctionEquality } from './compatibility.js';
|
|
3
3
|
import { StableHasher } from './equality.js';
|
|
4
4
|
import { ExpressionInput, SyncExpression } from './expression.js';
|
|
5
5
|
import { SourceResultSet } from './table.js';
|
|
@@ -21,7 +21,7 @@ export declare function isBaseTerm(value: unknown): value is BaseTerm;
|
|
|
21
21
|
/**
|
|
22
22
|
* A {@link SyncExpression} that only depends on a single result set or connection data.
|
|
23
23
|
*/
|
|
24
|
-
export declare class SingleDependencyExpression implements
|
|
24
|
+
export declare class SingleDependencyExpression implements EqualsIgnoringPrimaryResultSet {
|
|
25
25
|
readonly expression: SyncExpression;
|
|
26
26
|
/**
|
|
27
27
|
* The single result set on which the expression depends on.
|
|
@@ -34,8 +34,8 @@ export declare class SingleDependencyExpression implements EqualsIgnoringResultS
|
|
|
34
34
|
*/
|
|
35
35
|
readonly dependsOnConnection: boolean;
|
|
36
36
|
constructor(expression: SyncExpression | SingleDependencyExpression);
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
equalsAssumingSamePrimaryResultSet(other: EqualsIgnoringPrimaryResultSet, tableValued: TableValuedFunctionEquality): boolean;
|
|
38
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued: TableValuedFunctionEquality, hasher: StableHasher): void;
|
|
39
39
|
/**
|
|
40
40
|
* If all inputs have a single dependency, returns either the result set they all depend on or `null` and whether they
|
|
41
41
|
* depend on connection data.
|
package/dist/compiler/filter.js
CHANGED
|
@@ -35,11 +35,12 @@ export class SingleDependencyExpression {
|
|
|
35
35
|
this.dependsOnConnection = expression.dependsOnConnection;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
return other instanceof SingleDependencyExpression &&
|
|
38
|
+
equalsAssumingSamePrimaryResultSet(other, tableValued) {
|
|
39
|
+
return (other instanceof SingleDependencyExpression &&
|
|
40
|
+
other.expression.equalsAssumingSamePrimaryResultSet(this.expression, tableValued));
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
-
this.expression.
|
|
42
|
+
assumingSamePrimaryResultSetEqualityHashCode(tableValued, hasher) {
|
|
43
|
+
this.expression.assumingSamePrimaryResultSetEqualityHashCode(tableValued, hasher);
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* If all inputs have a single dependency, returns either the result set they all depend on or `null` and whether they
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/compiler/filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAmB,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAmBlE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,KAAK,YAAY,0BAA0B,IAAI,KAAK,YAAY,YAAY,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAC5B,UAAU,CAAiB;IACpC;;;;OAIG;IACM,SAAS,CAAyB;IAE3C;;OAEG;IACM,mBAAmB,CAAU;IAEtC,YAAY,UAAuD;QACjE,IAAI,UAAU,YAAY,cAAc,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,0BAA0B,CAAC,uBAAuB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC7F,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,sBAAsB,CAAC,4EAA4E,CAAC,CAAC;YACjH,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YACtC,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,mBAAmB,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/compiler/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plan from '../sync_plan/plan.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { SyncPlanCompilerModel } from './compiler.js';
|
|
3
3
|
export declare class CompilerModelToSyncPlan {
|
|
4
4
|
private static readonly evaluatorHash;
|
|
5
5
|
private mappedObjects;
|
|
@@ -25,11 +25,12 @@ export declare class CompilerModelToSyncPlan {
|
|
|
25
25
|
*/
|
|
26
26
|
private evaluatorsToBuckets;
|
|
27
27
|
private translateStatefulObject;
|
|
28
|
-
translate(source:
|
|
28
|
+
translate(source: SyncPlanCompilerModel): plan.SyncPlan;
|
|
29
29
|
private createBucketSource;
|
|
30
30
|
private translatePartitionKey;
|
|
31
31
|
private translateAddedTableValuedFunctions;
|
|
32
32
|
private translateRowEvaluator;
|
|
33
|
+
private translateRowProjection;
|
|
33
34
|
private translatePointLookup;
|
|
34
35
|
/**
|
|
35
36
|
* @param expression The expression to translate.
|
|
@@ -42,4 +43,5 @@ export declare class CompilerModelToSyncPlan {
|
|
|
42
43
|
private translateStreamResolver;
|
|
43
44
|
private translateExpandingLookup;
|
|
44
45
|
private translateParameterValue;
|
|
46
|
+
private translateCompiledEvent;
|
|
45
47
|
}
|