@balena/abstract-sql-compiler 7.16.0 → 7.17.0-referenced-fields-having-840c19f79f34dcc5f8d8b95beb7273ae3a3fdfb5

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.
@@ -1,3 +1,25 @@
1
+ - commits:
2
+ - subject: Avoid the operation type optimization for HAVING clauses
3
+ hash: 840c19f79f34dcc5f8d8b95beb7273ae3a3fdfb5
4
+ body: |
5
+ Since it's possible for them to behave in a way that violates the
6
+ safety checks we'll disable them until we can add specific checks
7
+ for the HAVING clause
8
+ footer:
9
+ Change-type: patch
10
+ change-type: patch
11
+ author: Pagan Gazzard
12
+ nested: []
13
+ - subject: Add support for `Count` nodes in rule referenced fields
14
+ hash: 19270d3b6993302d73fff083be322bcb489b3303
15
+ body: ''
16
+ footer:
17
+ Change-type: minor
18
+ change-type: minor
19
+ author: Pagan Gazzard
20
+ nested: []
21
+ version: 7.17.0
22
+ date: 2021-12-14T18:09:00.998Z
1
23
  - commits:
2
24
  - subject: Add support for `From` nodes in rule referenced fields
3
25
  hash: d9a35a0c0fc69dc21f5aa2003607172d0e9a4579
@@ -8,7 +30,7 @@
8
30
  author: Pagan Gazzard
9
31
  nested: []
10
32
  version: 7.16.0
11
- date: 2021-12-14T16:32:39.157Z
33
+ date: 2021-12-14T15:56:49.623Z
12
34
  - commits:
13
35
  - subject: Add support for `HAVING` clauses
14
36
  hash: ce33ddd42751abbbc190074a5b6a1b63dc24f51e
package/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file
4
4
  automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
5
5
  This project adheres to [Semantic Versioning](http://semver.org/).
6
6
 
7
+ ## 7.17.0 - 2021-12-14
8
+
9
+ * Avoid the operation type optimization for HAVING clauses [Pagan Gazzard]
10
+ * Add support for `Count` nodes in rule referenced fields [Pagan Gazzard]
11
+
7
12
  ## 7.16.0 - 2021-12-14
8
13
 
9
14
  * Add support for `From` nodes in rule referenced fields [Pagan Gazzard]
@@ -16,6 +16,7 @@ var IsSafe;
16
16
  IsSafe["Unknown"] = "";
17
17
  })(IsSafe || (IsSafe = {}));
