@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.
Files changed (311) hide show
  1. package/agent/agent.ts +152 -10
  2. package/agent/bestPractices.ts +58 -0
  3. package/agent/mcpTools.ts +122 -0
  4. package/agent/operations.ts +10 -1
  5. package/agent/registryTools.ts +117 -0
  6. package/agent/session.ts +16 -7
  7. package/agent/tools/fsTools.ts +74 -27
  8. package/agent/tools/inspectorTool.ts +459 -0
  9. package/agent/toolset.ts +27 -7
  10. package/agent/types.ts +2 -0
  11. package/components/Application.ts +566 -85
  12. package/components/OptionsWatcher.ts +62 -2
  13. package/components/Scope.ts +31 -8
  14. package/components/componentLoader.ts +5 -1
  15. package/components/componentSecrets.ts +514 -55
  16. package/components/deploymentRecorder.ts +7 -6
  17. package/components/gitCredentialHelper.js +115 -0
  18. package/components/gitCredentialServer.ts +251 -0
  19. package/components/mcp/tools/application.ts +197 -23
  20. package/components/mcp/tools/operations.ts +1 -1
  21. package/components/mcp/tools/schemas/derive.ts +6 -2
  22. package/components/operations.js +21 -19
  23. package/components/operationsValidation.js +86 -21
  24. package/components/secretOperations.ts +110 -30
  25. package/config/harperConfigEnvVars.ts +90 -5
  26. package/config-root.schema.json +4 -0
  27. package/dataLayer/harperBridge/ResourceBridge.ts +7 -0
  28. package/dist/agent/agent.d.ts +24 -3
  29. package/dist/agent/agent.js +172 -10
  30. package/dist/agent/agent.js.map +1 -1
  31. package/dist/agent/bestPractices.d.ts +24 -0
  32. package/dist/agent/bestPractices.js +60 -0
  33. package/dist/agent/bestPractices.js.map +1 -0
  34. package/dist/agent/mcpTools.d.ts +24 -0
  35. package/dist/agent/mcpTools.js +115 -0
  36. package/dist/agent/mcpTools.js.map +1 -0
  37. package/dist/agent/operations.js +10 -1
  38. package/dist/agent/operations.js.map +1 -1
  39. package/dist/agent/registryTools.d.ts +45 -0
  40. package/dist/agent/registryTools.js +113 -0
  41. package/dist/agent/registryTools.js.map +1 -0
  42. package/dist/agent/session.js +16 -7
  43. package/dist/agent/session.js.map +1 -1
  44. package/dist/agent/tools/fsTools.js +70 -28
  45. package/dist/agent/tools/fsTools.js.map +1 -1
  46. package/dist/agent/tools/inspectorTool.d.ts +40 -0
  47. package/dist/agent/tools/inspectorTool.js +428 -0
  48. package/dist/agent/tools/inspectorTool.js.map +1 -0
  49. package/dist/agent/toolset.d.ts +16 -6
  50. package/dist/agent/toolset.js +17 -7
  51. package/dist/agent/toolset.js.map +1 -1
  52. package/dist/agent/types.d.ts +2 -0
  53. package/dist/components/Application.d.ts +73 -18
  54. package/dist/components/Application.js +475 -64
  55. package/dist/components/Application.js.map +1 -1
  56. package/dist/components/OptionsWatcher.d.ts +1 -1
  57. package/dist/components/OptionsWatcher.js +65 -2
  58. package/dist/components/OptionsWatcher.js.map +1 -1
  59. package/dist/components/Scope.d.ts +8 -6
  60. package/dist/components/Scope.js +22 -6
  61. package/dist/components/Scope.js.map +1 -1
  62. package/dist/components/componentLoader.js +5 -1
  63. package/dist/components/componentLoader.js.map +1 -1
  64. package/dist/components/componentSecrets.d.ts +33 -7
  65. package/dist/components/componentSecrets.js +473 -59
  66. package/dist/components/componentSecrets.js.map +1 -1
  67. package/dist/components/deploymentRecorder.d.ts +2 -2
  68. package/dist/components/deploymentRecorder.js +1 -1
  69. package/dist/components/deploymentRecorder.js.map +1 -1
  70. package/dist/components/gitCredentialHelper.d.ts +1 -0
  71. package/dist/components/gitCredentialHelper.js +113 -0
  72. package/dist/components/gitCredentialHelper.js.map +1 -0
  73. package/dist/components/gitCredentialServer.d.ts +33 -0
  74. package/dist/components/gitCredentialServer.js +236 -0
  75. package/dist/components/gitCredentialServer.js.map +1 -0
  76. package/dist/components/mcp/tools/application.d.ts +19 -0
  77. package/dist/components/mcp/tools/application.js +180 -22
  78. package/dist/components/mcp/tools/application.js.map +1 -1
  79. package/dist/components/mcp/tools/operations.d.ts +13 -0
  80. package/dist/components/mcp/tools/operations.js +1 -0
  81. package/dist/components/mcp/tools/operations.js.map +1 -1
  82. package/dist/components/mcp/tools/schemas/derive.js +6 -2
  83. package/dist/components/mcp/tools/schemas/derive.js.map +1 -1
  84. package/dist/components/operations.js +23 -21
  85. package/dist/components/operations.js.map +1 -1
  86. package/dist/components/operationsValidation.js +84 -21
  87. package/dist/components/operationsValidation.js.map +1 -1
  88. package/dist/components/secretOperations.d.ts +33 -11
  89. package/dist/components/secretOperations.js +90 -26
  90. package/dist/components/secretOperations.js.map +1 -1
  91. package/dist/config/harperConfigEnvVars.d.ts +21 -0
  92. package/dist/config/harperConfigEnvVars.js +95 -5
  93. package/dist/config/harperConfigEnvVars.js.map +1 -1
  94. package/dist/dataLayer/harperBridge/ResourceBridge.js +8 -0
  95. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  96. package/dist/index.d.ts +4 -0
  97. package/dist/index.js +14 -1
  98. package/dist/index.js.map +1 -1
  99. package/dist/resources/Resource.d.ts +19 -0
  100. package/dist/resources/Resource.js +98 -4
  101. package/dist/resources/Resource.js.map +1 -1
  102. package/dist/resources/Table.d.ts +12 -1
  103. package/dist/resources/Table.js +269 -53
  104. package/dist/resources/Table.js.map +1 -1
  105. package/dist/resources/analytics/read.js +28 -25
  106. package/dist/resources/analytics/read.js.map +1 -1
  107. package/dist/resources/databases.js +21 -0
  108. package/dist/resources/databases.js.map +1 -1
  109. package/dist/resources/defineResource.d.ts +180 -0
  110. package/dist/resources/defineResource.js +505 -0
  111. package/dist/resources/defineResource.js.map +1 -0
  112. package/dist/resources/defineTable.d.ts +221 -0
  113. package/dist/resources/defineTable.js +227 -0
  114. package/dist/resources/defineTable.js.map +1 -0
  115. package/dist/resources/jsonSchemaTypes.d.ts +2 -0
  116. package/dist/resources/jsonSchemaTypes.js +12 -4
  117. package/dist/resources/jsonSchemaTypes.js.map +1 -1
  118. package/dist/resources/openApi.js +69 -13
  119. package/dist/resources/openApi.js.map +1 -1
  120. package/dist/resources/search.js +6 -8
  121. package/dist/resources/search.js.map +1 -1
  122. package/dist/server/graphqlQuerying.js +4 -2
  123. package/dist/server/graphqlQuerying.js.map +1 -1
  124. package/dist/server/http.d.ts +12 -0
  125. package/dist/server/http.js +35 -15
  126. package/dist/server/http.js.map +1 -1
  127. package/dist/server/serverHelpers/serverUtilities.js +8 -5
  128. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  129. package/dist/server/serverHelpers/uwsServer.js +23 -0
  130. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  131. package/dist/sqlEngine/binder/bind.d.ts +72 -0
  132. package/dist/sqlEngine/binder/bind.js +289 -0
  133. package/dist/sqlEngine/binder/bind.js.map +1 -0
  134. package/dist/sqlEngine/config.d.ts +35 -0
  135. package/dist/sqlEngine/config.js +62 -0
  136. package/dist/sqlEngine/config.js.map +1 -0
  137. package/dist/sqlEngine/diff/differential.d.ts +23 -0
  138. package/dist/sqlEngine/diff/differential.js +90 -0
  139. package/dist/sqlEngine/diff/differential.js.map +1 -0
  140. package/dist/sqlEngine/errors.d.ts +22 -0
  141. package/dist/sqlEngine/errors.js +36 -0
  142. package/dist/sqlEngine/errors.js.map +1 -0
  143. package/dist/sqlEngine/executor/runMutation.d.ts +35 -0
  144. package/dist/sqlEngine/executor/runMutation.js +352 -0
  145. package/dist/sqlEngine/executor/runMutation.js.map +1 -0
  146. package/dist/sqlEngine/executor/runSelect.d.ts +7 -0
  147. package/dist/sqlEngine/executor/runSelect.js +14 -0
  148. package/dist/sqlEngine/executor/runSelect.js.map +1 -0
  149. package/dist/sqlEngine/expressions/compile.d.ts +24 -0
  150. package/dist/sqlEngine/expressions/compile.js +326 -0
  151. package/dist/sqlEngine/expressions/compile.js.map +1 -0
  152. package/dist/sqlEngine/functions/aggregates.d.ts +12 -0
  153. package/dist/sqlEngine/functions/aggregates.js +299 -0
  154. package/dist/sqlEngine/functions/aggregates.js.map +1 -0
  155. package/dist/sqlEngine/functions/registry.d.ts +36 -0
  156. package/dist/sqlEngine/functions/registry.js +33 -0
  157. package/dist/sqlEngine/functions/registry.js.map +1 -0
  158. package/dist/sqlEngine/functions/standard.d.ts +9 -0
  159. package/dist/sqlEngine/functions/standard.js +86 -0
  160. package/dist/sqlEngine/functions/standard.js.map +1 -0
  161. package/dist/sqlEngine/index.d.ts +29 -0
  162. package/dist/sqlEngine/index.js +62 -0
  163. package/dist/sqlEngine/index.js.map +1 -0
  164. package/dist/sqlEngine/logical/build.d.ts +20 -0
  165. package/dist/sqlEngine/logical/build.js +326 -0
  166. package/dist/sqlEngine/logical/build.js.map +1 -0
  167. package/dist/sqlEngine/logical/op.d.ts +105 -0
  168. package/dist/sqlEngine/logical/op.js +10 -0
  169. package/dist/sqlEngine/logical/op.js.map +1 -0
  170. package/dist/sqlEngine/optimizer/joinAnalysis.d.ts +37 -0
  171. package/dist/sqlEngine/optimizer/joinAnalysis.js +144 -0
  172. package/dist/sqlEngine/optimizer/joinAnalysis.js.map +1 -0
  173. package/dist/sqlEngine/optimizer/optimize.d.ts +13 -0
  174. package/dist/sqlEngine/optimizer/optimize.js +53 -0
  175. package/dist/sqlEngine/optimizer/optimize.js.map +1 -0
  176. package/dist/sqlEngine/optimizer/ruleEngine.d.ts +7 -0
  177. package/dist/sqlEngine/optimizer/ruleEngine.js +26 -0
  178. package/dist/sqlEngine/optimizer/ruleEngine.js.map +1 -0
  179. package/dist/sqlEngine/optimizer/rules/limitPushdown.d.ts +19 -0
  180. package/dist/sqlEngine/optimizer/rules/limitPushdown.js +55 -0
  181. package/dist/sqlEngine/optimizer/rules/limitPushdown.js.map +1 -0
  182. package/dist/sqlEngine/optimizer/rules/planJoins.d.ts +19 -0
  183. package/dist/sqlEngine/optimizer/rules/planJoins.js +62 -0
  184. package/dist/sqlEngine/optimizer/rules/planJoins.js.map +1 -0
  185. package/dist/sqlEngine/optimizer/rules/predicateNormalize.d.ts +18 -0
  186. package/dist/sqlEngine/optimizer/rules/predicateNormalize.js +80 -0
  187. package/dist/sqlEngine/optimizer/rules/predicateNormalize.js.map +1 -0
  188. package/dist/sqlEngine/optimizer/rules/predicatePushdown.d.ts +11 -0
  189. package/dist/sqlEngine/optimizer/rules/predicatePushdown.js +48 -0
  190. package/dist/sqlEngine/optimizer/rules/predicatePushdown.js.map +1 -0
  191. package/dist/sqlEngine/optimizer/rules/projectionPushdown.d.ts +23 -0
  192. package/dist/sqlEngine/optimizer/rules/projectionPushdown.js +160 -0
  193. package/dist/sqlEngine/optimizer/rules/projectionPushdown.js.map +1 -0
  194. package/dist/sqlEngine/optimizer/rules/sortFromIndex.d.ts +14 -0
  195. package/dist/sqlEngine/optimizer/rules/sortFromIndex.js +49 -0
  196. package/dist/sqlEngine/optimizer/rules/sortFromIndex.js.map +1 -0
  197. package/dist/sqlEngine/optimizer/rules/validateScannable.d.ts +15 -0
  198. package/dist/sqlEngine/optimizer/rules/validateScannable.js +60 -0
  199. package/dist/sqlEngine/optimizer/rules/validateScannable.js.map +1 -0
  200. package/dist/sqlEngine/optimizer/whereToConditions.d.ts +85 -0
  201. package/dist/sqlEngine/optimizer/whereToConditions.js +484 -0
  202. package/dist/sqlEngine/optimizer/whereToConditions.js.map +1 -0
  203. package/dist/sqlEngine/parser/ast.d.ts +139 -0
  204. package/dist/sqlEngine/parser/ast.js +10 -0
  205. package/dist/sqlEngine/parser/ast.js.map +1 -0
  206. package/dist/sqlEngine/parser/normalizer.d.ts +28 -0
  207. package/dist/sqlEngine/parser/normalizer.js +413 -0
  208. package/dist/sqlEngine/parser/normalizer.js.map +1 -0
  209. package/dist/sqlEngine/parser/parse.d.ts +14 -0
  210. package/dist/sqlEngine/parser/parse.js +20 -0
  211. package/dist/sqlEngine/parser/parse.js.map +1 -0
  212. package/dist/sqlEngine/physical/PhysicalDistinct.d.ts +9 -0
  213. package/dist/sqlEngine/physical/PhysicalDistinct.js +29 -0
  214. package/dist/sqlEngine/physical/PhysicalDistinct.js.map +1 -0
  215. package/dist/sqlEngine/physical/PhysicalFilter.d.ts +10 -0
  216. package/dist/sqlEngine/physical/PhysicalFilter.js +25 -0
  217. package/dist/sqlEngine/physical/PhysicalFilter.js.map +1 -0
  218. package/dist/sqlEngine/physical/PhysicalHashAggregate.d.ts +27 -0
  219. package/dist/sqlEngine/physical/PhysicalHashAggregate.js +100 -0
  220. package/dist/sqlEngine/physical/PhysicalHashAggregate.js.map +1 -0
  221. package/dist/sqlEngine/physical/PhysicalHashJoin.d.ts +29 -0
  222. package/dist/sqlEngine/physical/PhysicalHashJoin.js +93 -0
  223. package/dist/sqlEngine/physical/PhysicalHashJoin.js.map +1 -0
  224. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.d.ts +36 -0
  225. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js +78 -0
  226. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js.map +1 -0
  227. package/dist/sqlEngine/physical/PhysicalIndexScan.d.ts +22 -0
  228. package/dist/sqlEngine/physical/PhysicalIndexScan.js +77 -0
  229. package/dist/sqlEngine/physical/PhysicalIndexScan.js.map +1 -0
  230. package/dist/sqlEngine/physical/PhysicalLimit.d.ts +5 -0
  231. package/dist/sqlEngine/physical/PhysicalLimit.js +28 -0
  232. package/dist/sqlEngine/physical/PhysicalLimit.js.map +1 -0
  233. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.d.ts +20 -0
  234. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js +51 -0
  235. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js.map +1 -0
  236. package/dist/sqlEngine/physical/PhysicalProject.d.ts +18 -0
  237. package/dist/sqlEngine/physical/PhysicalProject.js +117 -0
  238. package/dist/sqlEngine/physical/PhysicalProject.js.map +1 -0
  239. package/dist/sqlEngine/physical/PhysicalQualify.d.ts +13 -0
  240. package/dist/sqlEngine/physical/PhysicalQualify.js +29 -0
  241. package/dist/sqlEngine/physical/PhysicalQualify.js.map +1 -0
  242. package/dist/sqlEngine/physical/PhysicalSort.d.ts +12 -0
  243. package/dist/sqlEngine/physical/PhysicalSort.js +59 -0
  244. package/dist/sqlEngine/physical/PhysicalSort.js.map +1 -0
  245. package/dist/sqlEngine/physical/op.d.ts +11 -0
  246. package/dist/sqlEngine/physical/op.js +9 -0
  247. package/dist/sqlEngine/physical/op.js.map +1 -0
  248. package/dist/sqlEngine/physical/plan.d.ts +23 -0
  249. package/dist/sqlEngine/physical/plan.js +162 -0
  250. package/dist/sqlEngine/physical/plan.js.map +1 -0
  251. package/dist/sqlEngine/router.d.ts +26 -0
  252. package/dist/sqlEngine/router.js +48 -0
  253. package/dist/sqlEngine/router.js.map +1 -0
  254. package/dist/sqlEngine/types.d.ts +37 -0
  255. package/dist/sqlEngine/types.js +13 -0
  256. package/dist/sqlEngine/types.js.map +1 -0
  257. package/dist/sqlTranslator/index.js +7 -1
  258. package/dist/sqlTranslator/index.js.map +1 -1
  259. package/dist/utility/errors/hdbError.d.ts +21 -0
  260. package/dist/utility/errors/hdbError.js +23 -1
  261. package/dist/utility/errors/hdbError.js.map +1 -1
  262. package/dist/validation/configValidator.js +22 -6
  263. package/dist/validation/configValidator.js.map +1 -1
  264. package/dist/validation/deleteValidator.js +10 -2
  265. package/dist/validation/deleteValidator.js.map +1 -1
  266. package/index.ts +33 -0
  267. package/npm-shrinkwrap.json +9197 -15066
  268. package/package.json +3 -1
  269. package/resources/DESIGN.md +43 -15
  270. package/resources/Resource.ts +104 -4
  271. package/resources/Table.ts +298 -74
  272. package/resources/analytics/read.ts +30 -25
  273. package/resources/databases.ts +24 -0
  274. package/resources/defineResource.ts +651 -0
  275. package/resources/defineTable.ts +407 -0
  276. package/resources/jsonSchemaTypes.ts +12 -4
  277. package/resources/openApi.ts +68 -16
  278. package/resources/search.ts +5 -8
  279. package/server/graphqlQuerying.ts +4 -2
  280. package/server/http.ts +40 -16
  281. package/server/serverHelpers/serverUtilities.ts +19 -6
  282. package/server/serverHelpers/uwsServer.ts +24 -0
  283. package/sqlTranslator/index.ts +16 -6
  284. package/studio/web/assets/{Chat-Cv_2paZE.js → Chat-BZks8dVF.js} +2 -2
  285. package/studio/web/assets/{Chat-Cv_2paZE.js.map → Chat-BZks8dVF.js.map} +1 -1
  286. package/studio/web/assets/{FloatingChat-CPyPIcVR.js → FloatingChat-Dic8paVO.js} +4 -4
  287. package/studio/web/assets/{FloatingChat-CPyPIcVR.js.map → FloatingChat-Dic8paVO.js.map} +1 -1
  288. package/studio/web/assets/{applications-C0jT2vdZ.js → applications-uOXkeUIN.js} +2 -2
  289. package/studio/web/assets/{applications-C0jT2vdZ.js.map → applications-uOXkeUIN.js.map} +1 -1
  290. package/studio/web/assets/{index-D_GKOkhn.js → index-i-2wrKhv.js} +6 -6
  291. package/studio/web/assets/{index-D_GKOkhn.js.map → index-i-2wrKhv.js.map} +1 -1
  292. package/studio/web/assets/{index.lazy-CAmCIA65.js → index.lazy-Csk8eCoB.js} +4 -4
  293. package/studio/web/assets/{index.lazy-CAmCIA65.js.map → index.lazy-Csk8eCoB.js.map} +1 -1
  294. package/studio/web/assets/{profile-CaF-4aZe.js → profile-Sb3mGDl6.js} +2 -2
  295. package/studio/web/assets/{profile-CaF-4aZe.js.map → profile-Sb3mGDl6.js.map} +1 -1
  296. package/studio/web/assets/{setComponentFile-DLW1DHCt.js → setComponentFile-BgZcaPJ2.js} +2 -2
  297. package/studio/web/assets/{setComponentFile-DLW1DHCt.js.map → setComponentFile-BgZcaPJ2.js.map} +1 -1
  298. package/studio/web/assets/{setup-TGCErIhq.js → setup-DKtlLgmT.js} +2 -2
  299. package/studio/web/assets/{setup-TGCErIhq.js.map → setup-DKtlLgmT.js.map} +1 -1
  300. package/studio/web/assets/{status-DG0Maoao.js → status-B45iLeug.js} +2 -2
  301. package/studio/web/assets/{status-DG0Maoao.js.map → status-B45iLeug.js.map} +1 -1
  302. package/studio/web/assets/{swagger-ui-react-8T4SgQ1m.js → swagger-ui-react-Csu4026e.js} +2 -2
  303. package/studio/web/assets/{swagger-ui-react-8T4SgQ1m.js.map → swagger-ui-react-Csu4026e.js.map} +1 -1
  304. package/studio/web/assets/{tsMode-DJ6Sl24Q.js → tsMode-DVgxUr_l.js} +2 -2
  305. package/studio/web/assets/{tsMode-DJ6Sl24Q.js.map → tsMode-DVgxUr_l.js.map} +1 -1
  306. package/studio/web/assets/{useEntityRestURL-JO2mfWTQ.js → useEntityRestURL-yfDQMV1f.js} +2 -2
  307. package/studio/web/assets/{useEntityRestURL-JO2mfWTQ.js.map → useEntityRestURL-yfDQMV1f.js.map} +1 -1
  308. package/studio/web/index.html +1 -1
  309. package/utility/errors/hdbError.ts +32 -0
  310. package/validation/configValidator.ts +23 -6
  311. package/validation/deleteValidator.ts +11 -2
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * PhysicalProject: per-row evaluation of the SELECT clause.
4
+ *
5
+ * Single-table (`qualified = false`): star expansion forwards the row's keys
6
+ * intact and layers projected columns on top, matching the Resource API's
7
+ * natural record shape.
8
+ *
9
+ * Join queries (`qualified = true`): rows arrive keyed by `<alias>.<name>`.
10
+ * Output columns are renamed to clean, unqualified names (or the SELECT `AS`
11
+ * alias). When two output columns collide on the same name the later one is
12
+ * suffixed `_2`, `_3`, … in SELECT order (legacy AlaSQL instead emitted
13
+ * `[name]`/`[name1]`; the differential harness normalizes between the two).
14
+ * `SELECT *` expands every column across all joined tables; `SELECT t.*`
15
+ * expands only table `t`'s columns.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.physicalProject = physicalProject;
19
+ const compile_ts_1 = require("../expressions/compile.js");
20
+ function physicalProject(child, projections, qualified = false) {
21
+ if (qualified)
22
+ return qualifiedProject(child, projections);
23
+ const slots = projections.map((p) => buildSlot(p));
24
+ const schema = slots.flatMap((s) => s.schema);
25
+ return {
26
+ schema,
27
+ async *execute(ctx) {
28
+ for await (const row of child.execute(ctx)) {
29
+ const out = {};
30
+ for (const slot of slots)
31
+ slot.apply(row, out);
32
+ yield out;
33
+ }
34
+ },
35
+ };
36
+ }
37
+ function buildSlot(p) {
38
+ if (p.expr.kind === 'star') {
39
+ return {
40
+ schema: [],
41
+ apply(row, out) {
42
+ for (const k of Object.keys(row))
43
+ out[k] = row[k];
44
+ },
45
+ };
46
+ }
47
+ const compiled = (0, compile_ts_1.compileExpr)(p.expr);
48
+ const name = p.alias ?? p.label ?? expressionLabel(p);
49
+ return {
50
+ schema: [{ name, type: compiled.type, nullable: true }],
51
+ apply(row, out) {
52
+ out[name] = compiled.eval(row);
53
+ },
54
+ };
55
+ }
56
+ function expressionLabel(p) {
57
+ if (p.expr.kind === 'column')
58
+ return p.expr.name;
59
+ return p.alias ?? 'expr';
60
+ }
61
+ function qualifiedProject(child, projections) {
62
+ const slots = projections.map((p) => buildQualifiedSlot(p));
63
+ return {
64
+ schema: [],
65
+ async *execute(ctx) {
66
+ for await (const row of child.execute(ctx)) {
67
+ const pairs = [];
68
+ for (const slot of slots)
69
+ slot.emit(row, pairs);
70
+ yield dedupeIntoRow(pairs);
71
+ }
72
+ },
73
+ };
74
+ }
75
+ function buildQualifiedSlot(p) {
76
+ if (p.expr.kind === 'star') {
77
+ const prefix = p.expr.table ? `${p.expr.table}.` : undefined;
78
+ return {
79
+ emit(row, acc) {
80
+ for (const k of Object.keys(row)) {
81
+ if (prefix) {
82
+ if (k.startsWith(prefix))
83
+ acc.push([k.slice(prefix.length), row[k]]);
84
+ }
85
+ else {
86
+ // strip the alias qualifier for clean output
87
+ const dot = k.indexOf('.');
88
+ acc.push([dot >= 0 ? k.slice(dot + 1) : k, row[k]]);
89
+ }
90
+ }
91
+ },
92
+ };
93
+ }
94
+ const compiled = (0, compile_ts_1.compileExpr)(p.expr, true);
95
+ const name = p.alias ?? p.label ?? qualifiedLabel(p);
96
+ return {
97
+ emit(row, acc) {
98
+ acc.push([name, compiled.eval(row)]);
99
+ },
100
+ };
101
+ }
102
+ function qualifiedLabel(p) {
103
+ if (p.expr.kind === 'column')
104
+ return p.expr.name; // bare name, alias dropped
105
+ return p.alias ?? 'expr';
106
+ }
107
+ function dedupeIntoRow(pairs) {
108
+ const out = {};
109
+ const counts = new Map();
110
+ for (const [name, value] of pairs) {
111
+ const n = counts.get(name) ?? 0;
112
+ counts.set(name, n + 1);
113
+ out[n === 0 ? name : `${name}_${n + 1}`] = value;
114
+ }
115
+ return out;
116
+ }
117
+ //# sourceMappingURL=PhysicalProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicalProject.js","sourceRoot":"","sources":["../../../sqlEngine/physical/PhysicalProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PhysicalQualify: re-keys a base scan's bare records into the join row model.
3
+ *
4
+ * In a join query every column flows through the pipeline under a
5
+ * `<alias>.<attribute>` key so that same-named columns from different tables
6
+ * never collide. The base PhysicalIndexScan yields plain records keyed by bare
7
+ * attribute name (and Resource API conditions/projection operate on bare
8
+ * names); this operator wraps that scan and qualifies every key with the
9
+ * scan's alias. Residual single-table filters are applied *below* this operator
10
+ * (in bare space) so only join-level operators see qualified rows.
11
+ */
12
+ import type { PhysicalOp } from './op.ts';
13
+ export declare function physicalQualify(child: PhysicalOp, alias: string): PhysicalOp;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * PhysicalQualify: re-keys a base scan's bare records into the join row model.
4
+ *
5
+ * In a join query every column flows through the pipeline under a
6
+ * `<alias>.<attribute>` key so that same-named columns from different tables
7
+ * never collide. The base PhysicalIndexScan yields plain records keyed by bare
8
+ * attribute name (and Resource API conditions/projection operate on bare
9
+ * names); this operator wraps that scan and qualifies every key with the
10
+ * scan's alias. Residual single-table filters are applied *below* this operator
11
+ * (in bare space) so only join-level operators see qualified rows.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.physicalQualify = physicalQualify;
15
+ function physicalQualify(child, alias) {
16
+ const prefix = `${alias}.`;
17
+ return {
18
+ schema: child.schema,
19
+ async *execute(ctx) {
20
+ for await (const row of child.execute(ctx)) {
21
+ const out = {};
22
+ for (const k of Object.keys(row))
23
+ out[prefix + k] = row[k];
24
+ yield out;
25
+ }
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=PhysicalQualify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicalQualify.js","sourceRoot":"","sources":["../../../sqlEngine/physical/PhysicalQualify.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAKH,0CAYC;AAZD,SAAgB,eAAe,CAAC,KAAiB,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC;IAC3B,OAAO;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAqB;YACnC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAQ,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3D,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PhysicalSort: in-memory sort with a configurable row cap.
3
+ *
4
+ * Used only when the optimizer's sort-from-index rule could not push the
5
+ * sort into Table.search. Buffers up to maxSortRows rows; throws
6
+ * EngineUnsupportedError if the input exceeds that cap so the router falls
7
+ * back to legacy in 'auto' mode (runSelect fully materializes before
8
+ * returning, so nothing has been emitted to the client when the cap trips).
9
+ */
10
+ import type { SortNode } from '../parser/ast.ts';
11
+ import type { PhysicalOp } from './op.ts';
12
+ export declare function physicalSort(child: PhysicalOp, keys: SortNode[], qualified?: boolean): PhysicalOp;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * PhysicalSort: in-memory sort with a configurable row cap.
4
+ *
5
+ * Used only when the optimizer's sort-from-index rule could not push the
6
+ * sort into Table.search. Buffers up to maxSortRows rows; throws
7
+ * EngineUnsupportedError if the input exceeds that cap so the router falls
8
+ * back to legacy in 'auto' mode (runSelect fully materializes before
9
+ * returning, so nothing has been emitted to the client when the cap trips).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.physicalSort = physicalSort;
13
+ const compile_ts_1 = require("../expressions/compile.js");
14
+ const errors_ts_1 = require("../errors.js");
15
+ const config_ts_1 = require("../config.js");
16
+ function physicalSort(child, keys, qualified = false) {
17
+ const compiled = keys.map((k) => ({ get: (0, compile_ts_1.compileExpr)(k.expr, qualified).eval, descending: k.descending }));
18
+ return {
19
+ schema: child.schema,
20
+ async *execute(ctx) {
21
+ const cap = (0, config_ts_1.getSqlEngineConfig)().maxSortRows;
22
+ const buf = [];
23
+ for await (const row of child.execute(ctx)) {
24
+ if (buf.length >= cap) {
25
+ throw new errors_ts_1.EngineUnsupportedError(`in-memory sort exceeded maxSortRows (${cap})`);
26
+ }
27
+ buf.push(row);
28
+ }
29
+ buf.sort((a, b) => {
30
+ for (const k of compiled) {
31
+ const av = k.get(a);
32
+ const bv = k.get(b);
33
+ const cmp = compareValues(av, bv);
34
+ if (cmp !== 0)
35
+ return k.descending ? -cmp : cmp;
36
+ }
37
+ return 0;
38
+ });
39
+ for (const row of buf)
40
+ yield row;
41
+ },
42
+ };
43
+ }
44
+ function compareValues(a, b) {
45
+ if (a == null && b == null)
46
+ return 0;
47
+ if (a == null)
48
+ return -1;
49
+ if (b == null)
50
+ return 1;
51
+ if (typeof a === 'number' && typeof b === 'number')
52
+ return a - b;
53
+ if (typeof a === 'string' && typeof b === 'string')
54
+ return a < b ? -1 : a > b ? 1 : 0;
55
+ const as = String(a);
56
+ const bs = String(b);
57
+ return as < bs ? -1 : as > bs ? 1 : 0;
58
+ }
59
+ //# sourceMappingURL=PhysicalSort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicalSort.js","sourceRoot":"","sources":["../../../sqlEngine/physical/PhysicalSort.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AASH,oCAyBC;AA7BD,0DAAwD;AACxD,4CAAsD;AACtD,4CAAkD;AAElD,SAAgB,YAAY,CAAC,KAAiB,EAAE,IAAgB,EAAE,SAAS,GAAG,KAAK;IAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAA,wBAAW,EAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3G,OAAO;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAqB;YACnC,MAAM,GAAG,GAAG,IAAA,8BAAkB,GAAE,CAAC,WAAW,CAAC;YAC7C,MAAM,GAAG,GAAU,EAAE,CAAC;YACtB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBACvB,MAAM,IAAI,kCAAsB,CAAC,wCAAwC,GAAG,GAAG,CAAC,CAAC;gBAClF,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,GAAG,KAAK,CAAC;wBAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjD,CAAC;gBACD,OAAO,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,GAAG;gBAAE,MAAM,GAAG,CAAC;QAClC,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAU,EAAE,CAAU;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Physical operator interface.
3
+ *
4
+ * Volcano-style with AsyncIterable. Each operator's execute() yields rows
5
+ * lazily; backpressure is implicit in `await`.
6
+ */
7
+ import type { ColumnSchema, Row, SqlEngineContext } from '../types.ts';
8
+ export interface PhysicalOp {
9
+ schema: ColumnSchema[];
10
+ execute(ctx: SqlEngineContext): AsyncIterable<Row>;
11
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Physical operator interface.
4
+ *
5
+ * Volcano-style with AsyncIterable. Each operator's execute() yields rows
6
+ * lazily; backpressure is implicit in `await`.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=op.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"op.js","sourceRoot":"","sources":["../../../sqlEngine/physical/op.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Lowers a logical plan to a physical plan.
3
+ *
4
+ * Scan -> PhysicalIndexScan (+ residual PhysicalFilter); wrapped in
5
+ * PhysicalQualify for join queries so rows are keyed `alias.attr`.
6
+ * Filter -> PhysicalFilter
7
+ * Project -> PhysicalProject
8
+ * Sort -> PhysicalSort
9
+ * Limit -> PhysicalLimit
10
+ * Distinct -> PhysicalDistinct
11
+ * Aggregate -> PhysicalHashAggregate
12
+ * Join -> PhysicalIndexNestedLoopJoin | PhysicalHashJoin |
13
+ * PhysicalNestedLoopJoin (chosen by optimizer/rules/planJoins)
14
+ *
15
+ * `qualified` is computed once from whether the plan contains any Join and
16
+ * threaded through every operator: join queries resolve columns by their
17
+ * `<alias>.<attr>` key, single-table queries by bare name.
18
+ *
19
+ * Insert/Update/Delete are rejected until phase 4.
20
+ */
21
+ import type { LogicalPlan } from '../logical/op.ts';
22
+ import type { PhysicalOp } from './op.ts';
23
+ export declare function compileToPhysical(plan: LogicalPlan): PhysicalOp;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * Lowers a logical plan to a physical plan.
4
+ *
5
+ * Scan -> PhysicalIndexScan (+ residual PhysicalFilter); wrapped in
6
+ * PhysicalQualify for join queries so rows are keyed `alias.attr`.
7
+ * Filter -> PhysicalFilter
8
+ * Project -> PhysicalProject
9
+ * Sort -> PhysicalSort
10
+ * Limit -> PhysicalLimit
11
+ * Distinct -> PhysicalDistinct
12
+ * Aggregate -> PhysicalHashAggregate
13
+ * Join -> PhysicalIndexNestedLoopJoin | PhysicalHashJoin |
14
+ * PhysicalNestedLoopJoin (chosen by optimizer/rules/planJoins)
15
+ *
16
+ * `qualified` is computed once from whether the plan contains any Join and
17
+ * threaded through every operator: join queries resolve columns by their
18
+ * `<alias>.<attr>` key, single-table queries by bare name.
19
+ *
20
+ * Insert/Update/Delete are rejected until phase 4.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.compileToPhysical = compileToPhysical;
24
+ const PhysicalIndexScan_ts_1 = require("./PhysicalIndexScan.js");
25
+ const PhysicalFilter_ts_1 = require("./PhysicalFilter.js");
26
+ const PhysicalProject_ts_1 = require("./PhysicalProject.js");
27
+ const PhysicalSort_ts_1 = require("./PhysicalSort.js");
28
+ const PhysicalLimit_ts_1 = require("./PhysicalLimit.js");
29
+ const PhysicalHashAggregate_ts_1 = require("./PhysicalHashAggregate.js");
30
+ const PhysicalDistinct_ts_1 = require("./PhysicalDistinct.js");
31
+ const PhysicalQualify_ts_1 = require("./PhysicalQualify.js");
32
+ const PhysicalHashJoin_ts_1 = require("./PhysicalHashJoin.js");
33
+ const PhysicalNestedLoopJoin_ts_1 = require("./PhysicalNestedLoopJoin.js");
34
+ const PhysicalIndexNestedLoopJoin_ts_1 = require("./PhysicalIndexNestedLoopJoin.js");
35
+ const whereToConditions_ts_1 = require("../optimizer/whereToConditions.js");
36
+ const joinAnalysis_ts_1 = require("../optimizer/joinAnalysis.js");
37
+ const config_ts_1 = require("../config.js");
38
+ const errors_ts_1 = require("../errors.js");
39
+ function compileToPhysical(plan) {
40
+ return lower(plan, planHasJoin(plan));
41
+ }
42
+ function lower(plan, qualified) {
43
+ switch (plan.kind) {
44
+ case 'Scan': {
45
+ const { conditions, operator, residual } = (0, whereToConditions_ts_1.whereToConditions)(plan.pushedFilter, plan.boundTable?.attributes);
46
+ // A scan with no index-driving predicate but a pushed sort on an indexed
47
+ // attribute is driven by the index's natural order — Table.search flags it
48
+ // needFullScan, so it must run with allowFullScan (D-219). validateScannable
49
+ // has already blessed exactly this shape.
50
+ const indexDriven = conditions.some((c) => (0, whereToConditions_ts_1.conditionUsesIndex)(c, plan.boundTable?.attributes));
51
+ const allowFullScan = !indexDriven && (0, whereToConditions_ts_1.sortDrivesIndex)(plan.pushedSort, plan.boundTable?.attributes);
52
+ let op = (0, PhysicalIndexScan_ts_1.physicalIndexScan)(plan, { conditions, operator, allowFullScan });
53
+ const combinedResidual = mergeResidual(residual, plan.residualFilter);
54
+ // Residual is single-table; compile it in bare space before qualifying.
55
+ if (combinedResidual)
56
+ op = (0, PhysicalFilter_ts_1.physicalFilter)(op, combinedResidual, false);
57
+ if (qualified && plan.alias)
58
+ op = (0, PhysicalQualify_ts_1.physicalQualify)(op, plan.alias);
59
+ return op;
60
+ }
61
+ case 'Filter':
62
+ return (0, PhysicalFilter_ts_1.physicalFilter)(lower(plan.input, qualified), plan.predicate, qualified);
63
+ case 'Project':
64
+ return (0, PhysicalProject_ts_1.physicalProject)(lower(plan.input, qualified), plan.projections, qualified);
65
+ case 'Sort':
66
+ return (0, PhysicalSort_ts_1.physicalSort)(lower(plan.input, qualified), plan.keys, qualified);
67
+ case 'Limit':
68
+ return (0, PhysicalLimit_ts_1.physicalLimit)(lower(plan.input, qualified), plan.limit, plan.offset);
69
+ case 'Distinct':
70
+ return (0, PhysicalDistinct_ts_1.physicalDistinct)(lower(plan.input, qualified));
71
+ case 'Aggregate': {
72
+ const { maxHashRows } = (0, config_ts_1.getSqlEngineConfig)();
73
+ return (0, PhysicalHashAggregate_ts_1.physicalHashAggregate)(lower(plan.input, qualified), plan.groupKeys, plan.aggs, maxHashRows, qualified);
74
+ }
75
+ case 'Join':
76
+ return lowerJoin(plan);
77
+ case 'Insert':
78
+ case 'Update':
79
+ case 'Delete':
80
+ throw new errors_ts_1.EngineUnsupportedError('mutations are not supported until phase 4');
81
+ }
82
+ }
83
+ function lowerJoin(join) {
84
+ const { maxHashRows } = (0, config_ts_1.getSqlEngineConfig)();
85
+ const analysis = (0, joinAnalysis_ts_1.analyzeJoin)(join);
86
+ if (!analysis) {
87
+ throw new errors_ts_1.EngineUnsupportedError('join right side is not a single base table');
88
+ }
89
+ const left = lower(join.left, true);
90
+ const rightNullKeys = qualifiedAttrKeys(analysis.rightScan);
91
+ const joinType = join.type === 'left' ? 'left' : 'inner';
92
+ if (join.strategy === 'indexNL') {
93
+ const probe = (0, joinAnalysis_ts_1.pickIndexedProbe)(analysis);
94
+ if (!probe)
95
+ throw new errors_ts_1.EngineUnsupportedError('indexNL join lost its indexed probe key');
96
+ const inner = analysis.rightScan;
97
+ const { conditions, operator, residual } = (0, whereToConditions_ts_1.whereToConditions)(inner.pushedFilter, inner.boundTable?.attributes);
98
+ const innerResidual = mergeResidual(residual, inner.residualFilter);
99
+ // Equi-pairs other than the probe + non-equi ON remainder → merged-row residual.
100
+ const otherEqui = analysis.equiPairs
101
+ .filter((p) => p !== probe.pair)
102
+ .map((p) => ({ kind: 'binop', op: '=', left: p.outer, right: p.inner }));
103
+ const residualOn = mergeAll([...otherEqui, ...(analysis.residualOn ? [analysis.residualOn] : [])]);
104
+ return (0, PhysicalIndexNestedLoopJoin_ts_1.physicalIndexNestedLoopJoin)(left, {
105
+ innerResource: inner.boundTable?.resource,
106
+ innerAlias: analysis.rightAlias,
107
+ innerAttribute: probe.attribute,
108
+ outerKey: probe.pair.outer,
109
+ innerBaseConditions: conditions,
110
+ innerOperator: operator,
111
+ innerSelect: inner.projection,
112
+ innerResidual,
113
+ residualOn,
114
+ type: joinType,
115
+ rightNullKeys,
116
+ });
117
+ }
118
+ const right = lower(join.right, true);
119
+ if (join.strategy === 'hash') {
120
+ return (0, PhysicalHashJoin_ts_1.physicalHashJoin)(left, right, {
121
+ leftKeys: analysis.equiPairs.map((p) => p.outer),
122
+ rightKeys: analysis.equiPairs.map((p) => p.inner),
123
+ residual: analysis.residualOn,
124
+ type: joinType,
125
+ rightNullKeys,
126
+ maxHashRows,
127
+ });
128
+ }
129
+ // nestedLoop (CROSS / non-equi)
130
+ return (0, PhysicalNestedLoopJoin_ts_1.physicalNestedLoopJoin)(left, right, {
131
+ on: join.on,
132
+ type: join.type === 'left' ? 'left' : join.type === 'cross' ? 'cross' : 'inner',
133
+ rightNullKeys,
134
+ maxHashRows,
135
+ });
136
+ }
137
+ function qualifiedAttrKeys(scan) {
138
+ const alias = scan.alias ?? '';
139
+ return (scan.boundTable?.attributes ?? []).map((a) => `${alias}.${a.name}`);
140
+ }
141
+ function planHasJoin(plan) {
142
+ if (plan.kind === 'Join')
143
+ return true;
144
+ if ('input' in plan)
145
+ return planHasJoin(plan.input);
146
+ return false;
147
+ }
148
+ function mergeResidual(a, b) {
149
+ if (!a)
150
+ return b;
151
+ if (!b)
152
+ return a;
153
+ return { kind: 'logical', op: 'and', args: [a, b] };
154
+ }
155
+ function mergeAll(exprs) {
156
+ if (exprs.length === 0)
157
+ return undefined;
158
+ if (exprs.length === 1)
159
+ return exprs[0];
160
+ return { kind: 'logical', op: 'and', args: exprs };
161
+ }
162
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../sqlEngine/physical/plan.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAqBH,8CAEC;AAlBD,iEAA2D;AAC3D,2DAAqD;AACrD,6DAAuD;AACvD,uDAAiD;AACjD,yDAAmD;AACnD,yEAAmE;AACnE,+DAAyD;AACzD,6DAAuD;AACvD,+DAAyD;AACzD,2EAAqE;AACrE,qFAA+E;AAC/E,4EAA2G;AAC3G,kEAA6E;AAC7E,4CAAkD;AAClD,4CAAsD;AAEtD,SAAgB,iBAAiB,CAAC,IAAiB;IAClD,OAAO,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,KAAK,CAAC,IAAiB,EAAE,SAAkB;IACnD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAA,wCAAiB,EAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC7G,yEAAyE;YACzE,2EAA2E;YAC3E,6EAA6E;YAC7E,0CAA0C;YAC1C,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,yCAAkB,EAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/F,MAAM,aAAa,GAAG,CAAC,WAAW,IAAI,IAAA,sCAAe,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACpG,IAAI,EAAE,GAAG,IAAA,wCAAiB,EAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;YAC1E,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACtE,wEAAwE;YACxE,IAAI,gBAAgB;gBAAE,EAAE,GAAG,IAAA,kCAAc,EAAC,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvE,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK;gBAAE,EAAE,GAAG,IAAA,oCAAe,EAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAClE,OAAO,EAAE,CAAC;QACX,CAAC;QACD,KAAK,QAAQ;YACZ,OAAO,IAAA,kCAAc,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChF,KAAK,SAAS;YACb,OAAO,IAAA,oCAAe,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACnF,KAAK,MAAM;YACV,OAAO,IAAA,8BAAY,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzE,KAAK,OAAO;YACX,OAAO,IAAA,gCAAa,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7E,KAAK,UAAU;YACd,OAAO,IAAA,sCAAgB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,KAAK,WAAW,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,8BAAkB,GAAE,CAAC;YAC7C,OAAO,IAAA,gDAAqB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC/G,CAAC;QACD,KAAK,MAAM;YACV,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACZ,MAAM,IAAI,kCAAsB,CAAC,2CAA2C,CAAC,CAAC;IAChF,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,IAAiB;IACnC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,8BAAkB,GAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,6BAAW,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,kCAAsB,CAAC,4CAA4C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAqB,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAE3E,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAA,kCAAgB,EAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,kCAAsB,CAAC,yCAAyC,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;QACjC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAA,wCAAiB,EAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/G,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QACpE,iFAAiF;QACjF,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnG,OAAO,IAAA,4DAA2B,EAAC,IAAI,EAAE;YACxC,aAAa,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ;YACzC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,cAAc,EAAE,KAAK,CAAC,SAAS;YAC/B,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;YAC1B,mBAAmB,EAAE,UAAU;YAC/B,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,aAAa;YACb,UAAU;YACV,IAAI,EAAE,QAAQ;YACd,aAAa;SACb,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,IAAA,sCAAgB,EAAC,IAAI,EAAE,KAAK,EAAE;YACpC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAChD,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACjD,QAAQ,EAAE,QAAQ,CAAC,UAAU;YAC7B,IAAI,EAAE,QAAQ;YACd,aAAa;YACb,WAAW;SACX,CAAC,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,OAAO,IAAA,kDAAsB,EAAC,IAAI,EAAE,KAAK,EAAE;QAC1C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QAC/E,aAAa;QACb,WAAW;KACX,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAiB;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,IAAiB;IACrC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,CAAuB,EAAE,CAAuB;IACtE,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiB;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Router that dispatches a SQL request to either the new engine or the legacy
3
+ * AlaSQL-based path based on the sql.engine config flag.
4
+ *
5
+ * 'legacy' — always run the legacy handler.
6
+ * 'new' — always run the new engine; if it throws EngineUnsupportedError,
7
+ * propagate that error (callers can catch).
8
+ * 'auto' — try the new engine; on EngineUnsupportedError, fall back to
9
+ * legacy and log the fallback.
10
+ *
11
+ * The router preserves the legacy entry's (statement, callback) signature so
12
+ * core/sqlTranslator/index.js can plug it in without other changes.
13
+ */
14
+ export type SqlVariant = 'select' | 'insert' | 'update' | 'delete';
15
+ export type LegacyHandler = (statement: unknown, callback: (err: unknown, data?: unknown) => void) => void;
16
+ export interface RouteOptions {
17
+ variant: SqlVariant;
18
+ jsonMessage: {
19
+ hdb_user?: unknown;
20
+ sql?: string;
21
+ parsed_sql_object?: unknown;
22
+ };
23
+ statement: unknown;
24
+ legacy: LegacyHandler;
25
+ }
26
+ export declare function route(opts: RouteOptions, callback: (err: unknown, data?: unknown) => void): void;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Router that dispatches a SQL request to either the new engine or the legacy
4
+ * AlaSQL-based path based on the sql.engine config flag.
5
+ *
6
+ * 'legacy' — always run the legacy handler.
7
+ * 'new' — always run the new engine; if it throws EngineUnsupportedError,
8
+ * propagate that error (callers can catch).
9
+ * 'auto' — try the new engine; on EngineUnsupportedError, fall back to
10
+ * legacy and log the fallback.
11
+ *
12
+ * The router preserves the legacy entry's (statement, callback) signature so
13
+ * core/sqlTranslator/index.js can plug it in without other changes.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.route = route;
17
+ const errors_ts_1 = require("./errors.js");
18
+ const config_ts_1 = require("./config.js");
19
+ const index_ts_1 = require("./index.js");
20
+ function getLogger() {
21
+ try {
22
+ const harperLogger = require('../utility/logging/harper_logger.js');
23
+ return harperLogger.loggerWithTag ? harperLogger.loggerWithTag('sql-engine') : harperLogger;
24
+ }
25
+ catch {
26
+ return { info: () => { }, warn: () => { } };
27
+ }
28
+ }
29
+ function route(opts, callback) {
30
+ const config = (0, config_ts_1.getSqlEngineConfig)();
31
+ if (config.engine === 'legacy') {
32
+ opts.legacy(opts.statement, callback);
33
+ return;
34
+ }
35
+ (0, index_ts_1.runStatement)({
36
+ variant: opts.variant,
37
+ jsonMessage: opts.jsonMessage,
38
+ statement: opts.statement,
39
+ }).then((result) => callback(null, result), (err) => {
40
+ if (config.engine === 'auto' && err instanceof errors_ts_1.EngineUnsupportedError) {
41
+ getLogger().info(`SQL engine v2 fallback: ${err.reason}`);
42
+ opts.legacy(opts.statement, callback);
43
+ return;
44
+ }
45
+ callback(err);
46
+ });
47
+ }
48
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../sqlEngine/router.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AA0BH,sBAuBC;AA/CD,2CAAqD;AACrD,2CAAiD;AACjD,yCAA0C;AAa1C,SAAS,SAAS;IACjB,IAAI,CAAC;QACJ,MAAM,YAAY,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACpE,OAAO,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC3C,CAAC;AACF,CAAC;AAED,SAAgB,KAAK,CAAC,IAAkB,EAAE,QAAgD;IACzF,MAAM,MAAM,GAAG,IAAA,8BAAkB,GAAE,CAAC;IAEpC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtC,OAAO;IACR,CAAC;IAED,IAAA,uBAAY,EAAC;QACZ,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC,CAAC,IAAI,CACN,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAClC,CAAC,GAAY,EAAE,EAAE;QAChB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,YAAY,kCAAsB,EAAE,CAAC;YACvE,SAAS,EAAE,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACtC,OAAO;QACR,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Common types for the SQL engine.
3
+ *
4
+ * Row is the unit of data flowing through the operator pipeline. It is a plain
5
+ * object whose keys are column names (or projected aliases) and values are SQL
6
+ * values coerced to JS primitives.
7
+ *
8
+ * SqlType is the engine's internal type tag. It does not need to be exhaustive
9
+ * with the SQL standard — it is used for coercion and function dispatch.
10
+ */
11
+ export type Row = Record<string, unknown>;
12
+ export type SqlType = 'null' | 'boolean' | 'int' | 'bigint' | 'number' | 'string' | 'date' | 'timestamp' | 'json' | 'blob' | 'array' | 'unknown';
13
+ export interface ColumnSchema {
14
+ name: string;
15
+ type: SqlType;
16
+ nullable: boolean;
17
+ source?: {
18
+ table: string;
19
+ attribute: string;
20
+ };
21
+ }
22
+ export interface SqlEngineContext {
23
+ user?: unknown;
24
+ signal?: AbortSignal;
25
+ rowBudget?: number;
26
+ /**
27
+ * Set when a scan is locating rows for a subsequent UPDATE/DELETE, not serving
28
+ * a user-facing SELECT. A row whose TTL has passed but hasn't been swept by the
29
+ * background eviction scan yet is still physically present, and every other
30
+ * write surface (REST PUT/PATCH, ops update) still finds and overwrites it —
31
+ * they load by id without the freshness check a normal read applies. Without
32
+ * this, the scan that locates a mutation's target rows would silently drop one
33
+ * that's crossed its TTL between being written and being matched, so the
34
+ * mutation touches nothing and the TTL never resets (QA-269).
35
+ */
36
+ includeExpiredRows?: boolean;
37
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Common types for the SQL engine.
4
+ *
5
+ * Row is the unit of data flowing through the operator pipeline. It is a plain
6
+ * object whose keys are column names (or projected aliases) and values are SQL
7
+ * values coerced to JS primitives.
8
+ *
9
+ * SqlType is the engine's internal type tag. It does not need to be exhaustive
10
+ * with the SQL standard — it is used for coercion and function dispatch.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../sqlEngine/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
@@ -56,6 +56,7 @@ const hdbUtils = __importStar(require("../utility/common_utils.js"));
56
56
  const terms = __importStar(require("../utility/hdbTerms.js"));
57
57
  const hdbError_ts_1 = require("../utility/errors/hdbError.js");
58
58
  const commonErrors_ts_1 = require("../utility/errors/commonErrors.js");
59
+ const sqlEngineRouter = __importStar(require("../sqlEngine/router.js"));
59
60
  //here we call to define and import custom functions to alasql
60
61
  (0, alasqlFunctionImporter_ts_1.default)(alasql);
61
62
  let UNAUTHORIZED_RESPONSE = 403;
@@ -177,7 +178,12 @@ function processAST(jsonMessage, parsedSqlObject, callback) {
177
178
  default:
178
179
  throw new Error(`unsupported SQL type ${parsedSqlObject.variant} in SQL: ${jsonMessage}`);
179
180
  }
180
- sqlFunction(statement, (err, data) => {
181
+ sqlEngineRouter.route({
182
+ variant: parsedSqlObject.variant,
183
+ jsonMessage,
184
+ statement,
185
+ legacy: sqlFunction,
186
+ }, (err, data) => {
181
187
  if (err) {
182
188
  callback(err);
183
189
  return;