@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-
|
|
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]
|
package/out/referenced-fields.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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":";;;AAAA,4BAA4B;AAC5B,+DAM+B;AAC/B,iEAA8D;AAYvD,MAAM,mBAAmB,GAA0C,CACzE,QAAQ,EACP,EAAE;IACH,MAAM,gBAAgB,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;IAE3D,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B;AASF,IAAK,MAIJ;AAJD,WAAK,MAAM;IACV,wBAAc,CAAA;IACd,wBAAc,CAAA;IACd,sBAAY,CAAA;AACb,CAAC,EAJI,MAAM,KAAN,MAAM,QAIV;AAOD,MAAM,sBAAsB,GAAG,CAC9B,QAA0B,EAC1B,KAA0B,EAC1B,MAAc,
|
|
1
|
+
{"version":3,"file":"referenced-fields.js","sourceRoot":"","sources":["../src/referenced-fields.ts"],"names":[],"mappings":";;;AAAA,4BAA4B;AAC5B,+DAM+B;AAC/B,iEAA8D;AAYvD,MAAM,mBAAmB,GAA0C,CACzE,QAAQ,EACP,EAAE;IACH,MAAM,gBAAgB,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;IAE3D,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B;AASF,IAAK,MAIJ;AAJD,WAAK,MAAM;IACV,wBAAc,CAAA;IACd,wBAAc,CAAA;IACd,sBAAY,CAAA;AACb,CAAC,EAJI,MAAM,KAAN,MAAM,QAIV;AAOD,MAAM,sBAAsB,GAAG,CAC9B,QAA0B,EAC1B,KAA0B,EAC1B,MAAc,EACqD,EAAE;IACrE,MAAM,sBAAsB,GAAa,EAAE,CAAC;IAC5C,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACrB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,gCAAU,CAAC,CAAC;IAC9C,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;YAC1B,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC;YAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACpD;YACD,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChB,KAAK,OAAO;oBACX,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;oBAC9C,MAAM;gBACP,KAAK,aAAa;oBAIjB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;oBACzC,MAAM;gBACP;oBACC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;aAC3D;SACD;aAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;YACjC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SACpD;aAAM;YACN,MAAM,KAAK,CAAC,qCAAqC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC9D;IACF,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;AAC1C,CAAC,CAAC;AACF,MAAM,YAAY,GAAG,CACpB,gBAAsC,EACtC,KAA0B,EAC1B,SAAiB,EACjB,SAAiB,EAChB,EAAE;;;IACH,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAG3B,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE;QACvB,MAAA,gBAAgB,MAAC,CAAC,CAAC,SAAS,qCAA5B,gBAAgB,OAAkB;YACjC,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;SACV,EAAC;QACF,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;YAC/B,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACrD;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;YAC/B,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACrD;QACD,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KACrD;AACF,CAAC,CAAC;AACF,MAAM,wBAAwB,GAAG,CAChC,gBAAsC,EACtC,QAA0B,EAC1B,MAAc,EACd,EACC,KAAK,EACL,sBAAsB,MACwB;IAC9C,KAAK,EAAE,EAAE;IACT,sBAAsB,EAAE,EAAE;CAC1B,EACA,EAAE;IACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC7B,OAAO;KACP;IACD,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE;QACpB,KAAK,aAAa;YAEjB,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,sBAAsB,CAC1D,QAAQ,EACR,KAAK,EACL,MAAM,CACN,CAAC,CAAC;YACH,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAsB,EAAE,EAAE;gBAC3C,wBAAwB,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;oBACxD,KAAK;oBACL,sBAAsB;iBACtB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO;QACR,KAAK,iBAAiB,CAAC,CAAC;YACvB,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC;YAC1C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;gBACnE,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;aACxD;YACD,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC5D,OAAO;SACP;QACD,KAAK,OAAO,CAAC,CAAC;YACb,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC;YAC/B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;aACxD;YACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAE3C,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;aAC5D;YACD,OAAO;SACP;QACD,KAAK,KAAK,CAAC;QACX,KAAK,WAAW;YAEf,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;gBAC7B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;aACvB;iBAAM,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;gBACpC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;aACvB;QAEF,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ;YACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAsB,EAAE,EAAE;gBAC3C,wBAAwB,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;oBACxD,KAAK;oBACL,sBAAsB;iBACtB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO;QACR,KAAK,QAAQ;YACZ,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAGrC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aACvD;YACD,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAsB,EAAE,EAAE;gBAC3C,wBAAwB,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;oBACxD,KAAK;oBACL,sBAAsB;iBACtB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO;QACR,KAAK,OAAO;YACX,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBACxB,MAAM,IAAI,KAAK,CACd,uDAAuD,CACvD,CAAC;aACF;YACD,KAAK,MAAM,SAAS,IAAI,sBAAsB,EAAE;gBAE/C,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;aACrD;YACD,OAAO;QACR;YACC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAsB,EAAE,EAAE;gBAC3C,wBAAwB,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;oBAChE,KAAK;oBACL,sBAAsB;iBACtB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;KACJ;AACF,CAAC,CAAC;AACK,MAAM,uBAAuB,GACnC,CAAC,QAAQ,EAAE,EAAE;IACZ,QAAQ,GAAG,IAAA,2CAAoB,EAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAyB,EAAE,CAAC;IAClD,wBAAwB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;QACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAEzC,EAAE;YACF,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;SAC9C;KACD;IAED,OAAO,gBAAgB,CAAC;AACzB,CAAC,CAAC;AAfU,QAAA,uBAAuB,2BAejC;AAEH,MAAM,UAAU,GAAG,CAAC,KAAuB,EAA8B,EAAE;IAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACvE,OAAO;KACP;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,gCAAU,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO;KACP;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,SAAiB,CAAC;IACtB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;QACzB,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;KACrB;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAErC,SAAS,GAAG,KAAK,CAAC;KAClB;SAAM;QACN,OAAO;KACP;IAED,IAAI,SAAS,KAAK,aAAa,EAAE;QAChC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;KAC9C;IACD,IAAI,SAAS,KAAK,aAAa,EAAE;QAChC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;KAC9C;IAED,MAAM,MAAM,GAAG,CAAC,CAA+B,KAAK,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;SAC9D,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpB,KAAK,EAAE,CAAC;IACV,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC,CAAC;AACK,MAAM,iBAAiB,GAAwC,CACrE,gBAAkC,EACjC,EAAE;IACH,IAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE;QAC1C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KACjD;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE;QAC9C,OAAO,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KACxC;SAAM;QACN,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;KACpC;AACF,CAAC,CAAC;AAVW,QAAA,iBAAiB,qBAU5B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/abstract-sql-compiler",
|
|
3
|
-
"version": "7.
|
|
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-
|
|
66
|
+
"publishedAt": "2021-12-14T18:09:01.155Z"
|
|
67
67
|
}
|
|
68
68
|
}
|
package/src/referenced-fields.ts
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
127
|
+
({ scope, currentlyScopedAliases } = getRuleReferencedScope(
|
|
128
|
+
rulePart,
|
|
129
|
+
scope,
|
|
130
|
+
isSafe,
|
|
131
|
+
));
|
|
119
132
|
rulePart.forEach((node: AbstractSqlQuery) => {
|
|
120
|
-
$getRuleReferencedFields(referencedFields, node, isSafe,
|
|
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,
|
|
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,
|
|
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
|
});
|