18
18
  const getRuleReferencedScope = (rulePart, scope, isSafe) => {
19
+ const currentlyScopedAliases = [];
19
20
  scope = { ...scope };
20
21
  const fromNodes = rulePart.filter(AbstractSQLCompiler_1.isFromNode);
21
22
  fromNodes.forEach((node) => {
@@ -25,6 +26,7 @@ const getRuleReferencedScope = (rulePart, scope, isSafe) => {
25
26
  if (typeof alias !== 'string') {
26
27
  throw new Error('Cannot handle non-string aliases');
27
28
  }
29
+ currentlyScopedAliases.push(alias);
28
30
  switch (from[0]) {
29
31
  case 'Table':
30
32
  scope[alias] = { tableName: from[1], isSafe };
@@ -37,13 +39,14 @@ const getRuleReferencedScope = (rulePart, scope, isSafe) => {
37
39
  }
38
40
  }
39
41
  else if (nested[0] === 'Table') {
42
+ currentlyScopedAliases.push(nested[1]);
40
43
  scope[nested[1]] = { tableName: nested[1], isSafe };
41
44
  }
42
45
  else {
43
46
  throw Error(`Unsupported FromNode for scoping: ${nested[0]}`);
44
47
  }
45
48
  });
46
- return scope;
49
+ return { scope, currentlyScopedAliases };
47
50
  };
48
51
  const addReference = (referencedFields, scope, aliasName, fieldName) => {
49
52
  var _a;
@@ -64,15 +67,21 @@ const addReference = (referencedFields, scope, aliasName, fieldName) => {
64
67
  referencedFields[a.tableName].update.push(fieldName);
65
68
  }
66
69
  };
67
- const $getRuleReferencedFields = (referencedFields, rulePart, isSafe, scope = {}) => {
70
+ const $getRuleReferencedFields = (referencedFields, rulePart, isSafe, { scope, currentlyScopedAliases, } = {
71
+ scope: {},
72
+ currentlyScopedAliases: [],
73
+ }) => {
68
74
  if (!Array.isArray(rulePart)) {
69
75
  return;
70
76
  }
71
77
  switch (rulePart[0]) {
72
78
  case 'SelectQuery':
73
- scope = getRuleReferencedScope(rulePart, scope, isSafe);
79
+ ({ scope, currentlyScopedAliases } = getRuleReferencedScope(rulePart, scope, isSafe));
74
80
  rulePart.forEach((node) => {
75
- $getRuleReferencedFields(referencedFields, node, isSafe, scope);
81
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
82
+ scope,
83
+ currentlyScopedAliases,
84
+ });
76
85
  });
77
86
  return;
78
87
  case 'ReferencedField': {
@@ -105,12 +114,38 @@ const $getRuleReferencedFields = (referencedFields, rulePart, isSafe, scope = {}
105
114
  case 'And':
106
115
  case 'Exists':
107
116
  rulePart.forEach((node) => {
108
- $getRuleReferencedFields(referencedFields, node, isSafe, scope);
117
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
118
+ scope,
119
+ currentlyScopedAliases,
120
+ });
109
121
  });
110
122
  return;
123
+ case 'Having':
124
+ scope = { ...scope };
125
+ for (const key of Object.keys(scope)) {
126
+ scope[key] = { ...scope[key], isSafe: IsSafe.Unknown };
127
+ }
128
+ rulePart.forEach((node) => {
129
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
130
+ scope,
131
+ currentlyScopedAliases,
132
+ });
133
+ });
134
+ return;
135
+ case 'Count':
136
+ if (rulePart[1] !== '*') {
137
+ throw new Error('Only COUNT(*) is supported for rule referenced fields');
138
+ }
139
+ for (const aliasName of currentlyScopedAliases) {
140
+ addReference(referencedFields, scope, aliasName, '');
141
+ }
142
+ return;
111
143
  default:
112
144
  rulePart.forEach((node) => {
113
- $getRuleReferencedFields(referencedFields, node, IsSafe.Unknown, scope);
145
+ $getRuleReferencedFields(referencedFields, node, IsSafe.Unknown, {
146
+ scope,
147
+ currentlyScopedAliases,
148
+ });
114
149
  });
115
150
  }
116
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"referenced-fields.js","sourceRoot":"","sources":["../src/referenced-fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"referenced-fields.js","sourceRoot":"","sources":["../src/referenced-fields.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@balena/abstract-sql-compiler",
3
- "version": "7.16.0",
3
+ "version": "7.17.0-referenced-fields-having-840c19f79f34dcc5f8d8b95beb7273ae3a3fdfb5",
4
4
  "description": "A translator for abstract sql into sql.",
5
5
  "main": "out/AbstractSQLCompiler.js",
6
6
  "types": "out/AbstractSQLCompiler.d.ts",
@@ -63,6 +63,6 @@
63
63
  ]
64
64
  },
65
65
  "versionist": {
66
- "publishedAt": "2021-12-14T16:32:39.330Z"
66
+ "publishedAt": "2021-12-14T18:09:01.155Z"
67
67
  }
68
68
  }
