@quereus/quereus 4.8.0 → 4.10.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/core/database.d.ts +6 -0
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +45 -5
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +74 -15
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +88 -35
- package/dist/src/func/builtins/aggregate.js.map +1 -1
- package/dist/src/func/builtins/conversion.d.ts +5 -0
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +16 -2
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +9 -2
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +4 -2
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts +2 -0
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +60 -4
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/registration.d.ts +6 -0
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +1 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +7 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +1 -1
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +13 -1
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +121 -51
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/shared/index-style-context.d.ts +14 -4
- package/dist/src/planner/rules/shared/index-style-context.d.ts.map +1 -1
- package/dist/src/planner/rules/shared/index-style-context.js +14 -4
- package/dist/src/planner/rules/shared/index-style-context.js.map +1 -1
- package/dist/src/runtime/emission-context.d.ts +14 -1
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +17 -5
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate-setup.d.ts +44 -8
- package/dist/src/runtime/emit/aggregate-setup.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate-setup.js +79 -15
- package/dist/src/runtime/emit/aggregate-setup.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +21 -106
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +212 -155
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +1 -1
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/assertion-drop-guard.d.ts +26 -12
- package/dist/src/runtime/emit/assertion-drop-guard.d.ts.map +1 -1
- package/dist/src/runtime/emit/assertion-drop-guard.js +45 -26
- package/dist/src/runtime/emit/assertion-drop-guard.js.map +1 -1
- package/dist/src/runtime/emit/assertion-rename-helpers.d.ts +6 -6
- package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/assertion-rename-helpers.js +18 -20
- package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts +2 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +7 -8
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts +27 -5
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +278 -187
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/case.d.ts +34 -0
- package/dist/src/runtime/emit/case.d.ts.map +1 -1
- package/dist/src/runtime/emit/case.js +18 -11
- package/dist/src/runtime/emit/case.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts +2 -0
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js +7 -5
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/column-reference.d.ts +3 -1
- package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/column-reference.js +6 -2
- package/dist/src/runtime/emit/column-reference.js.map +1 -1
- package/dist/src/runtime/emit/column-rename-cascade.d.ts +84 -0
- package/dist/src/runtime/emit/column-rename-cascade.d.ts.map +1 -0
- package/dist/src/runtime/emit/column-rename-cascade.js +134 -0
- package/dist/src/runtime/emit/column-rename-cascade.js.map +1 -0
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +21 -0
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-column-guards.d.ts +82 -53
- package/dist/src/runtime/emit/drop-column-guards.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-column-guards.js +155 -90
- package/dist/src/runtime/emit/drop-column-guards.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +5 -0
- package/dist/src/runtime/emit/drop-table.js.map +1 -1
- package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-view.js +5 -0
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/expression-drop-guard.d.ts +57 -0
- package/dist/src/runtime/emit/expression-drop-guard.d.ts.map +1 -0
- package/dist/src/runtime/emit/expression-drop-guard.js +82 -0
- package/dist/src/runtime/emit/expression-drop-guard.js.map +1 -0
- package/dist/src/runtime/emit/filter.d.ts +1 -1
- package/dist/src/runtime/emit/filter.js +1 -1
- package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.js +18 -88
- package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
- package/dist/src/runtime/emit/literal.d.ts +14 -1
- package/dist/src/runtime/emit/literal.d.ts.map +1 -1
- package/dist/src/runtime/emit/literal.js +33 -7
- package/dist/src/runtime/emit/literal.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +33 -10
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +158 -49
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +3 -0
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/parameter.d.ts +3 -1
- package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
- package/dist/src/runtime/emit/parameter.js +7 -2
- package/dist/src/runtime/emit/parameter.js.map +1 -1
- package/dist/src/runtime/emit/scalar-function.d.ts +29 -1
- package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/scalar-function.js +66 -16
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scalar-op.d.ts +63 -0
- package/dist/src/runtime/emit/scalar-op.d.ts.map +1 -0
- package/dist/src/runtime/emit/scalar-op.js +37 -0
- package/dist/src/runtime/emit/scalar-op.js.map +1 -0
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +19 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/temporal-arithmetic.d.ts +18 -8
- package/dist/src/runtime/emit/temporal-arithmetic.d.ts.map +1 -1
- package/dist/src/runtime/emit/temporal-arithmetic.js +29 -311
- package/dist/src/runtime/emit/temporal-arithmetic.js.map +1 -1
- package/dist/src/runtime/emit/unary.d.ts +2 -0
- package/dist/src/runtime/emit/unary.d.ts.map +1 -1
- package/dist/src/runtime/emit/unary.js +125 -53
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emitters.d.ts +22 -0
- package/dist/src/runtime/emitters.d.ts.map +1 -1
- package/dist/src/runtime/emitters.js +29 -0
- package/dist/src/runtime/emitters.js.map +1 -1
- package/dist/src/runtime/scalar-fusion.d.ts +47 -0
- package/dist/src/runtime/scalar-fusion.d.ts.map +1 -0
- package/dist/src/runtime/scalar-fusion.js +275 -0
- package/dist/src/runtime/scalar-fusion.js.map +1 -0
- package/dist/src/runtime/strict-flags.d.ts +9 -0
- package/dist/src/runtime/strict-flags.d.ts.map +1 -1
- package/dist/src/runtime/strict-flags.js +9 -0
- package/dist/src/runtime/strict-flags.js.map +1 -1
- package/dist/src/runtime/strict-fork.js +2 -2
- package/dist/src/runtime/strict-fork.js.map +1 -1
- package/dist/src/runtime/strict-representation.d.ts +78 -0
- package/dist/src/runtime/strict-representation.d.ts.map +1 -0
- package/dist/src/runtime/strict-representation.js +159 -0
- package/dist/src/runtime/strict-representation.js.map +1 -0
- package/dist/src/schema/assertion.d.ts +58 -0
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/assertion.js +78 -0
- package/dist/src/schema/assertion.js.map +1 -1
- package/dist/src/schema/catalog-persistability.d.ts +11 -3
- package/dist/src/schema/catalog-persistability.d.ts.map +1 -1
- package/dist/src/schema/catalog-persistability.js +48 -29
- package/dist/src/schema/catalog-persistability.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +22 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +4 -1
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column-republication.d.ts +126 -0
- package/dist/src/schema/column-republication.d.ts.map +1 -0
- package/dist/src/schema/column-republication.js +121 -0
- package/dist/src/schema/column-republication.js.map +1 -0
- package/dist/src/schema/column-source-resolver.d.ts +29 -6
- package/dist/src/schema/column-source-resolver.d.ts.map +1 -1
- package/dist/src/schema/column-source-resolver.js +78 -9
- package/dist/src/schema/column-source-resolver.js.map +1 -1
- package/dist/src/schema/expression-dependents.d.ts +160 -0
- package/dist/src/schema/expression-dependents.d.ts.map +1 -0
- package/dist/src/schema/expression-dependents.js +228 -0
- package/dist/src/schema/expression-dependents.js.map +1 -0
- package/dist/src/schema/function.d.ts +15 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/object-dependency-closure.d.ts +127 -0
- package/dist/src/schema/object-dependency-closure.d.ts.map +1 -0
- package/dist/src/schema/object-dependency-closure.js +117 -0
- package/dist/src/schema/object-dependency-closure.js.map +1 -0
- package/dist/src/schema/object-ref-resolver.d.ts +83 -0
- package/dist/src/schema/object-ref-resolver.d.ts.map +1 -0
- package/dist/src/schema/object-ref-resolver.js +135 -0
- package/dist/src/schema/object-ref-resolver.js.map +1 -0
- package/dist/src/schema/rename/column-rename.d.ts +228 -0
- package/dist/src/schema/rename/column-rename.d.ts.map +1 -0
- package/dist/src/schema/rename/column-rename.js +1225 -0
- package/dist/src/schema/rename/column-rename.js.map +1 -0
- package/dist/src/schema/rename/self-qualifier-strip.d.ts +29 -0
- package/dist/src/schema/rename/self-qualifier-strip.d.ts.map +1 -0
- package/dist/src/schema/rename/self-qualifier-strip.js +267 -0
- package/dist/src/schema/rename/self-qualifier-strip.js.map +1 -0
- package/dist/src/schema/rename/shared.d.ts +108 -0
- package/dist/src/schema/rename/shared.d.ts.map +1 -0
- package/dist/src/schema/rename/shared.js +49 -0
- package/dist/src/schema/rename/shared.js.map +1 -0
- package/dist/src/schema/rename/table-rename.d.ts +263 -0
- package/dist/src/schema/rename/table-rename.d.ts.map +1 -0
- package/dist/src/schema/rename/table-rename.js +860 -0
- package/dist/src/schema/rename/table-rename.js.map +1 -0
- package/dist/src/schema/rename-rewriter.d.ts +18 -278
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +17 -1506
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +228 -21
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +29 -36
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/cast-semantics.d.ts +7 -5
- package/dist/src/types/cast-semantics.d.ts.map +1 -1
- package/dist/src/types/cast-semantics.js +20 -9
- package/dist/src/types/cast-semantics.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/registry.d.ts.map +1 -1
- package/dist/src/types/registry.js +2 -1
- package/dist/src/types/registry.js.map +1 -1
- package/dist/src/types/temporal-ops.d.ts +119 -0
- package/dist/src/types/temporal-ops.d.ts.map +1 -0
- package/dist/src/types/temporal-ops.js +348 -0
- package/dist/src/types/temporal-ops.js.map +1 -0
- package/dist/src/types/temporal-types.d.ts +11 -0
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +87 -0
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/affinity.d.ts +2 -1
- package/dist/src/util/affinity.d.ts.map +1 -1
- package/dist/src/util/affinity.js +16 -5
- package/dist/src/util/affinity.js.map +1 -1
- package/dist/src/util/ast-spine-clone.d.ts +2 -2
- package/dist/src/util/ast-spine-clone.js +2 -2
- package/dist/src/util/coercion.d.ts +22 -7
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +28 -15
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +25 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +25 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/key-tuple-codec.d.ts +12 -3
- package/dist/src/util/key-tuple-codec.d.ts.map +1 -1
- package/dist/src/util/key-tuple-codec.js.map +1 -1
- package/dist/src/util/numeric-canonical.d.ts +26 -0
- package/dist/src/util/numeric-canonical.d.ts.map +1 -0
- package/dist/src/util/numeric-canonical.js +66 -0
- package/dist/src/util/numeric-canonical.js.map +1 -0
- package/dist/src/util/value-text.d.ts +48 -0
- package/dist/src/util/value-text.d.ts.map +1 -0
- package/dist/src/util/value-text.js +35 -0
- package/dist/src/util/value-text.js.map +1 -0
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +14 -5
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/module.d.ts +25 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { StatusCode } from '../common/types.js';
|
|
2
|
+
import { QuereusError } from '../common/errors.js';
|
|
3
|
+
import { PlanNodeType } from '../planner/nodes/plan-node-type.js';
|
|
4
|
+
import { isScalarFunctionSchema } from '../schema/function.js';
|
|
5
|
+
import { assertSpecArity } from './emit/scalar-op.js';
|
|
6
|
+
import { buildScalarFunctionRun } from './emit/scalar-function.js';
|
|
7
|
+
import { buildLiteralSpec } from './emit/literal.js';
|
|
8
|
+
import { buildColumnReferenceSpec } from './emit/column-reference.js';
|
|
9
|
+
import { buildParameterSpec } from './emit/parameter.js';
|
|
10
|
+
import { buildCastSpec } from './emit/cast.js';
|
|
11
|
+
import { buildUnaryOpSpec } from './emit/unary.js';
|
|
12
|
+
import { buildBetweenSpec } from './emit/between.js';
|
|
13
|
+
import { buildBinaryOpSpec } from './emit/binary.js';
|
|
14
|
+
import { buildCaseMatcher } from './emit/case.js';
|
|
15
|
+
import { isTruthy } from '../util/comparison.js';
|
|
16
|
+
/**
|
|
17
|
+
* Largest fused subtree depth. Fused closures nest on the JS call stack where the
|
|
18
|
+
* scheduler's linearized instruction loop did not, so a pathologically deep expression
|
|
19
|
+
* (`a+a+a+…` thousands of terms) could overflow the stack where it works unfused.
|
|
20
|
+
* Past this depth the expression offered to {@link tryFuseScalar} falls back whole to the
|
|
21
|
+
* sub-program path — correct, just unoptimized. Fusion is still retried from depth 0 at
|
|
22
|
+
* every nested `emitCallFromPlan` site the fallback emission reaches (CASE branches, an
|
|
23
|
+
* AND/OR short-circuit right leg), so a deep tree fuses in pieces below those seams rather
|
|
24
|
+
* than not at all. 32 is far above any real expression's nesting.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_FUSION_DEPTH = 32;
|
|
27
|
+
/**
|
|
28
|
+
* Compile `plan` into a single closure, or return undefined if any node in the subtree
|
|
29
|
+
* cannot be fused (an unsupported node type, a subquery, anything that can return a
|
|
30
|
+
* Promise, or a subtree deeper than {@link MAX_FUSION_DEPTH}). Undefined is the normal
|
|
31
|
+
* answer for most of the plan tree; the caller falls back to the sub-program path
|
|
32
|
+
* unchanged.
|
|
33
|
+
*
|
|
34
|
+
* Every fused body comes from the node's own {@link ScalarOpSpec} builder (or, for
|
|
35
|
+
* CASE, from `buildCaseMatcher`) — the same functions the instruction emitters run —
|
|
36
|
+
* so a fused expression and its instruction form cannot disagree on semantics, error
|
|
37
|
+
* messages, or evaluation counts. This compiler only changes HOW operand values reach
|
|
38
|
+
* those bodies: direct nested calls instead of scheduler slots.
|
|
39
|
+
*
|
|
40
|
+
* A scalar function call fuses only when it is provably synchronous — see
|
|
41
|
+
* {@link fuseScalarFunctionCall}. The AND/OR short-circuit form declines through
|
|
42
|
+
* `buildBinaryOpSpec` returning undefined, and subquery/window/aggregate/relational
|
|
43
|
+
* nodes decline as unknown node types — which also keeps every `emitCallFromPlan` call
|
|
44
|
+
* site that passes a relational plan (cache sources, join legs, view-mutation programs)
|
|
45
|
+
* on the sub-program path for free.
|
|
46
|
+
*/
|
|
47
|
+
export function tryFuseScalar(plan, ctx) {
|
|
48
|
+
return fuseNode(plan, ctx, 0);
|
|
49
|
+
}
|
|
50
|
+
// NOTE: a subtree that declines partway has already built every spec above the declining
|
|
51
|
+
// node — resolving collations, compiling a constant LIKE matcher — and those are then
|
|
52
|
+
// rebuilt by the fallback `emitPlanNode`. Emit-time only, bounded by subtree size, and the
|
|
53
|
+
// idempotent work (collation lookups record into a Set) cannot diverge. Fine today; if emit
|
|
54
|
+
// latency ever shows up on function-heavy expressions, pre-walk the subtree for unfusable
|
|
55
|
+
// node types before building any spec.
|
|
56
|
+
/** Per-node dispatch. `depth` counts the closure frames already wrapping this node. */
|
|
57
|
+
function fuseNode(plan, ctx, depth) {
|
|
58
|
+
if (depth > MAX_FUSION_DEPTH)
|
|
59
|
+
return undefined;
|
|
60
|
+
switch (plan.nodeType) {
|
|
61
|
+
case PlanNodeType.Literal: {
|
|
62
|
+
// Undefined when the literal holds an unresolved async constant-fold result —
|
|
63
|
+
// the scheduler resolves that Promise; a fused closure could not.
|
|
64
|
+
const spec = buildLiteralSpec(plan);
|
|
65
|
+
return spec && fuseSpec(spec, ctx, depth);
|
|
66
|
+
}
|
|
67
|
+
case PlanNodeType.ColumnReference:
|
|
68
|
+
return fuseSpec(buildColumnReferenceSpec(plan), ctx, depth);
|
|
69
|
+
case PlanNodeType.ParameterReference:
|
|
70
|
+
return fuseSpec(buildParameterSpec(plan), ctx, depth);
|
|
71
|
+
case PlanNodeType.Collate:
|
|
72
|
+
// No runtime effect (mirrors emitCollate) — fuse straight through to the
|
|
73
|
+
// operand. Adds no closure frame, so depth is unchanged.
|
|
74
|
+
return fuseNode(plan.operand, ctx, depth);
|
|
75
|
+
case PlanNodeType.Cast:
|
|
76
|
+
return fuseSpec(buildCastSpec(plan), ctx, depth);
|
|
77
|
+
case PlanNodeType.UnaryOp:
|
|
78
|
+
return fuseSpec(buildUnaryOpSpec(plan), ctx, depth);
|
|
79
|
+
case PlanNodeType.Between:
|
|
80
|
+
return fuseSpec(buildBetweenSpec(plan, ctx), ctx, depth);
|
|
81
|
+
case PlanNodeType.BinaryOp: {
|
|
82
|
+
// Undefined for the AND/OR short-circuit form (subquery right operand),
|
|
83
|
+
// whose right leg is a deferred sub-program rather than a value.
|
|
84
|
+
const spec = buildBinaryOpSpec(plan, ctx);
|
|
85
|
+
return spec && fuseSpec(spec, ctx, depth);
|
|
86
|
+
}
|
|
87
|
+
case PlanNodeType.CaseExpr:
|
|
88
|
+
return fuseCase(plan, ctx, depth);
|
|
89
|
+
case PlanNodeType.ScalarFunctionCall:
|
|
90
|
+
return fuseScalarFunctionCall(plan, ctx, depth);
|
|
91
|
+
default:
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The `AsyncFunction` constructor, which has no global binding — reachable only off an
|
|
97
|
+
* instance. An `async function` / `async` arrow carries `AsyncFunction.prototype` on its
|
|
98
|
+
* prototype chain, so `impl instanceof AsyncFunction` recognizes one.
|
|
99
|
+
*
|
|
100
|
+
* NOTE: `instanceof` is realm-local. A plugin loaded into a *different* JS realm (a worker,
|
|
101
|
+
* an iframe, a `node:vm` context) carries that realm's `AsyncFunction.prototype`, so its
|
|
102
|
+
* async implementation would not be recognized and would fall to step 4's guard — a thrown
|
|
103
|
+
* error with the `isAsync` remedy rather than a wrong answer. No loader in this repo crosses
|
|
104
|
+
* a realm (plugin-loader uses same-realm dynamic `import()`); if one ever does, widen this
|
|
105
|
+
* to also accept `impl[Symbol.toStringTag] === 'AsyncFunction'`, which is realm-agnostic.
|
|
106
|
+
*/
|
|
107
|
+
const AsyncFunction = (async () => { }).constructor;
|
|
108
|
+
/**
|
|
109
|
+
* Fuse a scalar function call, but only when its implementation is provably
|
|
110
|
+
* synchronous. A fused node's contract is a plain `SqlValue`, while a `ScalarFunc` is
|
|
111
|
+
* typed `(...args) => MaybePromise<SqlValue>`; admitting `MaybePromise` into the fused
|
|
112
|
+
* contract would put a Promise check and a `.then` path on every node in the chain,
|
|
113
|
+
* which is the sub-program overhead this compiler exists to delete. So the decision is
|
|
114
|
+
* made once here, at emit time, in this order:
|
|
115
|
+
*
|
|
116
|
+
* 1. **A `customEmitter` never fuses.** It builds its own `Instruction` — possibly with
|
|
117
|
+
* sub-programs or async behavior — and this compiler cannot see inside it. Today that
|
|
118
|
+
* excludes `nullif`, `greatest`, `least`, `json_schema` and `mutation_ordinal`;
|
|
119
|
+
* giving custom emitters a fusion hook is parked in
|
|
120
|
+
* `tickets/backlog/feat-fuse-custom-emitter-scalar-functions.md`.
|
|
121
|
+
* 2. **`isAsync === true` never fuses** — the author's explicit declaration.
|
|
122
|
+
* 3. **A declared `async` implementation never fuses**, auto-detected, so the ordinary
|
|
123
|
+
* async UDF needs no flag.
|
|
124
|
+
* 4. **Otherwise fuse, with a guard**: a non-`async` implementation that returns a
|
|
125
|
+
* Promise anyway is invisible to step 3, so the fused body checks and throws a
|
|
126
|
+
* `QuereusError` naming the function and the `isAsync` remedy. One `instanceof` per
|
|
127
|
+
* call — negligible beside the sub-program it replaces — and it converts a silent
|
|
128
|
+
* wrong answer (a Promise flowing on as if it were a value, comparing as garbage)
|
|
129
|
+
* into a loud, actionable error.
|
|
130
|
+
*
|
|
131
|
+
* The body itself is {@link buildScalarFunctionRun}, the same one
|
|
132
|
+
* `emitScalarFunctionCallDefault` gives the scheduler, so a fused call and an
|
|
133
|
+
* instruction call cannot disagree on error text, arity checking or the `REPR_STRICT`
|
|
134
|
+
* return check. Operands compose by arity like every other fused node — including the
|
|
135
|
+
* variadic case (`numArgs === -1`, e.g. `coalesce`), which needs no special handling
|
|
136
|
+
* because the composition switches on `operands.length`, not on the declared arity.
|
|
137
|
+
*/
|
|
138
|
+
function fuseScalarFunctionCall(plan, ctx, depth) {
|
|
139
|
+
const schema = plan.functionSchema;
|
|
140
|
+
// Not a scalar schema at all: `emitScalarFunctionCall` reports that, and the unfused
|
|
141
|
+
// path it falls back to still does. Decline rather than duplicate the diagnosis.
|
|
142
|
+
if (!isScalarFunctionSchema(schema))
|
|
143
|
+
return undefined;
|
|
144
|
+
if (schema.customEmitter)
|
|
145
|
+
return undefined;
|
|
146
|
+
if (schema.isAsync)
|
|
147
|
+
return undefined;
|
|
148
|
+
if (schema.implementation instanceof AsyncFunction)
|
|
149
|
+
return undefined;
|
|
150
|
+
const body = buildScalarFunctionRun(plan);
|
|
151
|
+
const functionName = plan.expression.name.toLowerCase();
|
|
152
|
+
const loc = plan.expression.loc?.start;
|
|
153
|
+
const guarded = (rctx, ...args) => {
|
|
154
|
+
const result = body(rctx, ...args);
|
|
155
|
+
if (result instanceof Promise) {
|
|
156
|
+
throw new QuereusError(`Function ${functionName} returned a Promise but is not declared asynchronous. `
|
|
157
|
+
+ `Declare isAsync: true on its registration so the engine keeps it off the fused expression path.`, StatusCode.ERROR, undefined, loc?.line, loc?.column);
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
};
|
|
161
|
+
return composeFused(guarded, plan.operands, ctx, depth);
|
|
162
|
+
}
|
|
163
|
+
/** Check the spec's body arity, then compose it with its fused operands. */
|
|
164
|
+
function fuseSpec(spec, ctx, depth) {
|
|
165
|
+
assertSpecArity(spec);
|
|
166
|
+
return composeFused(spec.run, spec.operands, ctx, depth);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Compose a synchronous body with its fused operands, specialized by arity so the common
|
|
170
|
+
* cases allocate nothing per row and stay monomorphic. Closure composition only — no
|
|
171
|
+
* `new Function`/`eval`, which are unavailable under a Content-Security-Policy and under
|
|
172
|
+
* React Native.
|
|
173
|
+
*
|
|
174
|
+
* Shared by the {@link ScalarOpSpec} nodes and by {@link fuseScalarFunctionCall}, whose
|
|
175
|
+
* variadic body has no fixed parameter count to assert (hence the assert living in
|
|
176
|
+
* {@link fuseSpec}, not here). The switch is on how many operands are actually
|
|
177
|
+
* evaluated, so a variadic function's call site lands in whichever fixed arm matches
|
|
178
|
+
* its argument count.
|
|
179
|
+
*/
|
|
180
|
+
function composeFused(run, operands, ctx, depth) {
|
|
181
|
+
switch (operands.length) {
|
|
182
|
+
case 0:
|
|
183
|
+
// The body already IS the fused closure — wrapping it would add a call frame
|
|
184
|
+
// per row to the two most common leaves in any query (column refs, literals).
|
|
185
|
+
return run;
|
|
186
|
+
case 1: {
|
|
187
|
+
const a = fuseNode(operands[0], ctx, depth + 1);
|
|
188
|
+
return a && ((rctx) => run(rctx, a(rctx)));
|
|
189
|
+
}
|
|
190
|
+
case 2: {
|
|
191
|
+
const a = fuseNode(operands[0], ctx, depth + 1);
|
|
192
|
+
if (!a)
|
|
193
|
+
return undefined;
|
|
194
|
+
const b = fuseNode(operands[1], ctx, depth + 1);
|
|
195
|
+
return b && ((rctx) => run(rctx, a(rctx), b(rctx)));
|
|
196
|
+
}
|
|
197
|
+
case 3: {
|
|
198
|
+
const a = fuseNode(operands[0], ctx, depth + 1);
|
|
199
|
+
if (!a)
|
|
200
|
+
return undefined;
|
|
201
|
+
const b = fuseNode(operands[1], ctx, depth + 1);
|
|
202
|
+
if (!b)
|
|
203
|
+
return undefined;
|
|
204
|
+
const c = fuseNode(operands[2], ctx, depth + 1);
|
|
205
|
+
return c && ((rctx) => run(rctx, a(rctx), b(rctx), c(rctx)));
|
|
206
|
+
}
|
|
207
|
+
default: {
|
|
208
|
+
// No spec is wider than 3 operands; a wide variadic call (`coalesce(a,b,c,d)`)
|
|
209
|
+
// lands here. An args array + spread is still far cheaper than a sub-program.
|
|
210
|
+
const fused = [];
|
|
211
|
+
for (const operand of operands) {
|
|
212
|
+
const f = fuseNode(operand, ctx, depth + 1);
|
|
213
|
+
if (!f)
|
|
214
|
+
return undefined;
|
|
215
|
+
fused.push(f);
|
|
216
|
+
}
|
|
217
|
+
return (rctx) => run(rctx, ...fused.map(f => f(rctx)));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* CASE is the one covered node that is not a flat {@link ScalarOpSpec}: its branches are
|
|
223
|
+
* lazy. Fuse it only when the base (if any) AND every WHEN/THEN/ELSE fuse — all-or-nothing
|
|
224
|
+
* avoids a mixed contract where some branches are closures and some are sub-programs
|
|
225
|
+
* returning `MaybePromise`. The fused body keeps SQL's evaluation rules exactly as
|
|
226
|
+
* `emitCaseExpr` has them: WHEN clauses left to right, stop at the first match, evaluate
|
|
227
|
+
* ONLY the selected result, never touch a later clause. Match decisions come from
|
|
228
|
+
* `buildCaseMatcher`, so a fused CASE and an instruction CASE cannot disagree.
|
|
229
|
+
*
|
|
230
|
+
* Branch closures are invoked from inside the CASE closure, so their frames stack —
|
|
231
|
+
* they count toward the depth cap (depth + 1), same as spec operands.
|
|
232
|
+
*/
|
|
233
|
+
function fuseCase(plan, ctx, depth) {
|
|
234
|
+
const whens = [];
|
|
235
|
+
const thens = [];
|
|
236
|
+
for (const clause of plan.whenThenClauses) {
|
|
237
|
+
const when = fuseNode(clause.when, ctx, depth + 1);
|
|
238
|
+
if (!when)
|
|
239
|
+
return undefined;
|
|
240
|
+
const then = fuseNode(clause.then, ctx, depth + 1);
|
|
241
|
+
if (!then)
|
|
242
|
+
return undefined;
|
|
243
|
+
whens.push(when);
|
|
244
|
+
thens.push(then);
|
|
245
|
+
}
|
|
246
|
+
const elseFn = plan.elseExpr ? fuseNode(plan.elseExpr, ctx, depth + 1) : undefined;
|
|
247
|
+
if (plan.elseExpr && !elseFn)
|
|
248
|
+
return undefined;
|
|
249
|
+
const clauseCount = whens.length;
|
|
250
|
+
// Simple CASE: base compared against each WHEN under the per-clause pre-resolved
|
|
251
|
+
// comparator (collation + type routing). A NULL base matches nothing.
|
|
252
|
+
if (plan.baseExpr) {
|
|
253
|
+
const base = fuseNode(plan.baseExpr, ctx, depth + 1);
|
|
254
|
+
if (!base)
|
|
255
|
+
return undefined;
|
|
256
|
+
const matcher = buildCaseMatcher(plan, ctx);
|
|
257
|
+
return (rctx) => {
|
|
258
|
+
const baseValue = base(rctx);
|
|
259
|
+
for (let i = 0; i < clauseCount; i++) {
|
|
260
|
+
if (matcher.matches(i, baseValue, whens[i](rctx)))
|
|
261
|
+
return thens[i](rctx);
|
|
262
|
+
}
|
|
263
|
+
return elseFn ? elseFn(rctx) : null;
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// Searched CASE: first truthy WHEN selects its THEN.
|
|
267
|
+
return (rctx) => {
|
|
268
|
+
for (let i = 0; i < clauseCount; i++) {
|
|
269
|
+
if (isTruthy(whens[i](rctx)))
|
|
270
|
+
return thens[i](rctx);
|
|
271
|
+
}
|
|
272
|
+
return elseFn ? elseFn(rctx) : null;
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=scalar-fusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalar-fusion.js","sourceRoot":"","sources":["../../../src/runtime/scalar-fusion.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,4 +19,13 @@ export declare const FORK_STRICT: boolean;
|
|
|
19
19
|
* § Invariant: source-attr contexts and child pulls.
|
|
20
20
|
*/
|
|
21
21
|
export declare const CONTEXT_STRICT: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* `QUEREUS_REPR_STRICT` — physical-representation assertions. Verifies at four
|
|
24
|
+
* runtime seams (vtab scan output, DML write, UDF return, statement row egress)
|
|
25
|
+
* that every value is in the JavaScript form its declared type promises — R1
|
|
26
|
+
* (canonical numeric form) and R2 (per-declared-type value space) of
|
|
27
|
+
* docs/types.md § Physical representation. Off, the checks are a single
|
|
28
|
+
* already-false branch. See strict-representation.ts.
|
|
29
|
+
*/
|
|
30
|
+
export declare const REPR_STRICT: boolean;
|
|
22
31
|
//# sourceMappingURL=strict-flags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-flags.d.ts","sourceRoot":"","sources":["../../../src/runtime/strict-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,sFAAsF;AACtF,eAAO,MAAM,WAAW,SAAkC,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,SAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"strict-flags.d.ts","sourceRoot":"","sources":["../../../src/runtime/strict-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,sFAAsF;AACtF,eAAO,MAAM,WAAW,SAAkC,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,SAAqC,CAAC;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,SAAkC,CAAC"}
|
|
@@ -23,4 +23,13 @@ export const FORK_STRICT = readFlag('QUEREUS_FORK_STRICT');
|
|
|
23
23
|
* § Invariant: source-attr contexts and child pulls.
|
|
24
24
|
*/
|
|
25
25
|
export const CONTEXT_STRICT = readFlag('QUEREUS_CONTEXT_STRICT');
|
|
26
|
+
/**
|
|
27
|
+
* `QUEREUS_REPR_STRICT` — physical-representation assertions. Verifies at four
|
|
28
|
+
* runtime seams (vtab scan output, DML write, UDF return, statement row egress)
|
|
29
|
+
* that every value is in the JavaScript form its declared type promises — R1
|
|
30
|
+
* (canonical numeric form) and R2 (per-declared-type value space) of
|
|
31
|
+
* docs/types.md § Physical representation. Off, the checks are a single
|
|
32
|
+
* already-false branch. See strict-representation.ts.
|
|
33
|
+
*/
|
|
34
|
+
export const REPR_STRICT = readFlag('QUEREUS_REPR_STRICT');
|
|
26
35
|
//# sourceMappingURL=strict-flags.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-flags.js","sourceRoot":"","sources":["../../../src/runtime/strict-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,SAAS,QAAQ,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;AAC1C,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"strict-flags.js","sourceRoot":"","sources":["../../../src/runtime/strict-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,SAAS,QAAQ,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;AAC1C,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -14,7 +14,7 @@ import { FORK_STRICT, CONTEXT_STRICT } from './strict-flags.js';
|
|
|
14
14
|
* forks is being driven throws. State is tracked **per parent map** (not
|
|
15
15
|
* globally) so concurrent unrelated drivers don't interfere, forks may mutate
|
|
16
16
|
* their own fresh maps freely, and sub-forks are independently tracked.
|
|
17
|
-
* See docs/runtime.md § Parallel runtime fork contract.
|
|
17
|
+
* See docs/runtime-parallel.md § Parallel runtime fork contract.
|
|
18
18
|
*
|
|
19
19
|
* 2. **`QUEREUS_CONTEXT_STRICT`** — stale-shadow detection. Maintains a per-
|
|
20
20
|
* descriptor epoch and a per-attribute index-winner map so `assertNoShadow`
|
|
@@ -39,7 +39,7 @@ export function strictForkEnabled() {
|
|
|
39
39
|
}
|
|
40
40
|
function violation(target, count) {
|
|
41
41
|
throw new QuereusError(`strict-fork: parent context mutated ${target} while ${count} fork(s) are active. ` +
|
|
42
|
-
`This is a fork-contract violation. See docs/runtime.md § Parallel runtime fork contract.`, StatusCode.INTERNAL);
|
|
42
|
+
`This is a fork-contract violation. See docs/runtime-parallel.md § Parallel runtime fork contract.`, StatusCode.INTERNAL);
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
45
|
* Wrap a fresh `tableContexts` Map. In non-strict mode returns the input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-fork.js","sourceRoot":"","sources":["../../../src/runtime/strict-fork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAyB,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,iFAAiF;AACjF,0DAA0D;AAC1D,MAAM,WAAW,GAAG,WAAW,CAAC;AAOhC,iFAAiF;AACjF,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAqB,CAAC;AAE3D,+FAA+F;AAC/F,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAqB,CAAC;AAE3D,MAAM,UAAU,iBAAiB;IAChC,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;IAC/C,MAAM,IAAI,YAAY,CACrB,uCAAuC,MAAM,UAAU,KAAK,uBAAuB;QACnF,
|
|
1
|
+
{"version":3,"file":"strict-fork.js","sourceRoot":"","sources":["../../../src/runtime/strict-fork.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { QuereusError } from '../common/errors.js';
|
|
2
|
+
import { type DeepReadonly, type Row, type SqlValue } from '../common/types.js';
|
|
3
|
+
import { type LogicalType } from '../types/logical-type.js';
|
|
4
|
+
/**
|
|
5
|
+
* Off-by-default physical-representation assertions (`QUEREUS_REPR_STRICT`).
|
|
6
|
+
*
|
|
7
|
+
* The engine canonicalizes every value it MINTS itself (see
|
|
8
|
+
* `util/numeric-canonical.ts` and docs/types.md § Physical representation). Two
|
|
9
|
+
* ingress boundaries are deliberately left uncoerced because coercing them costs
|
|
10
|
+
* per row where there is nothing to win:
|
|
11
|
+
*
|
|
12
|
+
* - rows returned by a virtual-table module's `query()`, including third-party
|
|
13
|
+
* modules the engine cannot vet;
|
|
14
|
+
* - values returned by user-defined functions.
|
|
15
|
+
*
|
|
16
|
+
* For those the contract is **declared and checked, not enforced**: a module or UDF
|
|
17
|
+
* is obliged to return canonical values, and this harness verifies it when the flag
|
|
18
|
+
* is on. Same shape as the parallel-fork (`QUEREUS_FORK_STRICT`) and stale-context
|
|
19
|
+
* (`QUEREUS_CONTEXT_STRICT`) harnesses in `strict-fork.ts`.
|
|
20
|
+
*
|
|
21
|
+
* The two rules checked here, restated from docs/types.md § Physical representation:
|
|
22
|
+
*
|
|
23
|
+
* - **R1 — canonical numeric form.** A `SqlValue` is a JS `bigint` only when its
|
|
24
|
+
* magnitude is outside the safe-integer range. Applies to every value, whatever its
|
|
25
|
+
* declared type, including `ANY` positions.
|
|
26
|
+
* - **R2 — per-declared-type value space.** A value in a position of a declared type
|
|
27
|
+
* inhabits that type's JS value space (INTEGER → safe-integer `number` or `bigint`,
|
|
28
|
+
* TEXT → `string`, BLOB → `Uint8Array`, …). Implies R1.
|
|
29
|
+
*
|
|
30
|
+
* `null` is always admissible: nullability is `not null` constraint enforcement's
|
|
31
|
+
* job and lives elsewhere.
|
|
32
|
+
*
|
|
33
|
+
* **No capability flag.** A `representationFidelity` declaration on
|
|
34
|
+
* `VirtualTableModule` was considered and rejected — nothing would BEHAVE differently
|
|
35
|
+
* based on it, since the engine tolerates both numeric forms everywhere and will
|
|
36
|
+
* continue to. The obligation lives in the module contract prose (`vtab/module.ts`)
|
|
37
|
+
* and is enforced here in tests.
|
|
38
|
+
*
|
|
39
|
+
* Every call site is guarded by `if (REPR_STRICT)` read from the module-level const in
|
|
40
|
+
* `strict-flags.ts`, so with the flag off each seam is one already-false branch and
|
|
41
|
+
* nothing is built at emit time on this module's behalf.
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* A declared type as this checker reads it. Only `name` and `physicalType` are
|
|
45
|
+
* consulted, and the parameter is `DeepReadonly` so both a raw `LogicalType` (column
|
|
46
|
+
* schema) and the frozen one a `ScalarType` carries are accepted without a cast.
|
|
47
|
+
*/
|
|
48
|
+
export type DeclaredType = DeepReadonly<LogicalType>;
|
|
49
|
+
/** A violation of R1/R2. Distinct class so a seam inside a re-wrapping `catch`
|
|
50
|
+
* (the vtab scan) can rethrow it unchanged instead of burying it in a generic
|
|
51
|
+
* "error during query" message. */
|
|
52
|
+
export declare class RepresentationError extends QuereusError {
|
|
53
|
+
constructor(message: string);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* R1 for one value: no `bigint` may hold a safe-range integer. Needs no declared type,
|
|
57
|
+
* so this is the check for `ANY` and untyped positions.
|
|
58
|
+
*
|
|
59
|
+
* `where` names the seam and the position (column / argument) and is quoted verbatim
|
|
60
|
+
* into the message — make it something a plugin author who has never read this code
|
|
61
|
+
* can act on, e.g. `` `module 'memory' scan of main.t column 2 (id)` ``.
|
|
62
|
+
*/
|
|
63
|
+
export declare function assertCanonicalValue(value: SqlValue, where: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* R2 for one value in a position of declared type `type` (implies R1).
|
|
66
|
+
* See {@link assertCanonicalValue} for what `where` should say.
|
|
67
|
+
*/
|
|
68
|
+
export declare function assertConformsToType(value: SqlValue, type: DeclaredType, where: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Row form of {@link assertConformsToType}. `types[i]` may be `undefined` — an ANY /
|
|
71
|
+
* untyped position, which is normal and gets R1 only, never a reported violation.
|
|
72
|
+
* A cell past the end of `types` is treated the same way.
|
|
73
|
+
*
|
|
74
|
+
* `columnNames[i]`, when supplied, is folded into the `where` text so the message
|
|
75
|
+
* names the column a plugin author declared rather than an ordinal.
|
|
76
|
+
*/
|
|
77
|
+
export declare function assertRowConforms(row: Row, types: readonly (DeclaredType | undefined)[], where: string, columnNames?: readonly (string | undefined)[]): void;
|
|
78
|
+
//# sourceMappingURL=strict-representation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-representation.d.ts","sourceRoot":"","sources":["../../../src/runtime/strict-representation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAErD;;oCAEoC;AACpC,qBAAa,mBAAoB,SAAQ,YAAY;gBACxC,OAAO,EAAE,MAAM;CAK3B;AAiGD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOzE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS7F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,EAAE,EAC5C,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAC3C,IAAI,CAWN"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { QuereusError } from '../common/errors.js';
|
|
2
|
+
import { StatusCode } from '../common/types.js';
|
|
3
|
+
import { PhysicalType } from '../types/logical-type.js';
|
|
4
|
+
import { isCanonicalNumeric } from '../util/numeric-canonical.js';
|
|
5
|
+
import { valueToText } from '../util/value-text.js';
|
|
6
|
+
/** A violation of R1/R2. Distinct class so a seam inside a re-wrapping `catch`
|
|
7
|
+
* (the vtab scan) can rethrow it unchanged instead of burying it in a generic
|
|
8
|
+
* "error during query" message. */
|
|
9
|
+
export class RepresentationError extends QuereusError {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message, StatusCode.INTERNAL);
|
|
12
|
+
this.name = 'RepresentationError';
|
|
13
|
+
Object.setPrototypeOf(this, RepresentationError.prototype);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Longest value rendering included in a violation message before truncation. */
|
|
17
|
+
const MAX_RENDERED_VALUE = 80;
|
|
18
|
+
/**
|
|
19
|
+
* Render a value for a diagnostic. Routes through {@link valueToText}, which is total
|
|
20
|
+
* over `SqlValue` — deliberately NOT `JSON.stringify`, whose BigInt arm throws
|
|
21
|
+
* ("Do not know how to serialize a BigInt") on exactly the values this checker exists
|
|
22
|
+
* to catch.
|
|
23
|
+
*
|
|
24
|
+
* `valueToText` still stringifies a JSON *document*, so a document holding a value
|
|
25
|
+
* outside `JsonSqlValue` (a nested `bigint`) can throw here. That is itself
|
|
26
|
+
* representation drift, so the failure is folded into the message rather than
|
|
27
|
+
* allowed to replace the violation with a serializer error.
|
|
28
|
+
*/
|
|
29
|
+
function renderValue(value) {
|
|
30
|
+
let text;
|
|
31
|
+
try {
|
|
32
|
+
text = valueToText(value) ?? 'null';
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
36
|
+
return `<unrenderable ${jsTypeOf(value)}: ${reason}>`;
|
|
37
|
+
}
|
|
38
|
+
return text.length > MAX_RENDERED_VALUE ? `${text.slice(0, MAX_RENDERED_VALUE)}…` : text;
|
|
39
|
+
}
|
|
40
|
+
/** The JS form of a value, named the way a plugin author would recognize it. */
|
|
41
|
+
function jsTypeOf(value) {
|
|
42
|
+
if (value === null)
|
|
43
|
+
return 'null';
|
|
44
|
+
if (value instanceof Uint8Array)
|
|
45
|
+
return 'Uint8Array';
|
|
46
|
+
if (Array.isArray(value))
|
|
47
|
+
return 'array';
|
|
48
|
+
return typeof value;
|
|
49
|
+
}
|
|
50
|
+
/** The JS forms a declared type admits, for the "expected" half of a message. */
|
|
51
|
+
function admissibleForms(type) {
|
|
52
|
+
switch (type.physicalType) {
|
|
53
|
+
case PhysicalType.INTEGER: return 'a safe-integer number, or a bigint outside the safe-integer range';
|
|
54
|
+
case PhysicalType.REAL: return type.name === 'NUMERIC'
|
|
55
|
+
? 'a number, or a bigint outside the safe-integer range'
|
|
56
|
+
: 'a number';
|
|
57
|
+
case PhysicalType.TEXT: return 'a string';
|
|
58
|
+
case PhysicalType.BLOB: return 'a Uint8Array';
|
|
59
|
+
case PhysicalType.BOOLEAN: return 'a boolean';
|
|
60
|
+
case PhysicalType.OBJECT: return 'a JSON object/array, or a JSON scalar (string/number/boolean)';
|
|
61
|
+
default: return 'any value in canonical form';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* R2 for one non-null value that has already passed R1.
|
|
66
|
+
*
|
|
67
|
+
* Keyed on `physicalType` rather than the type's identity so plugin-registered types
|
|
68
|
+
* are covered too. Two arms need the type NAME as well:
|
|
69
|
+
*
|
|
70
|
+
* - **NUMERIC** shares REAL's `physicalType` (see the NOTE on `NUMERIC_TYPE` in
|
|
71
|
+
* `types/builtin-types.ts`) but its value space includes `bigint`.
|
|
72
|
+
* NOTE: matched by NAME, not by identity against the `NUMERIC_TYPE` singleton the way
|
|
73
|
+
* `isSeekKeySpaceNumeric` matches, because the surrounding switch is deliberately keyed
|
|
74
|
+
* on `physicalType` so plugin-registered types are covered. The cost is that a
|
|
75
|
+
* plugin-registered REAL-physical type *named* `NUMERIC` would silently inherit
|
|
76
|
+
* bigint admission. No such type exists in tree; if one is ever registered, give
|
|
77
|
+
* `LogicalType` an explicit "admits bigint" property and switch on that instead.
|
|
78
|
+
* - **`ANY`/NULL** (`PhysicalType.NULL`) impose no R2 constraint at all — R1 already
|
|
79
|
+
* passed, and an `ANY` position may legitimately hold any storage class.
|
|
80
|
+
*
|
|
81
|
+
* TIMESTAMP needs no special case: it declares `physicalType` INTEGER because it IS an
|
|
82
|
+
* integer instant, so it takes INTEGER's rule. The string temporals (DATE / TIME /
|
|
83
|
+
* DATETIME / TIMESPAN) declare TEXT and take TEXT's — R2 must not demand a `Temporal`
|
|
84
|
+
* object for them.
|
|
85
|
+
*/
|
|
86
|
+
function conformsToType(value, type) {
|
|
87
|
+
switch (type.physicalType) {
|
|
88
|
+
case PhysicalType.INTEGER:
|
|
89
|
+
return typeof value === 'bigint' || (typeof value === 'number' && Number.isSafeInteger(value));
|
|
90
|
+
case PhysicalType.REAL:
|
|
91
|
+
return typeof value === 'number' || (typeof value === 'bigint' && type.name === 'NUMERIC');
|
|
92
|
+
case PhysicalType.TEXT:
|
|
93
|
+
return typeof value === 'string';
|
|
94
|
+
case PhysicalType.BLOB:
|
|
95
|
+
return value instanceof Uint8Array;
|
|
96
|
+
case PhysicalType.BOOLEAN:
|
|
97
|
+
return typeof value === 'boolean';
|
|
98
|
+
case PhysicalType.OBJECT:
|
|
99
|
+
// Mirrors JSON_TYPE.validate: a native object/array (a blob is not one), or a
|
|
100
|
+
// JSON scalar — a JSON string scalar is physically a plain `string`.
|
|
101
|
+
return (typeof value === 'object' && !(value instanceof Uint8Array))
|
|
102
|
+
|| typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
103
|
+
default:
|
|
104
|
+
// PhysicalType.NULL (ANY / NULL) and any unrecognized plugin code: R1 only.
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const DOC_POINTER = 'See docs/types.md § Physical representation.';
|
|
109
|
+
/**
|
|
110
|
+
* R1 for one value: no `bigint` may hold a safe-range integer. Needs no declared type,
|
|
111
|
+
* so this is the check for `ANY` and untyped positions.
|
|
112
|
+
*
|
|
113
|
+
* `where` names the seam and the position (column / argument) and is quoted verbatim
|
|
114
|
+
* into the message — make it something a plugin author who has never read this code
|
|
115
|
+
* can act on, e.g. `` `module 'memory' scan of main.t column 2 (id)` ``.
|
|
116
|
+
*/
|
|
117
|
+
export function assertCanonicalValue(value, where) {
|
|
118
|
+
if (value === null || isCanonicalNumeric(value))
|
|
119
|
+
return;
|
|
120
|
+
throw new RepresentationError(`repr-strict: non-canonical numeric at ${where}: the bigint ${renderValue(value)} is inside the ` +
|
|
121
|
+
`safe-integer range and must be a JS number (rule R1). Return the canonical form — ` +
|
|
122
|
+
`\`canonicalizeInteger\` / \`canonicalizeSqlValue\` in util/numeric-canonical.ts do this. ${DOC_POINTER}`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* R2 for one value in a position of declared type `type` (implies R1).
|
|
126
|
+
* See {@link assertCanonicalValue} for what `where` should say.
|
|
127
|
+
*/
|
|
128
|
+
export function assertConformsToType(value, type, where) {
|
|
129
|
+
if (value === null)
|
|
130
|
+
return;
|
|
131
|
+
assertCanonicalValue(value, where);
|
|
132
|
+
if (conformsToType(value, type))
|
|
133
|
+
return;
|
|
134
|
+
throw new RepresentationError(`repr-strict: representation mismatch at ${where}: declared type ${type.name} admits ` +
|
|
135
|
+
`${admissibleForms(type)}, but the value is a JS ${jsTypeOf(value)} (${renderValue(value)}) ` +
|
|
136
|
+
`(rule R2). ${DOC_POINTER}`);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Row form of {@link assertConformsToType}. `types[i]` may be `undefined` — an ANY /
|
|
140
|
+
* untyped position, which is normal and gets R1 only, never a reported violation.
|
|
141
|
+
* A cell past the end of `types` is treated the same way.
|
|
142
|
+
*
|
|
143
|
+
* `columnNames[i]`, when supplied, is folded into the `where` text so the message
|
|
144
|
+
* names the column a plugin author declared rather than an ordinal.
|
|
145
|
+
*/
|
|
146
|
+
export function assertRowConforms(row, types, where, columnNames) {
|
|
147
|
+
for (let i = 0; i < row.length; i++) {
|
|
148
|
+
const name = columnNames?.[i];
|
|
149
|
+
const at = name ? `${where} column ${i} (${name})` : `${where} column ${i}`;
|
|
150
|
+
const type = types[i];
|
|
151
|
+
if (type === undefined) {
|
|
152
|
+
assertCanonicalValue(row[i], at);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
assertConformsToType(row[i], type, at);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=strict-representation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-representation.js","sourceRoot":"","sources":["../../../src/runtime/strict-representation.ts"],"names":[],"mappings":"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"}
|