@harperfast/harper 5.2.0-alpha.6 → 5.2.0-beta.1
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/dataLayer/harperBridge/ResourceBridge.ts +7 -0
- package/dist/dataLayer/harperBridge/ResourceBridge.js +8 -0
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/resources/Resource.js +5 -2
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/Table.d.ts +3 -1
- package/dist/resources/Table.js +13 -3
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/databases.js +21 -0
- package/dist/resources/databases.js.map +1 -1
- package/dist/sqlEngine/binder/bind.d.ts +72 -0
- package/dist/sqlEngine/binder/bind.js +289 -0
- package/dist/sqlEngine/binder/bind.js.map +1 -0
- package/dist/sqlEngine/config.d.ts +35 -0
- package/dist/sqlEngine/config.js +62 -0
- package/dist/sqlEngine/config.js.map +1 -0
- package/dist/sqlEngine/diff/differential.d.ts +23 -0
- package/dist/sqlEngine/diff/differential.js +90 -0
- package/dist/sqlEngine/diff/differential.js.map +1 -0
- package/dist/sqlEngine/errors.d.ts +22 -0
- package/dist/sqlEngine/errors.js +36 -0
- package/dist/sqlEngine/errors.js.map +1 -0
- package/dist/sqlEngine/executor/runMutation.d.ts +35 -0
- package/dist/sqlEngine/executor/runMutation.js +352 -0
- package/dist/sqlEngine/executor/runMutation.js.map +1 -0
- package/dist/sqlEngine/executor/runSelect.d.ts +7 -0
- package/dist/sqlEngine/executor/runSelect.js +14 -0
- package/dist/sqlEngine/executor/runSelect.js.map +1 -0
- package/dist/sqlEngine/expressions/compile.d.ts +24 -0
- package/dist/sqlEngine/expressions/compile.js +326 -0
- package/dist/sqlEngine/expressions/compile.js.map +1 -0
- package/dist/sqlEngine/functions/aggregates.d.ts +12 -0
- package/dist/sqlEngine/functions/aggregates.js +299 -0
- package/dist/sqlEngine/functions/aggregates.js.map +1 -0
- package/dist/sqlEngine/functions/registry.d.ts +36 -0
- package/dist/sqlEngine/functions/registry.js +33 -0
- package/dist/sqlEngine/functions/registry.js.map +1 -0
- package/dist/sqlEngine/functions/standard.d.ts +9 -0
- package/dist/sqlEngine/functions/standard.js +86 -0
- package/dist/sqlEngine/functions/standard.js.map +1 -0
- package/dist/sqlEngine/index.d.ts +29 -0
- package/dist/sqlEngine/index.js +62 -0
- package/dist/sqlEngine/index.js.map +1 -0
- package/dist/sqlEngine/logical/build.d.ts +20 -0
- package/dist/sqlEngine/logical/build.js +326 -0
- package/dist/sqlEngine/logical/build.js.map +1 -0
- package/dist/sqlEngine/logical/op.d.ts +105 -0
- package/dist/sqlEngine/logical/op.js +10 -0
- package/dist/sqlEngine/logical/op.js.map +1 -0
- package/dist/sqlEngine/optimizer/joinAnalysis.d.ts +37 -0
- package/dist/sqlEngine/optimizer/joinAnalysis.js +144 -0
- package/dist/sqlEngine/optimizer/joinAnalysis.js.map +1 -0
- package/dist/sqlEngine/optimizer/optimize.d.ts +13 -0
- package/dist/sqlEngine/optimizer/optimize.js +53 -0
- package/dist/sqlEngine/optimizer/optimize.js.map +1 -0
- package/dist/sqlEngine/optimizer/ruleEngine.d.ts +7 -0
- package/dist/sqlEngine/optimizer/ruleEngine.js +26 -0
- package/dist/sqlEngine/optimizer/ruleEngine.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/limitPushdown.d.ts +19 -0
- package/dist/sqlEngine/optimizer/rules/limitPushdown.js +55 -0
- package/dist/sqlEngine/optimizer/rules/limitPushdown.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/planJoins.d.ts +19 -0
- package/dist/sqlEngine/optimizer/rules/planJoins.js +62 -0
- package/dist/sqlEngine/optimizer/rules/planJoins.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/predicateNormalize.d.ts +18 -0
- package/dist/sqlEngine/optimizer/rules/predicateNormalize.js +80 -0
- package/dist/sqlEngine/optimizer/rules/predicateNormalize.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/predicatePushdown.d.ts +11 -0
- package/dist/sqlEngine/optimizer/rules/predicatePushdown.js +48 -0
- package/dist/sqlEngine/optimizer/rules/predicatePushdown.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/projectionPushdown.d.ts +23 -0
- package/dist/sqlEngine/optimizer/rules/projectionPushdown.js +160 -0
- package/dist/sqlEngine/optimizer/rules/projectionPushdown.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/sortFromIndex.d.ts +14 -0
- package/dist/sqlEngine/optimizer/rules/sortFromIndex.js +49 -0
- package/dist/sqlEngine/optimizer/rules/sortFromIndex.js.map +1 -0
- package/dist/sqlEngine/optimizer/rules/validateScannable.d.ts +15 -0
- package/dist/sqlEngine/optimizer/rules/validateScannable.js +60 -0
- package/dist/sqlEngine/optimizer/rules/validateScannable.js.map +1 -0
- package/dist/sqlEngine/optimizer/whereToConditions.d.ts +85 -0
- package/dist/sqlEngine/optimizer/whereToConditions.js +484 -0
- package/dist/sqlEngine/optimizer/whereToConditions.js.map +1 -0
- package/dist/sqlEngine/parser/ast.d.ts +139 -0
- package/dist/sqlEngine/parser/ast.js +10 -0
- package/dist/sqlEngine/parser/ast.js.map +1 -0
- package/dist/sqlEngine/parser/normalizer.d.ts +28 -0
- package/dist/sqlEngine/parser/normalizer.js +413 -0
- package/dist/sqlEngine/parser/normalizer.js.map +1 -0
- package/dist/sqlEngine/parser/parse.d.ts +14 -0
- package/dist/sqlEngine/parser/parse.js +20 -0
- package/dist/sqlEngine/parser/parse.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalDistinct.d.ts +9 -0
- package/dist/sqlEngine/physical/PhysicalDistinct.js +29 -0
- package/dist/sqlEngine/physical/PhysicalDistinct.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalFilter.d.ts +10 -0
- package/dist/sqlEngine/physical/PhysicalFilter.js +25 -0
- package/dist/sqlEngine/physical/PhysicalFilter.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalHashAggregate.d.ts +27 -0
- package/dist/sqlEngine/physical/PhysicalHashAggregate.js +100 -0
- package/dist/sqlEngine/physical/PhysicalHashAggregate.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalHashJoin.d.ts +29 -0
- package/dist/sqlEngine/physical/PhysicalHashJoin.js +93 -0
- package/dist/sqlEngine/physical/PhysicalHashJoin.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.d.ts +36 -0
- package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js +78 -0
- package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalIndexScan.d.ts +22 -0
- package/dist/sqlEngine/physical/PhysicalIndexScan.js +77 -0
- package/dist/sqlEngine/physical/PhysicalIndexScan.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalLimit.d.ts +5 -0
- package/dist/sqlEngine/physical/PhysicalLimit.js +28 -0
- package/dist/sqlEngine/physical/PhysicalLimit.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.d.ts +20 -0
- package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js +51 -0
- package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalProject.d.ts +18 -0
- package/dist/sqlEngine/physical/PhysicalProject.js +117 -0
- package/dist/sqlEngine/physical/PhysicalProject.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalQualify.d.ts +13 -0
- package/dist/sqlEngine/physical/PhysicalQualify.js +29 -0
- package/dist/sqlEngine/physical/PhysicalQualify.js.map +1 -0
- package/dist/sqlEngine/physical/PhysicalSort.d.ts +12 -0
- package/dist/sqlEngine/physical/PhysicalSort.js +59 -0
- package/dist/sqlEngine/physical/PhysicalSort.js.map +1 -0
- package/dist/sqlEngine/physical/op.d.ts +11 -0
- package/dist/sqlEngine/physical/op.js +9 -0
- package/dist/sqlEngine/physical/op.js.map +1 -0
- package/dist/sqlEngine/physical/plan.d.ts +23 -0
- package/dist/sqlEngine/physical/plan.js +162 -0
- package/dist/sqlEngine/physical/plan.js.map +1 -0
- package/dist/sqlEngine/router.d.ts +26 -0
- package/dist/sqlEngine/router.js +48 -0
- package/dist/sqlEngine/router.js.map +1 -0
- package/dist/sqlEngine/types.d.ts +37 -0
- package/dist/sqlEngine/types.js +13 -0
- package/dist/sqlEngine/types.js.map +1 -0
- package/dist/sqlTranslator/index.js +7 -1
- package/dist/sqlTranslator/index.js.map +1 -1
- package/dist/validation/deleteValidator.js +10 -2
- package/dist/validation/deleteValidator.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/resources/DESIGN.md +17 -16
- package/resources/Resource.ts +5 -2
- package/resources/Table.ts +23 -3
- package/resources/databases.ts +24 -0
- package/sqlTranslator/index.ts +16 -6
- package/studio/web/assets/{Chat-CTjtL8Z4.js → Chat-BZks8dVF.js} +2 -2
- package/studio/web/assets/{Chat-CTjtL8Z4.js.map → Chat-BZks8dVF.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-CafHR4Ur.js → FloatingChat-Dic8paVO.js} +4 -4
- package/studio/web/assets/{FloatingChat-CafHR4Ur.js.map → FloatingChat-Dic8paVO.js.map} +1 -1
- package/studio/web/assets/{applications-Buh_q0Vj.js → applications-uOXkeUIN.js} +2 -2
- package/studio/web/assets/{applications-Buh_q0Vj.js.map → applications-uOXkeUIN.js.map} +1 -1
- package/studio/web/assets/{index-0hXeECkS.js → index-i-2wrKhv.js} +6 -6
- package/studio/web/assets/{index-0hXeECkS.js.map → index-i-2wrKhv.js.map} +1 -1
- package/studio/web/assets/{index.lazy-B00B7VBT.js → index.lazy-Csk8eCoB.js} +4 -4
- package/studio/web/assets/{index.lazy-B00B7VBT.js.map → index.lazy-Csk8eCoB.js.map} +1 -1
- package/studio/web/assets/{profile-Cg2wwYPn.js → profile-Sb3mGDl6.js} +2 -2
- package/studio/web/assets/{profile-Cg2wwYPn.js.map → profile-Sb3mGDl6.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-DCaDIvyB.js → setComponentFile-BgZcaPJ2.js} +2 -2
- package/studio/web/assets/{setComponentFile-DCaDIvyB.js.map → setComponentFile-BgZcaPJ2.js.map} +1 -1
- package/studio/web/assets/{setup-CAVcAQjK.js → setup-DKtlLgmT.js} +2 -2
- package/studio/web/assets/{setup-CAVcAQjK.js.map → setup-DKtlLgmT.js.map} +1 -1
- package/studio/web/assets/{status-BRXorNdD.js → status-B45iLeug.js} +2 -2
- package/studio/web/assets/{status-BRXorNdD.js.map → status-B45iLeug.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-Dy1D62vO.js → swagger-ui-react-Csu4026e.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-Dy1D62vO.js.map → swagger-ui-react-Csu4026e.js.map} +1 -1
- package/studio/web/assets/{tsMode-A8gbL74v.js → tsMode-DVgxUr_l.js} +2 -2
- package/studio/web/assets/{tsMode-A8gbL74v.js.map → tsMode-DVgxUr_l.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-cDodrVcQ.js → useEntityRestURL-yfDQMV1f.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-cDodrVcQ.js.map → useEntityRestURL-yfDQMV1f.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/validation/deleteValidator.ts +11 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function registry.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for SQL functions in the new engine: standard library
|
|
5
|
+
* (UPPER, LENGTH, COALESCE, ...), date/geo extensions reused from the
|
|
6
|
+
* existing utility/functions/ tree, and aggregates (COUNT/SUM/AVG/MIN/MAX
|
|
7
|
+
* plus the AlaSQL-extension aggregates MAD/MEAN/MODE/PROD/MEDIAN).
|
|
8
|
+
*
|
|
9
|
+
* Phase 0: registry shape and singleton only. Function bodies are wired in
|
|
10
|
+
* standard.ts/date.ts/geo.ts/extensions.ts during phases 1–2.
|
|
11
|
+
*/
|
|
12
|
+
import type { SqlType } from '../types.ts';
|
|
13
|
+
export type ScalarFn = (args: unknown[]) => unknown;
|
|
14
|
+
export interface Accumulator {
|
|
15
|
+
step(value: unknown): void;
|
|
16
|
+
finalize(): unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface AggFn {
|
|
19
|
+
factory(): Accumulator;
|
|
20
|
+
}
|
|
21
|
+
export interface FunctionDescriptor {
|
|
22
|
+
name: string;
|
|
23
|
+
aliases: string[];
|
|
24
|
+
kind: 'scalar' | 'aggregate';
|
|
25
|
+
returnType: SqlType;
|
|
26
|
+
impl: ScalarFn | AggFn;
|
|
27
|
+
}
|
|
28
|
+
declare class FunctionRegistry {
|
|
29
|
+
private byName;
|
|
30
|
+
register(desc: FunctionDescriptor): void;
|
|
31
|
+
lookup(name: string): FunctionDescriptor | undefined;
|
|
32
|
+
has(name: string): boolean;
|
|
33
|
+
all(): FunctionDescriptor[];
|
|
34
|
+
}
|
|
35
|
+
export declare const functionRegistry: FunctionRegistry;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Function registry.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for SQL functions in the new engine: standard library
|
|
6
|
+
* (UPPER, LENGTH, COALESCE, ...), date/geo extensions reused from the
|
|
7
|
+
* existing utility/functions/ tree, and aggregates (COUNT/SUM/AVG/MIN/MAX
|
|
8
|
+
* plus the AlaSQL-extension aggregates MAD/MEAN/MODE/PROD/MEDIAN).
|
|
9
|
+
*
|
|
10
|
+
* Phase 0: registry shape and singleton only. Function bodies are wired in
|
|
11
|
+
* standard.ts/date.ts/geo.ts/extensions.ts during phases 1–2.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.functionRegistry = void 0;
|
|
15
|
+
class FunctionRegistry {
|
|
16
|
+
byName = new Map();
|
|
17
|
+
register(desc) {
|
|
18
|
+
const names = [desc.name, ...desc.aliases].map((n) => n.toLowerCase());
|
|
19
|
+
for (const n of names)
|
|
20
|
+
this.byName.set(n, desc);
|
|
21
|
+
}
|
|
22
|
+
lookup(name) {
|
|
23
|
+
return this.byName.get(name.toLowerCase());
|
|
24
|
+
}
|
|
25
|
+
has(name) {
|
|
26
|
+
return this.byName.has(name.toLowerCase());
|
|
27
|
+
}
|
|
28
|
+
all() {
|
|
29
|
+
return [...new Set(this.byName.values())];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.functionRegistry = new FunctionRegistry();
|
|
33
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../sqlEngine/functions/registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAuBH,MAAM,gBAAgB;IACb,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEvD,QAAQ,CAAC,IAAwB;QAChC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG;QACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;CACD;AAEY,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers the standard scalar functions used by the new SQL engine.
|
|
3
|
+
*
|
|
4
|
+
* Date/geo extensions and the AlaSQL-extension aggregates live in
|
|
5
|
+
* functions/date.ts, functions/geo.ts, and functions/extensions.ts. This file
|
|
6
|
+
* covers the small built-in set: UPPER, LOWER, LENGTH, COALESCE, NULLIF,
|
|
7
|
+
* TRIM, ABS, ROUND.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerStandardFunctions(): void;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Registers the standard scalar functions used by the new SQL engine.
|
|
4
|
+
*
|
|
5
|
+
* Date/geo extensions and the AlaSQL-extension aggregates live in
|
|
6
|
+
* functions/date.ts, functions/geo.ts, and functions/extensions.ts. This file
|
|
7
|
+
* covers the small built-in set: UPPER, LOWER, LENGTH, COALESCE, NULLIF,
|
|
8
|
+
* TRIM, ABS, ROUND.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.registerStandardFunctions = registerStandardFunctions;
|
|
12
|
+
const registry_ts_1 = require("./registry.js");
|
|
13
|
+
let registered = false;
|
|
14
|
+
function registerStandardFunctions() {
|
|
15
|
+
if (registered)
|
|
16
|
+
return;
|
|
17
|
+
registered = true;
|
|
18
|
+
registry_ts_1.functionRegistry.register({
|
|
19
|
+
name: 'upper',
|
|
20
|
+
aliases: ['UPPER'],
|
|
21
|
+
kind: 'scalar',
|
|
22
|
+
returnType: 'string',
|
|
23
|
+
impl: (args) => (args[0] == null ? null : String(args[0]).toUpperCase()),
|
|
24
|
+
});
|
|
25
|
+
registry_ts_1.functionRegistry.register({
|
|
26
|
+
name: 'lower',
|
|
27
|
+
aliases: ['LOWER'],
|
|
28
|
+
kind: 'scalar',
|
|
29
|
+
returnType: 'string',
|
|
30
|
+
impl: (args) => (args[0] == null ? null : String(args[0]).toLowerCase()),
|
|
31
|
+
});
|
|
32
|
+
registry_ts_1.functionRegistry.register({
|
|
33
|
+
name: 'length',
|
|
34
|
+
aliases: ['LENGTH', 'LEN'],
|
|
35
|
+
kind: 'scalar',
|
|
36
|
+
returnType: 'int',
|
|
37
|
+
impl: (args) => (args[0] == null ? null : String(args[0]).length),
|
|
38
|
+
});
|
|
39
|
+
registry_ts_1.functionRegistry.register({
|
|
40
|
+
name: 'trim',
|
|
41
|
+
aliases: ['TRIM'],
|
|
42
|
+
kind: 'scalar',
|
|
43
|
+
returnType: 'string',
|
|
44
|
+
impl: (args) => (args[0] == null ? null : String(args[0]).trim()),
|
|
45
|
+
});
|
|
46
|
+
registry_ts_1.functionRegistry.register({
|
|
47
|
+
name: 'abs',
|
|
48
|
+
aliases: ['ABS'],
|
|
49
|
+
kind: 'scalar',
|
|
50
|
+
returnType: 'number',
|
|
51
|
+
impl: (args) => (args[0] == null ? null : Math.abs(Number(args[0]))),
|
|
52
|
+
});
|
|
53
|
+
registry_ts_1.functionRegistry.register({
|
|
54
|
+
name: 'round',
|
|
55
|
+
aliases: ['ROUND'],
|
|
56
|
+
kind: 'scalar',
|
|
57
|
+
returnType: 'number',
|
|
58
|
+
impl: (args) => {
|
|
59
|
+
if (args[0] == null)
|
|
60
|
+
return null;
|
|
61
|
+
const digits = args[1] == null ? 0 : Number(args[1]);
|
|
62
|
+
const factor = 10 ** digits;
|
|
63
|
+
return Math.round(Number(args[0]) * factor) / factor;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
registry_ts_1.functionRegistry.register({
|
|
67
|
+
name: 'coalesce',
|
|
68
|
+
aliases: ['COALESCE', 'IFNULL'],
|
|
69
|
+
kind: 'scalar',
|
|
70
|
+
returnType: 'unknown',
|
|
71
|
+
impl: (args) => {
|
|
72
|
+
for (const a of args)
|
|
73
|
+
if (a != null)
|
|
74
|
+
return a;
|
|
75
|
+
return null;
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
registry_ts_1.functionRegistry.register({
|
|
79
|
+
name: 'nullif',
|
|
80
|
+
aliases: ['NULLIF'],
|
|
81
|
+
kind: 'scalar',
|
|
82
|
+
returnType: 'unknown',
|
|
83
|
+
impl: (args) => (args[0] === args[1] ? null : args[0]),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=standard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard.js","sourceRoot":"","sources":["../../../sqlEngine/functions/standard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point of the new SQL engine.
|
|
3
|
+
*
|
|
4
|
+
* The legacy SQL translator (core/sqlTranslator/index.js) routes SELECT/
|
|
5
|
+
* INSERT/UPDATE/DELETE through router.ts; in 'new' or 'auto' mode the router
|
|
6
|
+
* calls runStatement here.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0: every request throws EngineUnsupportedError so 'auto' mode falls
|
|
9
|
+
* back to legacy and 'new' mode rejects loudly. Phases 1–4 incrementally fill
|
|
10
|
+
* in normalize → bind → build → optimize → physical → execute.
|
|
11
|
+
*/
|
|
12
|
+
import { normalizeStatement } from './parser/normalizer.ts';
|
|
13
|
+
import { bind } from './binder/bind.ts';
|
|
14
|
+
import { buildLogicalPlan } from './logical/build.ts';
|
|
15
|
+
import { compileToPhysical } from './physical/plan.ts';
|
|
16
|
+
import { runSelect } from './executor/runSelect.ts';
|
|
17
|
+
export interface RunStatementInput {
|
|
18
|
+
variant: 'select' | 'insert' | 'update' | 'delete';
|
|
19
|
+
jsonMessage: {
|
|
20
|
+
hdb_user?: unknown;
|
|
21
|
+
parsed_sql_object?: unknown;
|
|
22
|
+
};
|
|
23
|
+
statement: unknown;
|
|
24
|
+
}
|
|
25
|
+
export declare function runStatement(input: RunStatementInput): Promise<unknown>;
|
|
26
|
+
export { normalizeStatement, bind, buildLogicalPlan, compileToPhysical, runSelect };
|
|
27
|
+
export { EngineUnsupportedError, EngineRuntimeError } from './errors.ts';
|
|
28
|
+
export { getSqlEngineConfig } from './config.ts';
|
|
29
|
+
export type { SqlEngineMode } from './config.ts';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Public entry point of the new SQL engine.
|
|
4
|
+
*
|
|
5
|
+
* The legacy SQL translator (core/sqlTranslator/index.js) routes SELECT/
|
|
6
|
+
* INSERT/UPDATE/DELETE through router.ts; in 'new' or 'auto' mode the router
|
|
7
|
+
* calls runStatement here.
|
|
8
|
+
*
|
|
9
|
+
* Phase 0: every request throws EngineUnsupportedError so 'auto' mode falls
|
|
10
|
+
* back to legacy and 'new' mode rejects loudly. Phases 1–4 incrementally fill
|
|
11
|
+
* in normalize → bind → build → optimize → physical → execute.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getSqlEngineConfig = exports.EngineRuntimeError = exports.EngineUnsupportedError = exports.runSelect = exports.compileToPhysical = exports.buildLogicalPlan = exports.bind = exports.normalizeStatement = void 0;
|
|
15
|
+
exports.runStatement = runStatement;
|
|
16
|
+
const normalizer_ts_1 = require("./parser/normalizer.js");
|
|
17
|
+
Object.defineProperty(exports, "normalizeStatement", { enumerable: true, get: function () { return normalizer_ts_1.normalizeStatement; } });
|
|
18
|
+
const bind_ts_1 = require("./binder/bind.js");
|
|
19
|
+
Object.defineProperty(exports, "bind", { enumerable: true, get: function () { return bind_ts_1.bind; } });
|
|
20
|
+
const build_ts_1 = require("./logical/build.js");
|
|
21
|
+
Object.defineProperty(exports, "buildLogicalPlan", { enumerable: true, get: function () { return build_ts_1.buildLogicalPlan; } });
|
|
22
|
+
const plan_ts_1 = require("./physical/plan.js");
|
|
23
|
+
Object.defineProperty(exports, "compileToPhysical", { enumerable: true, get: function () { return plan_ts_1.compileToPhysical; } });
|
|
24
|
+
const runSelect_ts_1 = require("./executor/runSelect.js");
|
|
25
|
+
Object.defineProperty(exports, "runSelect", { enumerable: true, get: function () { return runSelect_ts_1.runSelect; } });
|
|
26
|
+
const runMutation_ts_1 = require("./executor/runMutation.js");
|
|
27
|
+
const optimize_ts_1 = require("./optimizer/optimize.js");
|
|
28
|
+
const standard_ts_1 = require("./functions/standard.js");
|
|
29
|
+
const aggregates_ts_1 = require("./functions/aggregates.js");
|
|
30
|
+
async function runStatement(input) {
|
|
31
|
+
(0, standard_ts_1.registerStandardFunctions)();
|
|
32
|
+
(0, aggregates_ts_1.registerAggregateFunctions)();
|
|
33
|
+
const ctx = { user: input.jsonMessage.hdb_user };
|
|
34
|
+
// sqlTranslator/index.ts (processAST) hands SELECT the bare AlaSQL AST but
|
|
35
|
+
// wraps INSERT/UPDATE/DELETE as `{ statement, hdb_user }` (the legacy
|
|
36
|
+
// handlers' arg shape). Unwrap that envelope so the normalizer always sees
|
|
37
|
+
// the bare AST.
|
|
38
|
+
const raw = input.statement;
|
|
39
|
+
const ast = raw && typeof raw === 'object' && 'statement' in raw && 'hdb_user' in raw
|
|
40
|
+
? raw.statement
|
|
41
|
+
: raw;
|
|
42
|
+
const ir = (0, normalizer_ts_1.normalizeStatement)(ast, input.variant);
|
|
43
|
+
const bound = (0, bind_ts_1.bind)(ir, ctx);
|
|
44
|
+
switch (bound.kind) {
|
|
45
|
+
case 'insert':
|
|
46
|
+
return (0, runMutation_ts_1.runInsert)(bound, ctx);
|
|
47
|
+
case 'update':
|
|
48
|
+
return (0, runMutation_ts_1.runUpdate)(bound, ctx);
|
|
49
|
+
case 'delete':
|
|
50
|
+
return (0, runMutation_ts_1.runDelete)(bound, ctx);
|
|
51
|
+
default: {
|
|
52
|
+
const physical = (0, plan_ts_1.compileToPhysical)((0, optimize_ts_1.optimize)((0, build_ts_1.buildLogicalPlan)(bound)));
|
|
53
|
+
return (0, runSelect_ts_1.runSelect)(physical, ctx);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
var errors_ts_1 = require("./errors.js");
|
|
58
|
+
Object.defineProperty(exports, "EngineUnsupportedError", { enumerable: true, get: function () { return errors_ts_1.EngineUnsupportedError; } });
|
|
59
|
+
Object.defineProperty(exports, "EngineRuntimeError", { enumerable: true, get: function () { return errors_ts_1.EngineRuntimeError; } });
|
|
60
|
+
var config_ts_1 = require("./config.js");
|
|
61
|
+
Object.defineProperty(exports, "getSqlEngineConfig", { enumerable: true, get: function () { return config_ts_1.getSqlEngineConfig; } });
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sqlEngine/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAmBH,oCA6BC;AA9CD,0DAA4D;AAiDnD,mGAjDA,kCAAkB,OAiDA;AAhD3B,8CAAwC;AAgDX,qFAhDpB,cAAI,OAgDoB;AA9CjC,iDAAsD;AA8CnB,iGA9C1B,2BAAgB,OA8C0B;AA7CnD,gDAAuD;AA6CF,kGA7C5C,2BAAiB,OA6C4C;AA5CtE,0DAAoD;AA4CoB,0FA5C/D,wBAAS,OA4C+D;AA3CjF,8DAA4E;AAC5E,yDAAmD;AACnD,yDAAoE;AACpE,6DAAuE;AAQhE,KAAK,UAAU,YAAY,CAAC,KAAwB;IAC1D,IAAA,uCAAyB,GAAE,CAAC;IAC5B,IAAA,0CAA0B,GAAE,CAAC;IAE7B,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACjD,2EAA2E;IAC3E,sEAAsE;IACtE,2EAA2E;IAC3E,gBAAgB;IAChB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAoC,CAAC;IACvD,MAAM,GAAG,GACR,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,WAAW,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG;QACxE,CAAC,CAAE,GAAG,CAAC,SAAqC;QAC5C,CAAC,CAAC,GAAG,CAAC;IACR,MAAM,EAAE,GAAG,IAAA,kCAAkB,EAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAA,cAAI,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAE5B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACZ,OAAO,IAAA,0BAAS,EAAC,KAAoB,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACZ,OAAO,IAAA,0BAAS,EAAC,KAAoB,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,QAAQ;YACZ,OAAO,IAAA,0BAAS,EAAC,KAAoB,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,QAAQ,GAAG,IAAA,2BAAiB,EAAC,IAAA,sBAAQ,EAAC,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO,IAAA,wBAAS,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;AACF,CAAC;AAID,yCAAyE;AAAhE,mHAAA,sBAAsB,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AACnD,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds an unoptimized logical plan from a bound SELECT.
|
|
3
|
+
*
|
|
4
|
+
* Non-aggregate shape:
|
|
5
|
+
* Project -> Limit -> Sort -> Filter(WHERE) -> Scan
|
|
6
|
+
*
|
|
7
|
+
* Aggregate shape:
|
|
8
|
+
* Project -> Limit -> Sort -> Filter(HAVING) -> Aggregate -> Filter(WHERE) -> Scan
|
|
9
|
+
*
|
|
10
|
+
* AggCollector walks all output expressions (projections, HAVING, ORDER BY) and
|
|
11
|
+
* replaces each aggCall with a synthetic column reference (__agg_N__), building
|
|
12
|
+
* the aggs list for LogicalAggregate in the process. All downstream operators
|
|
13
|
+
* therefore see only plain column references — no aggCall nodes escape above the
|
|
14
|
+
* Aggregate node.
|
|
15
|
+
*
|
|
16
|
+
* GROUP BY is restricted to simple column references in this phase.
|
|
17
|
+
*/
|
|
18
|
+
import type { LogicalPlan } from './op.ts';
|
|
19
|
+
import type { StatementNode } from '../parser/ast.ts';
|
|
20
|
+
export declare function buildLogicalPlan(stmt: StatementNode): LogicalPlan;
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Builds an unoptimized logical plan from a bound SELECT.
|
|
4
|
+
*
|
|
5
|
+
* Non-aggregate shape:
|
|
6
|
+
* Project -> Limit -> Sort -> Filter(WHERE) -> Scan
|
|
7
|
+
*
|
|
8
|
+
* Aggregate shape:
|
|
9
|
+
* Project -> Limit -> Sort -> Filter(HAVING) -> Aggregate -> Filter(WHERE) -> Scan
|
|
10
|
+
*
|
|
11
|
+
* AggCollector walks all output expressions (projections, HAVING, ORDER BY) and
|
|
12
|
+
* replaces each aggCall with a synthetic column reference (__agg_N__), building
|
|
13
|
+
* the aggs list for LogicalAggregate in the process. All downstream operators
|
|
14
|
+
* therefore see only plain column references — no aggCall nodes escape above the
|
|
15
|
+
* Aggregate node.
|
|
16
|
+
*
|
|
17
|
+
* GROUP BY is restricted to simple column references in this phase.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.buildLogicalPlan = buildLogicalPlan;
|
|
21
|
+
const errors_ts_1 = require("../errors.js");
|
|
22
|
+
function buildLogicalPlan(stmt) {
|
|
23
|
+
if (stmt.kind !== 'select') {
|
|
24
|
+
throw new errors_ts_1.EngineUnsupportedError(`logical/build: only SELECT supported in phase 2, got ${stmt.kind}`);
|
|
25
|
+
}
|
|
26
|
+
return buildSelect(stmt);
|
|
27
|
+
}
|
|
28
|
+
class AggCollector {
|
|
29
|
+
specs = [];
|
|
30
|
+
sig(expr) {
|
|
31
|
+
return JSON.stringify({ n: expr.name, a: expr.arg, d: !!expr.distinct });
|
|
32
|
+
}
|
|
33
|
+
rewrite(expr) {
|
|
34
|
+
switch (expr.kind) {
|
|
35
|
+
case 'aggCall': {
|
|
36
|
+
const key = this.sig(expr);
|
|
37
|
+
let spec = this.specs.find((s) => this.sig(s) === key);
|
|
38
|
+
if (!spec) {
|
|
39
|
+
spec = {
|
|
40
|
+
name: expr.name,
|
|
41
|
+
arg: expr.arg,
|
|
42
|
+
outputName: `__agg_${this.specs.length}__`,
|
|
43
|
+
distinct: expr.distinct,
|
|
44
|
+
};
|
|
45
|
+
this.specs.push(spec);
|
|
46
|
+
}
|
|
47
|
+
return { kind: 'column', name: spec.outputName };
|
|
48
|
+
}
|
|
49
|
+
case 'binop':
|
|
50
|
+
return { ...expr, left: this.rewrite(expr.left), right: this.rewrite(expr.right) };
|
|
51
|
+
case 'logical':
|
|
52
|
+
return { ...expr, args: expr.args.map((a) => this.rewrite(a)) };
|
|
53
|
+
case 'in': {
|
|
54
|
+
const list = Array.isArray(expr.list) ? expr.list.map((e) => this.rewrite(e)) : expr.list;
|
|
55
|
+
return { ...expr, expr: this.rewrite(expr.expr), list };
|
|
56
|
+
}
|
|
57
|
+
case 'between':
|
|
58
|
+
return { ...expr, expr: this.rewrite(expr.expr), low: this.rewrite(expr.low), high: this.rewrite(expr.high) };
|
|
59
|
+
case 'like':
|
|
60
|
+
return { ...expr, expr: this.rewrite(expr.expr) };
|
|
61
|
+
case 'isNull':
|
|
62
|
+
return { ...expr, expr: this.rewrite(expr.expr) };
|
|
63
|
+
case 'funcCall':
|
|
64
|
+
return { ...expr, args: expr.args.map((a) => this.rewrite(a)) };
|
|
65
|
+
case 'case':
|
|
66
|
+
return {
|
|
67
|
+
...expr,
|
|
68
|
+
cases: expr.cases.map((c) => ({ when: this.rewrite(c.when), then: this.rewrite(c.then) })),
|
|
69
|
+
else: expr.else ? this.rewrite(expr.else) : undefined,
|
|
70
|
+
};
|
|
71
|
+
default:
|
|
72
|
+
return expr;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function containsAggCall(expr) {
|
|
77
|
+
switch (expr.kind) {
|
|
78
|
+
case 'aggCall':
|
|
79
|
+
return true;
|
|
80
|
+
case 'binop':
|
|
81
|
+
return containsAggCall(expr.left) || containsAggCall(expr.right);
|
|
82
|
+
case 'logical':
|
|
83
|
+
return expr.args.some(containsAggCall);
|
|
84
|
+
case 'funcCall':
|
|
85
|
+
return expr.args.some(containsAggCall);
|
|
86
|
+
case 'case':
|
|
87
|
+
return (expr.cases.some((c) => containsAggCall(c.when) || containsAggCall(c.then)) ||
|
|
88
|
+
(!!expr.else && containsAggCall(expr.else)));
|
|
89
|
+
default:
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Plan builder
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
function buildSelect(stmt) {
|
|
97
|
+
let plan = stmt.joins.length > 0 ? buildJoinSource(stmt) : buildSingleTableSource(stmt);
|
|
98
|
+
const hasGroupBy = stmt.groupBy != null && stmt.groupBy.length > 0;
|
|
99
|
+
const hasAgg = stmt.projections.some((p) => containsAggCall(p.expr));
|
|
100
|
+
if (hasGroupBy || hasAgg) {
|
|
101
|
+
return buildAggregateSelect(stmt, plan);
|
|
102
|
+
}
|
|
103
|
+
// Non-aggregate path
|
|
104
|
+
if (stmt.orderBy && stmt.orderBy.length > 0) {
|
|
105
|
+
plan = { kind: 'Sort', input: plan, keys: stmt.orderBy };
|
|
106
|
+
}
|
|
107
|
+
if (stmt.limit != null || stmt.offset != null) {
|
|
108
|
+
plan = { kind: 'Limit', input: plan, limit: stmt.limit, offset: stmt.offset };
|
|
109
|
+
}
|
|
110
|
+
plan = { kind: 'Project', input: plan, projections: stmt.projections };
|
|
111
|
+
if (stmt.distinct) {
|
|
112
|
+
plan = { kind: 'Distinct', input: plan };
|
|
113
|
+
}
|
|
114
|
+
return plan;
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Source construction (Scan / Join tree + WHERE)
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
function buildSingleTableSource(stmt) {
|
|
120
|
+
const scan = {
|
|
121
|
+
kind: 'Scan',
|
|
122
|
+
table: stmt.from,
|
|
123
|
+
boundTable: stmt.boundTable,
|
|
124
|
+
};
|
|
125
|
+
if (stmt.where) {
|
|
126
|
+
return { kind: 'Filter', input: scan, predicate: stmt.where };
|
|
127
|
+
}
|
|
128
|
+
return scan;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Builds a left-deep join tree from FROM + joins. WHERE conjuncts that
|
|
132
|
+
* reference a single table are attached as a Filter directly above that table's
|
|
133
|
+
* Scan (so predicate pushdown lowers them into the index scan); conjuncts that
|
|
134
|
+
* span tables (or are constant) become a residual Filter above the whole tree.
|
|
135
|
+
*/
|
|
136
|
+
function buildJoinSource(stmt) {
|
|
137
|
+
const scope = stmt.scope;
|
|
138
|
+
// Aliases on the nullable (right) side of a LEFT join: a WHERE conjunct on
|
|
139
|
+
// such a table must NOT be pushed into its scan, or unmatched left rows would
|
|
140
|
+
// be null-filled and wrongly survive (and an `IS NULL` anti-join would lose
|
|
141
|
+
// its rows). Those conjuncts stay as a post-join residual filter, which gives
|
|
142
|
+
// correct semantics for both `o.x > k` and `o.x IS NULL`.
|
|
143
|
+
const nullableAliases = new Set();
|
|
144
|
+
for (let k = 0; k < stmt.joins.length; k++) {
|
|
145
|
+
if (stmt.joins[k].type === 'left')
|
|
146
|
+
nullableAliases.add(scope[k + 1].effectiveAlias);
|
|
147
|
+
}
|
|
148
|
+
// alias → pushable single-table WHERE conjuncts; everything else → residual.
|
|
149
|
+
const perAlias = new Map();
|
|
150
|
+
const residual = [];
|
|
151
|
+
if (stmt.where) {
|
|
152
|
+
for (const conjunct of flattenAnd(stmt.where)) {
|
|
153
|
+
const aliases = referencedAliases(conjunct);
|
|
154
|
+
const alias = aliases.size === 1 ? [...aliases][0] : undefined;
|
|
155
|
+
if (alias && !nullableAliases.has(alias)) {
|
|
156
|
+
const list = perAlias.get(alias);
|
|
157
|
+
if (list)
|
|
158
|
+
list.push(conjunct);
|
|
159
|
+
else
|
|
160
|
+
perAlias.set(alias, [conjunct]);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
residual.push(conjunct);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const makeScan = (bound) => {
|
|
168
|
+
const scan = {
|
|
169
|
+
kind: 'Scan',
|
|
170
|
+
table: { database: bound.database, table: bound.table, alias: bound.alias },
|
|
171
|
+
boundTable: bound,
|
|
172
|
+
alias: bound.effectiveAlias,
|
|
173
|
+
};
|
|
174
|
+
const conjuncts = perAlias.get(bound.effectiveAlias);
|
|
175
|
+
if (conjuncts && conjuncts.length > 0) {
|
|
176
|
+
return { kind: 'Filter', input: scan, predicate: andAll(conjuncts) };
|
|
177
|
+
}
|
|
178
|
+
return scan;
|
|
179
|
+
};
|
|
180
|
+
// Left-deep: ((from JOIN j0) JOIN j1) ...
|
|
181
|
+
let plan = makeScan(scope[0]);
|
|
182
|
+
for (let i = 0; i < stmt.joins.length; i++) {
|
|
183
|
+
const join = stmt.joins[i];
|
|
184
|
+
const right = makeScan(scope[i + 1]);
|
|
185
|
+
const on = join.on ?? usingToOn(join, scope, i + 1);
|
|
186
|
+
plan = {
|
|
187
|
+
kind: 'Join',
|
|
188
|
+
left: plan,
|
|
189
|
+
right,
|
|
190
|
+
on,
|
|
191
|
+
type: join.type === 'right' || join.type === 'full' ? 'inner' : join.type,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (residual.length > 0) {
|
|
195
|
+
plan = { kind: 'Filter', input: plan, predicate: andAll(residual) };
|
|
196
|
+
}
|
|
197
|
+
return plan;
|
|
198
|
+
}
|
|
199
|
+
/** Expands a USING (c1, c2, …) clause into an equi-ON between the joined table and its left-side owner. */
|
|
200
|
+
function usingToOn(join, scope, rightIdx) {
|
|
201
|
+
if (!join.using || join.using.length === 0)
|
|
202
|
+
return undefined;
|
|
203
|
+
const rightAlias = scope[rightIdx].effectiveAlias;
|
|
204
|
+
const eqs = join.using.map((col) => {
|
|
205
|
+
// Left owner: nearest preceding table that declares the column.
|
|
206
|
+
let leftAlias = scope[0].effectiveAlias;
|
|
207
|
+
for (let i = rightIdx - 1; i >= 0; i--) {
|
|
208
|
+
if (scope[i].attributes.some((a) => a.name === col)) {
|
|
209
|
+
leftAlias = scope[i].effectiveAlias;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
kind: 'binop',
|
|
215
|
+
op: '=',
|
|
216
|
+
left: { kind: 'column', table: leftAlias, name: col },
|
|
217
|
+
right: { kind: 'column', table: rightAlias, name: col },
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return andAll(eqs);
|
|
221
|
+
}
|
|
222
|
+
function flattenAnd(expr) {
|
|
223
|
+
if (expr.kind === 'logical' && expr.op === 'and') {
|
|
224
|
+
return expr.args.flatMap(flattenAnd);
|
|
225
|
+
}
|
|
226
|
+
return [expr];
|
|
227
|
+
}
|
|
228
|
+
function andAll(exprs) {
|
|
229
|
+
if (exprs.length === 1)
|
|
230
|
+
return exprs[0];
|
|
231
|
+
return { kind: 'logical', op: 'and', args: exprs };
|
|
232
|
+
}
|
|
233
|
+
/** Collects the distinct table aliases (column.table) referenced by an expression. */
|
|
234
|
+
function referencedAliases(expr, out = new Set()) {
|
|
235
|
+
switch (expr.kind) {
|
|
236
|
+
case 'column':
|
|
237
|
+
if (expr.table)
|
|
238
|
+
out.add(expr.table);
|
|
239
|
+
return out;
|
|
240
|
+
case 'binop':
|
|
241
|
+
referencedAliases(expr.left, out);
|
|
242
|
+
referencedAliases(expr.right, out);
|
|
243
|
+
return out;
|
|
244
|
+
case 'logical':
|
|
245
|
+
expr.args.forEach((a) => referencedAliases(a, out));
|
|
246
|
+
return out;
|
|
247
|
+
case 'in':
|
|
248
|
+
referencedAliases(expr.expr, out);
|
|
249
|
+
if (Array.isArray(expr.list))
|
|
250
|
+
expr.list.forEach((e) => referencedAliases(e, out));
|
|
251
|
+
return out;
|
|
252
|
+
case 'between':
|
|
253
|
+
referencedAliases(expr.expr, out);
|
|
254
|
+
referencedAliases(expr.low, out);
|
|
255
|
+
referencedAliases(expr.high, out);
|
|
256
|
+
return out;
|
|
257
|
+
case 'like':
|
|
258
|
+
referencedAliases(expr.expr, out);
|
|
259
|
+
referencedAliases(expr.pattern, out);
|
|
260
|
+
return out;
|
|
261
|
+
case 'isNull':
|
|
262
|
+
referencedAliases(expr.expr, out);
|
|
263
|
+
return out;
|
|
264
|
+
case 'funcCall':
|
|
265
|
+
expr.args.forEach((a) => referencedAliases(a, out));
|
|
266
|
+
return out;
|
|
267
|
+
case 'aggCall':
|
|
268
|
+
if (expr.arg.kind !== 'star')
|
|
269
|
+
referencedAliases(expr.arg, out);
|
|
270
|
+
return out;
|
|
271
|
+
case 'case':
|
|
272
|
+
for (const c of expr.cases) {
|
|
273
|
+
referencedAliases(c.when, out);
|
|
274
|
+
referencedAliases(c.then, out);
|
|
275
|
+
}
|
|
276
|
+
if (expr.else)
|
|
277
|
+
referencedAliases(expr.else, out);
|
|
278
|
+
return out;
|
|
279
|
+
case 'cast':
|
|
280
|
+
referencedAliases(expr.expr, out);
|
|
281
|
+
return out;
|
|
282
|
+
default:
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function buildAggregateSelect(stmt, afterWhere) {
|
|
287
|
+
const groupKeys = stmt.groupBy ?? [];
|
|
288
|
+
// Phase 2: GROUP BY only supports column references
|
|
289
|
+
for (const k of groupKeys) {
|
|
290
|
+
if (k.kind !== 'column') {
|
|
291
|
+
throw new errors_ts_1.EngineUnsupportedError('GROUP BY supports only column references in phase 2 (complex expressions not yet supported)', k);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Rewrite aggCalls → column refs in all output expressions
|
|
295
|
+
const collector = new AggCollector();
|
|
296
|
+
const rewrittenProjections = stmt.projections.map((p) => ({
|
|
297
|
+
...p,
|
|
298
|
+
expr: collector.rewrite(p.expr),
|
|
299
|
+
}));
|
|
300
|
+
const rewrittenHaving = stmt.having ? collector.rewrite(stmt.having) : undefined;
|
|
301
|
+
const rewrittenOrderBy = stmt.orderBy?.map((k) => ({
|
|
302
|
+
...k,
|
|
303
|
+
expr: collector.rewrite(k.expr),
|
|
304
|
+
}));
|
|
305
|
+
let plan = {
|
|
306
|
+
kind: 'Aggregate',
|
|
307
|
+
input: afterWhere,
|
|
308
|
+
groupKeys,
|
|
309
|
+
aggs: collector.specs,
|
|
310
|
+
};
|
|
311
|
+
if (rewrittenHaving) {
|
|
312
|
+
plan = { kind: 'Filter', input: plan, predicate: rewrittenHaving };
|
|
313
|
+
}
|
|
314
|
+
if (rewrittenOrderBy && rewrittenOrderBy.length > 0) {
|
|
315
|
+
plan = { kind: 'Sort', input: plan, keys: rewrittenOrderBy };
|
|
316
|
+
}
|
|
317
|
+
if (stmt.limit != null || stmt.offset != null) {
|
|
318
|
+
plan = { kind: 'Limit', input: plan, limit: stmt.limit, offset: stmt.offset };
|
|
319
|
+
}
|
|
320
|
+
plan = { kind: 'Project', input: plan, projections: rewrittenProjections };
|
|
321
|
+
if (stmt.distinct) {
|
|
322
|
+
plan = { kind: 'Distinct', input: plan };
|
|
323
|
+
}
|
|
324
|
+
return plan;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../sqlEngine/logical/build.ts"],"names":[],"mappings":"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"}
|