@quereus/quereus 2.8.0 → 2.9.0
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/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +0 -3
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/parser/ast.d.ts +3 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +13 -4
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +3 -2
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/select.js +14 -2
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +10 -6
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +3 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +7 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +22 -1
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +47 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +2 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asof-scan-node.js +223 -0
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +3 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +7 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +2 -0
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/function.d.ts +11 -1
- package/dist/src/planner/nodes/function.d.ts.map +1 -1
- package/dist/src/planner/nodes/function.js +94 -1
- package/dist/src/planner/nodes/function.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +2 -0
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +10 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +19 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +46 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +2 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +4 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js +127 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +2 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +2 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +130 -1
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +49 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +6 -1
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +4 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -0
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +7 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +100 -1
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +9 -0
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +20 -0
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +2 -0
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +37 -2
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +87 -10
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +1 -3
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +3 -9
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +61 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +64 -3
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +9 -0
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +3 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +91 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +31 -10
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +61 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +2 -122
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
- package/dist/src/runtime/context-helpers.d.ts +9 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +5 -0
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/asof-scan.js +467 -0
- package/dist/src/runtime/emit/asof-scan.js.map +1 -0
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +20 -0
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
- package/dist/src/runtime/emit/ordinal-slice.js +89 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +9 -4
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +19 -3
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +12 -8
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +91 -14
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +732 -37
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +5 -4
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +4 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +10 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +29 -6
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/function.d.ts +24 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +10 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +10 -0
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +18 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +307 -42
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +11 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/util/ast-literal.d.ts +11 -0
- package/dist/src/util/ast-literal.d.ts.map +1 -0
- package/dist/src/util/ast-literal.js +26 -0
- package/dist/src/util/ast-literal.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +41 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +29 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/filter-info.d.ts +14 -0
- package/dist/src/vtab/filter-info.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +39 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +206 -44
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/module.d.ts +24 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizer-tuning.d.ts","sourceRoot":"","sources":["../../../src/planner/optimizer-tuning.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,+DAA+D;IAC/D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAEtC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE;QACd,4DAA4D;QAC5D,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACvC,uCAAuC;QACvC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;QACxC,0DAA0D;QAC1D,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;QAC1C,8BAA8B;QAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,uBAAuB;IACvB,QAAQ,CAAC,GAAG,EAAE;QACb,+CAA+C;QAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,0CAA0C;QAC1C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;QAC1C,uCAAuC;QACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,kCAAkC;IAClC,QAAQ,CAAC,YAAY,EAAE;QACtB,4EAA4E;QAC5E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,sDAAsD;QACtD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACvC,CAAC;IAEF,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE;QACf,gEAAgE;QAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,kDAAkD;QAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,uCAAuC;QACvC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;KAC/B,CAAC;IAEF,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE7C,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE;QACf,yDAAyD;QACzD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;KAC/B,CAAC;IAEF,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACpB,wDAAwD;QACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,4DAA4D;QAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,yDAAyD;QACzD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,wCAAwC;QACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC1B,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"optimizer-tuning.d.ts","sourceRoot":"","sources":["../../../src/planner/optimizer-tuning.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,+DAA+D;IAC/D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAEtC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE;QACd,4DAA4D;QAC5D,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACvC,uCAAuC;QACvC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;QACxC,0DAA0D;QAC1D,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;QAC1C,8BAA8B;QAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,uBAAuB;IACvB,QAAQ,CAAC,GAAG,EAAE;QACb,+CAA+C;QAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,0CAA0C;QAC1C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;QAC1C,uCAAuC;QACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,kCAAkC;IAClC,QAAQ,CAAC,YAAY,EAAE;QACtB,4EAA4E;QAC5E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,sDAAsD;QACtD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACvC,CAAC;IAEF,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE;QACf,gEAAgE;QAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,kDAAkD;QAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,uCAAuC;QACvC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;KAC/B,CAAC;IAEF,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE;QACd;;;;WAIG;QACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE7C,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE;QACf,yDAAyD;QACzD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;KAC/B,CAAC;IAEF,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACpB,wDAAwD;QACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,4DAA4D;QAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,yDAAyD;QACzD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,wCAAwC;QACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC1B,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAmC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizer-tuning.js","sourceRoot":"","sources":["../../../src/planner/optimizer-tuning.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"optimizer-tuning.js","sourceRoot":"","sources":["../../../src/planner/optimizer-tuning.ts"],"names":[],"mappings":"AAkFA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC9C,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,EAAE;IACxB,IAAI,EAAE;QACL,qBAAqB,EAAE,CAAC;QACxB,sBAAsB,EAAE,KAAK;QAC7B,wBAAwB,EAAE,CAAC;QAC3B,iBAAiB,EAAE,KAAK;KACxB;IACD,GAAG,EAAE;QACJ,iBAAiB,EAAE,KAAK;QACxB,wBAAwB,EAAE,CAAC;QAC3B,iBAAiB,EAAE,KAAK;KACxB;IACD,YAAY,EAAE;QACb,aAAa,EAAE,KAAK;QACpB,qBAAqB,EAAE,KAAK;KAC5B;IACD,KAAK,EAAE;QACN,cAAc,EAAE,MAAM;QACtB,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,IAAI;KAClB;IACD,IAAI,EAAE;QACL,iBAAiB,EAAE,KAAK;KACxB;IACD,KAAK,EAAE;QACN,YAAY,EAAE,KAAK,CAAC,oCAAoC;KACxD;IACD,SAAS,EAAE;QACV,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI;KACb;CACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../../src/planner/optimizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../../src/planner/optimizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAgCnE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI/C;;GAEG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,eAAe,CAAqC;IACrD,MAAM,EAAE,eAAe,CAAC;gBAG9B,MAAM,GAAE,eAAgC,EACxC,KAAK,CAAC,EAAE,aAAa;IAUtB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAI3C,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAS;IAE7C;;OAEG;IAEH;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwR7B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,QAAQ;IAgChD;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,QAAQ;IAe3D,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ;IAuC3D,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,QAAQ,IAAI,aAAa;IAIzB,qDAAqD;IACrD,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CAGjD"}
|
|
@@ -12,6 +12,9 @@ import { PassManager, PassId } from './framework/pass.js';
|
|
|
12
12
|
import { ruleMaterializationAdvisory } from './rules/cache/rule-materialization-advisory.js';
|
|
13
13
|
// Phase 1.5 rules
|
|
14
14
|
import { ruleSelectAccessPath } from './rules/access/rule-select-access-path.js';
|
|
15
|
+
import { ruleMonotonicLimitPushdown } from './rules/access/rule-monotonic-limit-pushdown.js';
|
|
16
|
+
import { ruleMonotonicRangeAccess } from './rules/access/rule-monotonic-range-access.js';
|
|
17
|
+
import { ruleAsofStrategySelect } from './rules/access/rule-asof-strategy-select.js';
|
|
15
18
|
import { ruleGrowRetrieve } from './rules/retrieve/rule-grow-retrieve.js';
|
|
16
19
|
import { rulePredicatePushdown } from './rules/predicate/rule-predicate-pushdown.js';
|
|
17
20
|
import { ruleFilterMerge } from './rules/predicate/rule-filter-merge.js';
|
|
@@ -22,6 +25,9 @@ import { ruleJoinGreedyCommute } from './rules/join/rule-join-greedy-commute.js'
|
|
|
22
25
|
import { ruleAggregatePhysical } from './rules/aggregate/rule-aggregate-streaming.js';
|
|
23
26
|
import { ruleQuickPickJoinEnumeration } from './rules/join/rule-quickpick-enumeration.js';
|
|
24
27
|
import { ruleJoinPhysicalSelection } from './rules/join/rule-join-physical-selection.js';
|
|
28
|
+
import { ruleMonotonicMergeJoin } from './rules/join/rule-monotonic-merge-join.js';
|
|
29
|
+
import { ruleLateralTop1Asof } from './rules/join/rule-lateral-top1-asof.js';
|
|
30
|
+
import { ruleMonotonicWindow } from './rules/window/rule-monotonic-window.js';
|
|
25
31
|
// Constraint rules removed - now handled in builders for correctness
|
|
26
32
|
import { ruleCteOptimization } from './rules/cache/rule-cte-optimization.js';
|
|
27
33
|
import { ruleMutatingSubqueryCache } from './rules/cache/rule-mutating-subquery-cache.js';
|
|
@@ -169,9 +175,42 @@ export class Optimizer {
|
|
|
169
175
|
fn: ruleAggregatePhysical,
|
|
170
176
|
priority: 20
|
|
171
177
|
});
|
|
178
|
+
// Recognize lateral-top-1 asof. Runs in the Structural pass (before
|
|
179
|
+
// predicate-pushdown at priority 20) so the lateral's Filter still
|
|
180
|
+
// carries the asof predicate intact — predicate-pushdown would
|
|
181
|
+
// otherwise consume it into the inner Retrieve pipeline.
|
|
182
|
+
this.passManager.addRuleToPass(PassId.Structural, {
|
|
183
|
+
id: 'lateral-top1-asof',
|
|
184
|
+
nodeType: PlanNodeType.Join,
|
|
185
|
+
phase: 'rewrite',
|
|
186
|
+
fn: ruleLateralTop1Asof,
|
|
187
|
+
priority: 5
|
|
188
|
+
});
|
|
172
189
|
// Post-optimization pass rules (bottom-up) - for cleanup and caching
|
|
173
190
|
// Physical join selection runs here (after Physical pass) so QuickPick can
|
|
174
191
|
// see the full logical join tree before any physical conversion happens.
|
|
192
|
+
// Monotonic-aware merge-join recognition runs first (lower priority) so
|
|
193
|
+
// it can recognise cases where both sides advertise MonotonicOn but
|
|
194
|
+
// `physical.ordering` does not match positionally — once it converts a
|
|
195
|
+
// Join into a MergeJoin, the ordering-based rule no-ops on it.
|
|
196
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
197
|
+
id: 'monotonic-merge-join',
|
|
198
|
+
nodeType: PlanNodeType.Join,
|
|
199
|
+
phase: 'impl',
|
|
200
|
+
fn: ruleMonotonicMergeJoin,
|
|
201
|
+
priority: 4
|
|
202
|
+
});
|
|
203
|
+
// Monotonic streaming-window recognition. Runs after monotonic-merge-join
|
|
204
|
+
// (priority 4) so child joins have already become MergeJoins and
|
|
205
|
+
// propagate their `monotonicOn`; runs before monotonic-limit-pushdown
|
|
206
|
+
// (priority 8) but does not interact with it (different node type).
|
|
207
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
208
|
+
id: 'monotonic-window',
|
|
209
|
+
nodeType: PlanNodeType.Window,
|
|
210
|
+
phase: 'impl',
|
|
211
|
+
fn: ruleMonotonicWindow,
|
|
212
|
+
priority: 6
|
|
213
|
+
});
|
|
175
214
|
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
176
215
|
id: 'join-physical-selection',
|
|
177
216
|
nodeType: PlanNodeType.Join,
|
|
@@ -179,6 +218,48 @@ export class Optimizer {
|
|
|
179
218
|
fn: ruleJoinPhysicalSelection,
|
|
180
219
|
priority: 5
|
|
181
220
|
});
|
|
221
|
+
// Monotonic LIMIT/OFFSET pushdown: replace LimitOffset[/Sort]/access-leaf
|
|
222
|
+
// with OrdinalSlice when the leaf advertises supportsOrdinalSeek. Runs in
|
|
223
|
+
// PostOptimization so the leaf already carries its physical capabilities.
|
|
224
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
225
|
+
id: 'monotonic-limit-pushdown',
|
|
226
|
+
nodeType: PlanNodeType.LimitOffset,
|
|
227
|
+
phase: 'impl',
|
|
228
|
+
fn: ruleMonotonicLimitPushdown,
|
|
229
|
+
priority: 8
|
|
230
|
+
});
|
|
231
|
+
// Monotonic range-scan recognition. Runs on physical leaves to annotate
|
|
232
|
+
// `rangeBoundedOn` when a handled range/equality bounds the monotonic
|
|
233
|
+
// column. Also runs on Filter nodes for the defensive escalation: drop
|
|
234
|
+
// `monotonicOn` from a leaf when an unhandled range predicate sits in a
|
|
235
|
+
// directly-overhead Filter. Runs after the limit pushdown (priority 9)
|
|
236
|
+
// so that an OrdinalSlice rewrite has already replaced any leaf it
|
|
237
|
+
// would have annotated; ordering vs. join-physical-selection (priority 5)
|
|
238
|
+
// is not load-bearing — `rangeBoundedOn` is a pure annotation today and
|
|
239
|
+
// the defensive drop only matters for downstream rules that check
|
|
240
|
+
// `physical.monotonicOn` (asof/merge-join/limit-pushdown), which run
|
|
241
|
+
// later in the same pass or have already run.
|
|
242
|
+
const rangeAccessLeafTypes = [
|
|
243
|
+
PlanNodeType.IndexScan,
|
|
244
|
+
PlanNodeType.IndexSeek,
|
|
245
|
+
PlanNodeType.SeqScan,
|
|
246
|
+
];
|
|
247
|
+
for (const nodeType of rangeAccessLeafTypes) {
|
|
248
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
249
|
+
id: `monotonic-range-access-${nodeType}`,
|
|
250
|
+
nodeType,
|
|
251
|
+
phase: 'rewrite',
|
|
252
|
+
fn: ruleMonotonicRangeAccess,
|
|
253
|
+
priority: 9
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
257
|
+
id: 'monotonic-range-access-filter',
|
|
258
|
+
nodeType: PlanNodeType.Filter,
|
|
259
|
+
phase: 'rewrite',
|
|
260
|
+
fn: ruleMonotonicRangeAccess,
|
|
261
|
+
priority: 9
|
|
262
|
+
});
|
|
182
263
|
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
183
264
|
id: 'mutating-subquery-cache',
|
|
184
265
|
nodeType: PlanNodeType.Join,
|
|
@@ -186,6 +267,16 @@ export class Optimizer {
|
|
|
186
267
|
fn: ruleMutatingSubqueryCache,
|
|
187
268
|
priority: 10
|
|
188
269
|
});
|
|
270
|
+
// AsofScan strategy selection (hash → merge). Runs after the leaves'
|
|
271
|
+
// physical.ordering / monotonicOn are finalized (range-access at
|
|
272
|
+
// priority 9) so the predicate-driven check can read them off.
|
|
273
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
274
|
+
id: 'asof-strategy-select',
|
|
275
|
+
nodeType: PlanNodeType.AsofScan,
|
|
276
|
+
phase: 'impl',
|
|
277
|
+
fn: ruleAsofStrategySelect,
|
|
278
|
+
priority: 11
|
|
279
|
+
});
|
|
189
280
|
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
190
281
|
id: 'cte-optimization',
|
|
191
282
|
nodeType: PlanNodeType.CTE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../../src/planner/optimizer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../../src/planner/optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: AsofScan strategy selection (hash → merge).
|
|
3
|
+
*
|
|
4
|
+
* Promotes an `AsofScanNode` from the default `'hash'` strategy to the
|
|
5
|
+
* co-streaming `'merge'` strategy when:
|
|
6
|
+
*
|
|
7
|
+
* - Both children advertise `physical.ordering` whose leading
|
|
8
|
+
* `partitionAttrs.length + 1` entries form `[partition cols..., matchAttr]`.
|
|
9
|
+
* - At each partition position, left and right's attribute IDs pair up via
|
|
10
|
+
* a `partitionAttrs` equi-pair, in the same direction on both sides.
|
|
11
|
+
* - The trailing match-attr ordering on each side is ASC. The merge emitter
|
|
12
|
+
* walks both inputs forward — `direction='desc'` (latest right ≤ left)
|
|
13
|
+
* accumulates the largest qualifier seen; `direction='asc'` (earliest
|
|
14
|
+
* right ≥ left) returns the first qualifier. Both forms assume ASC sort
|
|
15
|
+
* on the matchAttr; that aligns with how access-path `monotonicOn` is
|
|
16
|
+
* advertised today (always ascending).
|
|
17
|
+
* - The right's estimated row count meets the configured
|
|
18
|
+
* `tuning.asof.mergeRowThreshold` — below it, hash's constant factors win.
|
|
19
|
+
*
|
|
20
|
+
* Bails to `null` (leaving the hash strategy) on any failure.
|
|
21
|
+
*
|
|
22
|
+
* The merge strategy streams memory O(1) and emits as left rows arrive,
|
|
23
|
+
* unlike the hash variant's O(R) buffering and full-right-arrival latency.
|
|
24
|
+
* Cost is O(L + R) for both — only constant factors differ — so this is a
|
|
25
|
+
* predicate-driven rewrite rather than enumerate-and-cost.
|
|
26
|
+
*/
|
|
27
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
28
|
+
import type { OptContext } from '../../framework/context.js';
|
|
29
|
+
export declare function ruleAsofStrategySelect(node: PlanNode, ctx: OptContext): PlanNode | null;
|
|
30
|
+
//# sourceMappingURL=rule-asof-strategy-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-asof-strategy-select.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-asof-strategy-select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+B7D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA6EvF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: AsofScan strategy selection (hash → merge).
|
|
3
|
+
*
|
|
4
|
+
* Promotes an `AsofScanNode` from the default `'hash'` strategy to the
|
|
5
|
+
* co-streaming `'merge'` strategy when:
|
|
6
|
+
*
|
|
7
|
+
* - Both children advertise `physical.ordering` whose leading
|
|
8
|
+
* `partitionAttrs.length + 1` entries form `[partition cols..., matchAttr]`.
|
|
9
|
+
* - At each partition position, left and right's attribute IDs pair up via
|
|
10
|
+
* a `partitionAttrs` equi-pair, in the same direction on both sides.
|
|
11
|
+
* - The trailing match-attr ordering on each side is ASC. The merge emitter
|
|
12
|
+
* walks both inputs forward — `direction='desc'` (latest right ≤ left)
|
|
13
|
+
* accumulates the largest qualifier seen; `direction='asc'` (earliest
|
|
14
|
+
* right ≥ left) returns the first qualifier. Both forms assume ASC sort
|
|
15
|
+
* on the matchAttr; that aligns with how access-path `monotonicOn` is
|
|
16
|
+
* advertised today (always ascending).
|
|
17
|
+
* - The right's estimated row count meets the configured
|
|
18
|
+
* `tuning.asof.mergeRowThreshold` — below it, hash's constant factors win.
|
|
19
|
+
*
|
|
20
|
+
* Bails to `null` (leaving the hash strategy) on any failure.
|
|
21
|
+
*
|
|
22
|
+
* The merge strategy streams memory O(1) and emits as left rows arrive,
|
|
23
|
+
* unlike the hash variant's O(R) buffering and full-right-arrival latency.
|
|
24
|
+
* Cost is O(L + R) for both — only constant factors differ — so this is a
|
|
25
|
+
* predicate-driven rewrite rather than enumerate-and-cost.
|
|
26
|
+
*/
|
|
27
|
+
import { createLogger } from '../../../common/logger.js';
|
|
28
|
+
import { AsofScanNode } from '../../nodes/asof-scan-node.js';
|
|
29
|
+
const log = createLogger('optimizer:rule:asof-strategy-select');
|
|
30
|
+
/**
|
|
31
|
+
* Translate the leading `prefixLen` ordering entries on a child to
|
|
32
|
+
* (attrId, desc) pairs. Returns null when the ordering is shorter than
|
|
33
|
+
* required or contains entries that do not map to a known attribute.
|
|
34
|
+
*/
|
|
35
|
+
function mapLeadingOrdering(ordering, attrs, prefixLen) {
|
|
36
|
+
if (!ordering || ordering.length < prefixLen)
|
|
37
|
+
return null;
|
|
38
|
+
const out = [];
|
|
39
|
+
for (let i = 0; i < prefixLen; i++) {
|
|
40
|
+
const entry = ordering[i];
|
|
41
|
+
const attr = attrs[entry.column];
|
|
42
|
+
if (!attr)
|
|
43
|
+
return null;
|
|
44
|
+
out.push({ attrId: attr.id, desc: entry.desc });
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
export function ruleAsofStrategySelect(node, ctx) {
|
|
49
|
+
if (!(node instanceof AsofScanNode))
|
|
50
|
+
return null;
|
|
51
|
+
if (node.strategy !== 'hash')
|
|
52
|
+
return null;
|
|
53
|
+
const partitionLen = node.partitionAttrs.length;
|
|
54
|
+
const prefixLen = partitionLen + 1;
|
|
55
|
+
const leftAttrs = node.left.getAttributes();
|
|
56
|
+
const rightAttrs = node.right.getAttributes();
|
|
57
|
+
const leftOrdering = mapLeadingOrdering(node.left.physical.ordering, leftAttrs, prefixLen);
|
|
58
|
+
if (!leftOrdering) {
|
|
59
|
+
log('Left does not provide a long enough ordering prefix (need %d)', prefixLen);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const rightOrdering = mapLeadingOrdering(node.right.physical.ordering, rightAttrs, prefixLen);
|
|
63
|
+
if (!rightOrdering) {
|
|
64
|
+
log('Right does not provide a long enough ordering prefix (need %d)', prefixLen);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// Partition prefix: at each ordering position, left's attr-id must be the
|
|
68
|
+
// `leftAttrId` of one of the partition pairs; the same position on the
|
|
69
|
+
// right must carry the corresponding `rightAttrId`. Directions must match.
|
|
70
|
+
const remainingPairs = node.partitionAttrs.slice();
|
|
71
|
+
for (let i = 0; i < partitionLen; i++) {
|
|
72
|
+
const leftEntry = leftOrdering[i];
|
|
73
|
+
const rightEntry = rightOrdering[i];
|
|
74
|
+
if (leftEntry.desc !== rightEntry.desc) {
|
|
75
|
+
log('Direction mismatch at partition position %d (left=%s, right=%s)', i, leftEntry.desc ? 'desc' : 'asc', rightEntry.desc ? 'desc' : 'asc');
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const pairIdx = remainingPairs.findIndex(p => p.leftAttrId === leftEntry.attrId && p.rightAttrId === rightEntry.attrId);
|
|
79
|
+
if (pairIdx < 0) {
|
|
80
|
+
log('Position %d (left=%d, right=%d) does not pair via partitionAttrs', i, leftEntry.attrId, rightEntry.attrId);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
remainingPairs.splice(pairIdx, 1);
|
|
84
|
+
}
|
|
85
|
+
// Trailing entry on each side must be the asof match attribute, ASC.
|
|
86
|
+
// The merge emitter walks both inputs forward; that requires ascending
|
|
87
|
+
// match-attr ordering on both sides regardless of the asof direction.
|
|
88
|
+
const tailLeft = leftOrdering[partitionLen];
|
|
89
|
+
const tailRight = rightOrdering[partitionLen];
|
|
90
|
+
if (tailLeft.attrId !== node.matchAttr.leftAttrId) {
|
|
91
|
+
log('Left ordering tail (attr=%d) is not the match attr (attr=%d)', tailLeft.attrId, node.matchAttr.leftAttrId);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (tailRight.attrId !== node.matchAttr.rightAttrId) {
|
|
95
|
+
log('Right ordering tail (attr=%d) is not the match attr (attr=%d)', tailRight.attrId, node.matchAttr.rightAttrId);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if (tailLeft.desc || tailRight.desc) {
|
|
99
|
+
log('Match-attr ordering must be ASC on both sides (left=%s, right=%s)', tailLeft.desc ? 'desc' : 'asc', tailRight.desc ? 'desc' : 'asc');
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// Threshold gate.
|
|
103
|
+
const tuning = ctx.tuning;
|
|
104
|
+
const rightRows = node.right.estimatedRows ?? tuning.defaultRowEstimate;
|
|
105
|
+
if (rightRows < tuning.asof.mergeRowThreshold) {
|
|
106
|
+
log('Right estimated rows (%d) below merge threshold (%d); keeping hash', rightRows, tuning.asof.mergeRowThreshold);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
log('Promoting AsofScan to merge strategy (rightRows=%d, partitionCols=%d)', rightRows, partitionLen);
|
|
110
|
+
return node.withStrategy('merge');
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=rule-asof-strategy-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-asof-strategy-select.js","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-asof-strategy-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Monotonic LIMIT/OFFSET pushdown
|
|
3
|
+
*
|
|
4
|
+
* Pattern (the rule peels through these in order, top-down from the
|
|
5
|
+
* LimitOffsetNode toward the leaf):
|
|
6
|
+
*
|
|
7
|
+
* LimitOffsetNode
|
|
8
|
+
* └─ SortNode? (single trivial column ref matching leaf monotonicOn)
|
|
9
|
+
* └─ (ProjectNode | AliasNode)* (only trivial column-reference projections)
|
|
10
|
+
* └─ IndexScan / IndexSeek / SeqScan
|
|
11
|
+
* (advertises monotonicOn AND accessCapabilities.ordinalSeek)
|
|
12
|
+
*
|
|
13
|
+
* On a successful match, the entire `LimitOffset[/Sort]/.../leaf` subtree is
|
|
14
|
+
* replaced with `…/OrdinalSlice(leaf)` — the OrdinalSlice slots in directly
|
|
15
|
+
* above the leaf, threading the resolved offset/limit into the leaf's
|
|
16
|
+
* FilterInfo so the vtab can seek directly to the kth row in O(log N)
|
|
17
|
+
* instead of buffering k+n rows.
|
|
18
|
+
*
|
|
19
|
+
* Trivial Project nodes (all projections are bare ColumnReferenceNodes) and
|
|
20
|
+
* Alias wrappers preserve row count and order, so we can descend through
|
|
21
|
+
* them — the OrdinalSlice still slices the leaf in monotonic order.
|
|
22
|
+
*
|
|
23
|
+
* The rule rejects all of:
|
|
24
|
+
* - `Sort` whose key isn't a single trivial column ref into the leaf
|
|
25
|
+
* - `Sort` direction mismatching the advertised `monotonicOn.direction`
|
|
26
|
+
* - any non-trivial intermediate node (Filter, Distinct, Aggregate, etc.)
|
|
27
|
+
* - leaf advertising `monotonicOn` but not `ordinalSeek`
|
|
28
|
+
* - multi-key `ORDER BY`
|
|
29
|
+
*/
|
|
30
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
31
|
+
import type { OptContext } from '../../framework/context.js';
|
|
32
|
+
export declare function ruleMonotonicLimitPushdown(node: PlanNode, _context: OptContext): PlanNode | null;
|
|
33
|
+
//# sourceMappingURL=rule-monotonic-limit-pushdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-monotonic-limit-pushdown.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-limit-pushdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+F7D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA0EhG"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Monotonic LIMIT/OFFSET pushdown
|
|
3
|
+
*
|
|
4
|
+
* Pattern (the rule peels through these in order, top-down from the
|
|
5
|
+
* LimitOffsetNode toward the leaf):
|
|
6
|
+
*
|
|
7
|
+
* LimitOffsetNode
|
|
8
|
+
* └─ SortNode? (single trivial column ref matching leaf monotonicOn)
|
|
9
|
+
* └─ (ProjectNode | AliasNode)* (only trivial column-reference projections)
|
|
10
|
+
* └─ IndexScan / IndexSeek / SeqScan
|
|
11
|
+
* (advertises monotonicOn AND accessCapabilities.ordinalSeek)
|
|
12
|
+
*
|
|
13
|
+
* On a successful match, the entire `LimitOffset[/Sort]/.../leaf` subtree is
|
|
14
|
+
* replaced with `…/OrdinalSlice(leaf)` — the OrdinalSlice slots in directly
|
|
15
|
+
* above the leaf, threading the resolved offset/limit into the leaf's
|
|
16
|
+
* FilterInfo so the vtab can seek directly to the kth row in O(log N)
|
|
17
|
+
* instead of buffering k+n rows.
|
|
18
|
+
*
|
|
19
|
+
* Trivial Project nodes (all projections are bare ColumnReferenceNodes) and
|
|
20
|
+
* Alias wrappers preserve row count and order, so we can descend through
|
|
21
|
+
* them — the OrdinalSlice still slices the leaf in monotonic order.
|
|
22
|
+
*
|
|
23
|
+
* The rule rejects all of:
|
|
24
|
+
* - `Sort` whose key isn't a single trivial column ref into the leaf
|
|
25
|
+
* - `Sort` direction mismatching the advertised `monotonicOn.direction`
|
|
26
|
+
* - any non-trivial intermediate node (Filter, Distinct, Aggregate, etc.)
|
|
27
|
+
* - leaf advertising `monotonicOn` but not `ordinalSeek`
|
|
28
|
+
* - multi-key `ORDER BY`
|
|
29
|
+
*/
|
|
30
|
+
import { createLogger } from '../../../common/logger.js';
|
|
31
|
+
import { isRelationalNode } from '../../nodes/plan-node.js';
|
|
32
|
+
import { LimitOffsetNode } from '../../nodes/limit-offset.js';
|
|
33
|
+
import { SortNode } from '../../nodes/sort.js';
|
|
34
|
+
import { AliasNode } from '../../nodes/alias-node.js';
|
|
35
|
+
import { ProjectNode } from '../../nodes/project-node.js';
|
|
36
|
+
import { SeqScanNode, IndexScanNode, IndexSeekNode } from '../../nodes/table-access-nodes.js';
|
|
37
|
+
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
38
|
+
import { OrdinalSliceNode } from '../../nodes/ordinal-slice-node.js';
|
|
39
|
+
const log = createLogger('optimizer:rule:monotonic-limit-pushdown');
|
|
40
|
+
function isAccessLeaf(node) {
|
|
41
|
+
return node instanceof SeqScanNode || node instanceof IndexScanNode || node instanceof IndexSeekNode;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A Project is "trivial" iff every projection is a bare ColumnReferenceNode.
|
|
45
|
+
* Trivial projects preserve row count, order, and per-row identity, so an
|
|
46
|
+
* OrdinalSlice underneath them still computes the right slice indices.
|
|
47
|
+
*
|
|
48
|
+
* Computed/expression projections might mutate cardinality (impossible for
|
|
49
|
+
* pure scalars, but the conservative check keeps the rule simple) or change
|
|
50
|
+
* the meaning of "kth row" if combined with subqueries; we exclude them.
|
|
51
|
+
*/
|
|
52
|
+
function isTrivialProject(project) {
|
|
53
|
+
return project.projections.every(p => p.node instanceof ColumnReferenceNode);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Walk down from `chainRoot` toward the access leaf, descending only through
|
|
57
|
+
* trivial Project / Alias wrappers. Returns null if we hit a non-trivial node
|
|
58
|
+
* before reaching the leaf.
|
|
59
|
+
*/
|
|
60
|
+
function peelToLeaf(chainRoot) {
|
|
61
|
+
let cursor = chainRoot;
|
|
62
|
+
let sort;
|
|
63
|
+
if (cursor instanceof SortNode) {
|
|
64
|
+
sort = cursor;
|
|
65
|
+
cursor = cursor.source;
|
|
66
|
+
}
|
|
67
|
+
let safety = 16;
|
|
68
|
+
while (safety-- > 0) {
|
|
69
|
+
if (isAccessLeaf(cursor)) {
|
|
70
|
+
return { leaf: cursor, chainRoot, sort };
|
|
71
|
+
}
|
|
72
|
+
if (cursor instanceof AliasNode) {
|
|
73
|
+
cursor = cursor.source;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (cursor instanceof ProjectNode && isTrivialProject(cursor)) {
|
|
77
|
+
cursor = cursor.source;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Rebuild the chain `chainRoot → … → oldLeaf` with `oldLeaf` replaced by
|
|
86
|
+
* `newLeaf`. Each intermediate node is reconstructed via `withChildren`,
|
|
87
|
+
* preserving its other children (scalar inputs to Project / Sort).
|
|
88
|
+
*/
|
|
89
|
+
function rebuildChain(chainRoot, oldLeaf, newLeaf) {
|
|
90
|
+
if (chainRoot === oldLeaf) {
|
|
91
|
+
return newLeaf;
|
|
92
|
+
}
|
|
93
|
+
const originalChildren = chainRoot.getChildren();
|
|
94
|
+
const newChildren = originalChildren.map(child => {
|
|
95
|
+
if (isRelationalNode(child)) {
|
|
96
|
+
return rebuildChain(child, oldLeaf, newLeaf);
|
|
97
|
+
}
|
|
98
|
+
return child;
|
|
99
|
+
});
|
|
100
|
+
return chainRoot.withChildren(newChildren);
|
|
101
|
+
}
|
|
102
|
+
export function ruleMonotonicLimitPushdown(node, _context) {
|
|
103
|
+
if (!(node instanceof LimitOffsetNode))
|
|
104
|
+
return null;
|
|
105
|
+
// Degenerate LimitOffset (no bounds) — nothing to push down.
|
|
106
|
+
if (!node.limit && !node.offset)
|
|
107
|
+
return null;
|
|
108
|
+
const peeled = peelToLeaf(node.source);
|
|
109
|
+
if (!peeled) {
|
|
110
|
+
log('Could not peel down to a physical access leaf from %s', node.source.nodeType);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const physical = peeled.leaf.physical;
|
|
114
|
+
if (!physical.accessCapabilities?.ordinalSeek) {
|
|
115
|
+
log('Leaf does not advertise ordinalSeek; skipping');
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const monotonicOn = physical.monotonicOn;
|
|
119
|
+
if (!monotonicOn || monotonicOn.length === 0) {
|
|
120
|
+
log('Leaf advertises ordinalSeek but no monotonicOn; skipping');
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const leafMonotonic = monotonicOn[0];
|
|
124
|
+
// If a Sort is present, it must be a single trivial column ref whose
|
|
125
|
+
// attribute id and direction match the leaf's monotonicOn[0].
|
|
126
|
+
if (peeled.sort) {
|
|
127
|
+
if (peeled.sort.sortKeys.length !== 1) {
|
|
128
|
+
log('Sort has %d keys; multi-key ORDER BY not supported', peeled.sort.sortKeys.length);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const key = peeled.sort.sortKeys[0];
|
|
132
|
+
if (!(key.expression instanceof ColumnReferenceNode)) {
|
|
133
|
+
log('Sort key is not a trivial column reference');
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
if (key.expression.attributeId !== leafMonotonic.attrId) {
|
|
137
|
+
log('Sort key attr=%d does not match leaf monotonicOn attr=%d', key.expression.attributeId, leafMonotonic.attrId);
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
if (key.direction !== leafMonotonic.direction) {
|
|
141
|
+
log('Sort direction %s does not match leaf monotonicOn direction %s', key.direction, leafMonotonic.direction);
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Build OrdinalSlice over the leaf, then re-stitch the chain above it.
|
|
146
|
+
const slice = new OrdinalSliceNode(node.scope, peeled.leaf, leafMonotonic.attrId, node.offset, node.limit, leafMonotonic.direction);
|
|
147
|
+
// `chainRoot` is the original LimitOffset.source — could be Sort, Project,
|
|
148
|
+
// Alias, or the leaf itself. We replace the leaf in that chain with the
|
|
149
|
+
// slice and drop the Sort if present (the slice preserves emit order).
|
|
150
|
+
let rewrittenSource;
|
|
151
|
+
if (peeled.sort) {
|
|
152
|
+
// Drop the Sort entirely: the slice's source already emits in the
|
|
153
|
+
// requested order, so re-sorting would be wasteful.
|
|
154
|
+
rewrittenSource = rebuildChain(peeled.sort.source, peeled.leaf, slice);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
rewrittenSource = rebuildChain(peeled.chainRoot, peeled.leaf, slice);
|
|
158
|
+
}
|
|
159
|
+
log('Replaced LimitOffset[/Sort]/leaf with OrdinalSlice (attr=%d, %s)', leafMonotonic.attrId, leafMonotonic.direction);
|
|
160
|
+
return rewrittenSource;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=rule-monotonic-limit-pushdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-monotonic-limit-pushdown.js","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-limit-pushdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Monotonic range scan recognition
|
|
3
|
+
*
|
|
4
|
+
* Two responsibilities, gated by node type:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Annotation (leaf nodes — IndexScan / IndexSeek / SeqScan)**:
|
|
7
|
+
* When the leaf advertises `monotonicOn(x)` and its `FilterInfo.constraints`
|
|
8
|
+
* carries a handled range/equality on `x`, set `physical.rangeBoundedOn` so
|
|
9
|
+
* EXPLAIN and downstream rules can read off the symbolic bound. This is a
|
|
10
|
+
* pure annotation — it does not change the row stream.
|
|
11
|
+
*
|
|
12
|
+
* 2. **Defensive `monotonicOn` drop (Filter directly above a leaf)**:
|
|
13
|
+
* If a `FilterNode` sits directly above a leaf that advertises
|
|
14
|
+
* `monotonicOn(x)` and the filter's predicate contains a range or equality
|
|
15
|
+
* on `x` (i.e., the vtab declined to handle the bound), the row stream
|
|
16
|
+
* emerging from the *Filter* is no longer monotonic over the WHERE-restricted
|
|
17
|
+
* set. Drop `monotonicOn` (and the implied `accessCapabilities`) from the
|
|
18
|
+
* leaf so downstream rules (asof, merge-join) don't make false assumptions.
|
|
19
|
+
*
|
|
20
|
+
* The rule runs in the PostOptimization pass so it sees physical leaves with
|
|
21
|
+
* lifted advertisements + resolved FilterInfo. The annotation reads off the
|
|
22
|
+
* leaf's own `FilterInfo.constraints` (the canonical record of which bounds
|
|
23
|
+
* the access path is walking with). The defensive escalation reads the parent
|
|
24
|
+
* Filter's predicate.
|
|
25
|
+
*/
|
|
26
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
27
|
+
import type { OptContext } from '../../framework/context.js';
|
|
28
|
+
export declare function ruleMonotonicRangeAccess(node: PlanNode, _ctx: OptContext): PlanNode | null;
|
|
29
|
+
//# sourceMappingURL=rule-monotonic-range-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-monotonic-range-access.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-range-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAuN7D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAQ1F"}
|