@@ -48,7 +48,8 @@ const getRuleReferencedScope = (
48
48
  rulePart: AbstractSqlQuery,
49
49
  scope: RuleReferencedScope,
50
50
  isSafe: IsSafe,
51
- ): RuleReferencedScope => {
51
+ ): { scope: RuleReferencedScope; currentlyScopedAliases: string[] } => {
52
+ const currentlyScopedAliases: string[] = [];
52
53
  scope = { ...scope };
53
54
  const fromNodes = rulePart.filter(isFromNode);
54
55
  fromNodes.forEach((node) => {
@@ -58,6 +59,7 @@ const getRuleReferencedScope = (
58
59
  if (typeof alias !== 'string') {
59
60
  throw new Error('Cannot handle non-string aliases');
60
61
  }
62
+ currentlyScopedAliases.push(alias);
61
63
  switch (from[0]) {
62
64
  case 'Table':
63
65
  scope[alias] = { tableName: from[1], isSafe };
@@ -72,12 +74,13 @@ const getRuleReferencedScope = (
72
74
  throw new Error(`Cannot handle aliased ${from[0]} nodes`);
73
75
  }
74
76
  } else if (nested[0] === 'Table') {
77
+ currentlyScopedAliases.push(nested[1]);
75
78
  scope[nested[1]] = { tableName: nested[1], isSafe };
76
79
  } else {
77
80
  throw Error(`Unsupported FromNode for scoping: ${nested[0]}`);
78
81
  }
79
82
  });
80
- return scope;
83
+ return { scope, currentlyScopedAliases };
81
84
  };
82
85
  const addReference = (
83
86
  referencedFields: RuleReferencedFields,
@@ -107,7 +110,13 @@ const $getRuleReferencedFields = (
107
110
  referencedFields: RuleReferencedFields,
108
111
  rulePart: AbstractSqlQuery,
109
112
  isSafe: IsSafe,
110
- scope: RuleReferencedScope = {},
113
+ {
114
+ scope,
115
+ currentlyScopedAliases,
116
+ }: ReturnType<typeof getRuleReferencedScope> = {
117
+ scope: {},
118
+ currentlyScopedAliases: [],
119
+ },
111
120
  ) => {
112
121
  if (!Array.isArray(rulePart)) {
113
122
  return;
@@ -115,9 +124,16 @@ const $getRuleReferencedFields = (
115
124
  switch (rulePart[0]) {
116
125
  case 'SelectQuery':
117
126
  // Update the current scope before trying to resolve field references
118
- scope = getRuleReferencedScope(rulePart, scope, isSafe);
127
+ ({ scope, currentlyScopedAliases } = getRuleReferencedScope(
128
+ rulePart,
129
+ scope,
130
+ isSafe,
131
+ ));
119
132
  rulePart.forEach((node: AbstractSqlQuery) => {
120
- $getRuleReferencedFields(referencedFields, node, isSafe, scope);
133
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
134
+ scope,
135
+ currentlyScopedAliases,
136
+ });
121
137
  });
122
138
  return;
123
139
  case 'ReferencedField': {
@@ -152,12 +168,43 @@ const $getRuleReferencedFields = (
152
168
  case 'And':
153
169
  case 'Exists':
154
170
  rulePart.forEach((node: AbstractSqlQuery) => {
155
- $getRuleReferencedFields(referencedFields, node, isSafe, scope);
171
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
172
+ scope,
173
+ currentlyScopedAliases,
174
+ });
156
175
  });
157
176
  return;
177
+ case 'Having':
178
+ scope = { ...scope };
179
+ for (const key of Object.keys(scope)) {
180
+ // Treat all entries under a `HAVING` as unknown since it can include counts in such a way
181
+ // that our expectations of safety do not hold
182
+ scope[key] = { ...scope[key], isSafe: IsSafe.Unknown };
183
+ }
184
+ rulePart.forEach((node: AbstractSqlQuery) => {
185
+ $getRuleReferencedFields(referencedFields, node, isSafe, {
186
+ scope,
187
+ currentlyScopedAliases,
188
+ });
189
+ });
190
+ return;
191
+ case 'Count':
192
+ if (rulePart[1] !== '*') {
193
+ throw new Error(
194
+ 'Only COUNT(*) is supported for rule referenced fields',
195
+ );
196
+ }
197
+ for (const aliasName of currentlyScopedAliases) {
198
+ // We use '' as it means that only operations that affect every field will match against it
199
+ addReference(referencedFields, scope, aliasName, '');
200
+ }
201
+ return;
158
202
  default:
159
203
  rulePart.forEach((node: AbstractSqlQuery) => {
160
- $getRuleReferencedFields(referencedFields, node, IsSafe.Unknown, scope);
204
+ $getRuleReferencedFields(referencedFields, node, IsSafe.Unknown, {
205
+ scope,
206
+ currentlyScopedAliases,
207
+ });
161
208
  });
162
209
  }
163
210
  };
@@ -141,6 +141,25 @@ describe('getRuleReferencedFields', () => {
141
141
  });
142
142
  });
