@harperfast/harper 5.2.0-alpha.5 → 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/agent/agent.ts +152 -10
- package/agent/bestPractices.ts +58 -0
- package/agent/mcpTools.ts +122 -0
- package/agent/operations.ts +10 -1
- package/agent/registryTools.ts +117 -0
- package/agent/session.ts +16 -7
- package/agent/tools/fsTools.ts +74 -27
- package/agent/tools/inspectorTool.ts +459 -0
- package/agent/toolset.ts +27 -7
- package/agent/types.ts +2 -0
- package/components/Application.ts +566 -85
- package/components/OptionsWatcher.ts +62 -2
- package/components/Scope.ts +31 -8
- package/components/componentLoader.ts +5 -1
- package/components/componentSecrets.ts +514 -55
- package/components/deploymentRecorder.ts +7 -6
- package/components/gitCredentialHelper.js +115 -0
- package/components/gitCredentialServer.ts +251 -0
- package/components/mcp/tools/application.ts +197 -23
- package/components/mcp/tools/operations.ts +1 -1
- package/components/mcp/tools/schemas/derive.ts +6 -2
- package/components/operations.js +21 -19
- package/components/operationsValidation.js +86 -21
- package/components/secretOperations.ts +110 -30
- package/config/harperConfigEnvVars.ts +90 -5
- package/config-root.schema.json +4 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +7 -0
- package/dist/agent/agent.d.ts +24 -3
- package/dist/agent/agent.js +172 -10
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/bestPractices.d.ts +24 -0
- package/dist/agent/bestPractices.js +60 -0
- package/dist/agent/bestPractices.js.map +1 -0
- package/dist/agent/mcpTools.d.ts +24 -0
- package/dist/agent/mcpTools.js +115 -0
- package/dist/agent/mcpTools.js.map +1 -0
- package/dist/agent/operations.js +10 -1
- package/dist/agent/operations.js.map +1 -1
- package/dist/agent/registryTools.d.ts +45 -0
- package/dist/agent/registryTools.js +113 -0
- package/dist/agent/registryTools.js.map +1 -0
- package/dist/agent/session.js +16 -7
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/tools/fsTools.js +70 -28
- package/dist/agent/tools/fsTools.js.map +1 -1
- package/dist/agent/tools/inspectorTool.d.ts +40 -0
- package/dist/agent/tools/inspectorTool.js +428 -0
- package/dist/agent/tools/inspectorTool.js.map +1 -0
- package/dist/agent/toolset.d.ts +16 -6
- package/dist/agent/toolset.js +17 -7
- package/dist/agent/toolset.js.map +1 -1
- package/dist/agent/types.d.ts +2 -0
- package/dist/components/Application.d.ts +73 -18
- package/dist/components/Application.js +475 -64
- package/dist/components/Application.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +1 -1
- package/dist/components/OptionsWatcher.js +65 -2
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/Scope.d.ts +8 -6
- package/dist/components/Scope.js +22 -6
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +5 -1
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentSecrets.d.ts +33 -7
- package/dist/components/componentSecrets.js +473 -59
- package/dist/components/componentSecrets.js.map +1 -1
- package/dist/components/deploymentRecorder.d.ts +2 -2
- package/dist/components/deploymentRecorder.js +1 -1
- package/dist/components/deploymentRecorder.js.map +1 -1
- package/dist/components/gitCredentialHelper.d.ts +1 -0
- package/dist/components/gitCredentialHelper.js +113 -0
- package/dist/components/gitCredentialHelper.js.map +1 -0
- package/dist/components/gitCredentialServer.d.ts +33 -0
- package/dist/components/gitCredentialServer.js +236 -0
- package/dist/components/gitCredentialServer.js.map +1 -0
- package/dist/components/mcp/tools/application.d.ts +19 -0
- package/dist/components/mcp/tools/application.js +180 -22
- package/dist/components/mcp/tools/application.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +13 -0
- package/dist/components/mcp/tools/operations.js +1 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/derive.js +6 -2
- package/dist/components/mcp/tools/schemas/derive.js.map +1 -1
- package/dist/components/operations.js +23 -21
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +84 -21
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/secretOperations.d.ts +33 -11
- package/dist/components/secretOperations.js +90 -26
- package/dist/components/secretOperations.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +21 -0
- package/dist/config/harperConfigEnvVars.js +95 -5
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.js +8 -0
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/Resource.d.ts +19 -0
- package/dist/resources/Resource.js +98 -4
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/Table.d.ts +12 -1
- package/dist/resources/Table.js +269 -53
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +28 -25
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/databases.js +21 -0
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/defineResource.d.ts +180 -0
- package/dist/resources/defineResource.js +505 -0
- package/dist/resources/defineResource.js.map +1 -0
- package/dist/resources/defineTable.d.ts +221 -0
- package/dist/resources/defineTable.js +227 -0
- package/dist/resources/defineTable.js.map +1 -0
- package/dist/resources/jsonSchemaTypes.d.ts +2 -0
- package/dist/resources/jsonSchemaTypes.js +12 -4
- package/dist/resources/jsonSchemaTypes.js.map +1 -1
- package/dist/resources/openApi.js +69 -13
- package/dist/resources/openApi.js.map +1 -1
- package/dist/resources/search.js +6 -8
- package/dist/resources/search.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -2
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.js +35 -15
- package/dist/server/http.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.js +8 -5
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/uwsServer.js +23 -0
- package/dist/server/serverHelpers/uwsServer.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/utility/errors/hdbError.d.ts +21 -0
- package/dist/utility/errors/hdbError.js +23 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/validation/configValidator.js +22 -6
- package/dist/validation/configValidator.js.map +1 -1
- package/dist/validation/deleteValidator.js +10 -2
- package/dist/validation/deleteValidator.js.map +1 -1
- package/index.ts +33 -0
- package/npm-shrinkwrap.json +9197 -15066
- package/package.json +3 -1
- package/resources/DESIGN.md +43 -15
- package/resources/Resource.ts +104 -4
- package/resources/Table.ts +298 -74
- package/resources/analytics/read.ts +30 -25
- package/resources/databases.ts +24 -0
- package/resources/defineResource.ts +651 -0
- package/resources/defineTable.ts +407 -0
- package/resources/jsonSchemaTypes.ts +12 -4
- package/resources/openApi.ts +68 -16
- package/resources/search.ts +5 -8
- package/server/graphqlQuerying.ts +4 -2
- package/server/http.ts +40 -16
- package/server/serverHelpers/serverUtilities.ts +19 -6
- package/server/serverHelpers/uwsServer.ts +24 -0
- package/sqlTranslator/index.ts +16 -6
- package/studio/web/assets/{Chat-Cv_2paZE.js → Chat-BZks8dVF.js} +2 -2
- package/studio/web/assets/{Chat-Cv_2paZE.js.map → Chat-BZks8dVF.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-CPyPIcVR.js → FloatingChat-Dic8paVO.js} +4 -4
- package/studio/web/assets/{FloatingChat-CPyPIcVR.js.map → FloatingChat-Dic8paVO.js.map} +1 -1
- package/studio/web/assets/{applications-C0jT2vdZ.js → applications-uOXkeUIN.js} +2 -2
- package/studio/web/assets/{applications-C0jT2vdZ.js.map → applications-uOXkeUIN.js.map} +1 -1
- package/studio/web/assets/{index-D_GKOkhn.js → index-i-2wrKhv.js} +6 -6
- package/studio/web/assets/{index-D_GKOkhn.js.map → index-i-2wrKhv.js.map} +1 -1
- package/studio/web/assets/{index.lazy-CAmCIA65.js → index.lazy-Csk8eCoB.js} +4 -4
- package/studio/web/assets/{index.lazy-CAmCIA65.js.map → index.lazy-Csk8eCoB.js.map} +1 -1
- package/studio/web/assets/{profile-CaF-4aZe.js → profile-Sb3mGDl6.js} +2 -2
- package/studio/web/assets/{profile-CaF-4aZe.js.map → profile-Sb3mGDl6.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-DLW1DHCt.js → setComponentFile-BgZcaPJ2.js} +2 -2
- package/studio/web/assets/{setComponentFile-DLW1DHCt.js.map → setComponentFile-BgZcaPJ2.js.map} +1 -1
- package/studio/web/assets/{setup-TGCErIhq.js → setup-DKtlLgmT.js} +2 -2
- package/studio/web/assets/{setup-TGCErIhq.js.map → setup-DKtlLgmT.js.map} +1 -1
- package/studio/web/assets/{status-DG0Maoao.js → status-B45iLeug.js} +2 -2
- package/studio/web/assets/{status-DG0Maoao.js.map → status-B45iLeug.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-8T4SgQ1m.js → swagger-ui-react-Csu4026e.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-8T4SgQ1m.js.map → swagger-ui-react-Csu4026e.js.map} +1 -1
- package/studio/web/assets/{tsMode-DJ6Sl24Q.js → tsMode-DVgxUr_l.js} +2 -2
- package/studio/web/assets/{tsMode-DJ6Sl24Q.js.map → tsMode-DVgxUr_l.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-JO2mfWTQ.js → useEntityRestURL-yfDQMV1f.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-JO2mfWTQ.js.map → useEntityRestURL-yfDQMV1f.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/utility/errors/hdbError.ts +32 -0
- package/validation/configValidator.ts +23 -6
- 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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"}
|