143
143
 
144
+ it('should work with single table SELECT NOT EXISTS for COUNT(*)', () => {
145
+ expect(
146
+ AbstractSqlCompiler.postgres.getRuleReferencedFields([
147
+ 'NotExists',
148
+ [
149
+ 'SelectQuery',
150
+ ['Select', [['Count', '*']]],
151
+ ['From', ['Table', 'test']],
152
+ ],
153
+ ] as AbstractSqlCompiler.AbstractSqlQuery),
154
+ ).to.deep.equal({
155
+ test: {
156
+ create: [''],
157
+ update: [''],
158
+ delete: [],
159
+ },
160
+ });
161
+ });
162
+
144
163
  it('should work with nested NOT EXISTS', () => {
145
164
  expect(
146
165
  AbstractSqlCompiler.postgres.getRuleReferencedFields([
@@ -219,4 +238,74 @@ describe('getRuleReferencedFields', () => {
219
238
  },
220
239
  });
221
240
  });
241
+
242
+ it('should work with nested NOT EXISTS', () => {
243
+ expect(
244
+ AbstractSqlCompiler.postgres.getRuleReferencedFields([
245
+ 'Not',
246
+ [
247
+ 'Exists',
248
+ [
249
+ 'SelectQuery',
250
+ ['Select', []],
251
+ ['From', ['test', 'test.0']],
252
+ [
253
+ 'Where',
254
+ [
255
+ 'Not',
256
+ [
257
+ 'Exists',
258
+ [
259
+ 'SelectQuery',
260
+ ['Select', [['Count', '*']]],
261
+ ['From', ['test2', 'test2.0']],
262
+ [
263
+ 'Where',
264
+ [
265
+ 'Equals',
266
+ ['ReferencedField', 'test.0', 'id'],
267
+ ['ReferencedField', 'test2.0', 'test'],
268
+ ],
269
+ ],
270
+ ],
271
+ ],
272
+ ],
273
+ ],
274
+ ],
275
+ ],
276
+ ] as AbstractSqlCompiler.AbstractSqlQuery),
277
+ ).to.deep.equal({
278
+ test: {
279
+ create: ['id'],
280
+ update: ['id'],
281
+ delete: [],
282
+ },
283
+ test2: {
284
+ create: [],
285
+ update: ['', 'test'],
286
+ delete: ['', 'test'],
287
+ },
288
+ });
289
+ });
290
+
291
+ it('HAVING clauses should not be subject to the operation typecheck optimization', () => {
292
+ expect(
293
+ AbstractSqlCompiler.postgres.getRuleReferencedFields([
294
+ 'NotExists',
295
+ [
296
+ 'SelectQuery',
297
+ ['Select', []],
298
+ ['From', ['Table', 'test']],
299
+ ['GroupBy', [['ReferencedField', 'test', 'field']]],
300
+ ['Having', ['GreaterThanOrEqual', ['Count', '*'], ['Number', 2]]],
301
+ ],
302
+ ] as AbstractSqlCompiler.AbstractSqlQuery),
303
+ ).to.deep.equal({
304
+ test: {
305
+ create: ['field', ''],
306
+ update: ['field', ''],
307
+ delete: [''],
308
+ },
309
+ });
310
+ });
222
311
  });