@quereus/quereus 2.7.0 → 2.8.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/common/errors.d.ts +21 -0
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +29 -0
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +20 -7
- 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 +15 -5
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +0 -1
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +39 -36
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +5 -7
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +17 -2
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +4 -2
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/parser/ast.d.ts +1 -1
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +8 -48
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +30 -7
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/utils.d.ts +10 -1
- package/dist/src/parser/utils.d.ts.map +1 -1
- package/dist/src/parser/utils.js +23 -0
- package/dist/src/parser/utils.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +0 -1
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +12 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +60 -1
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +16 -0
- package/dist/src/planner/building/create-view.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +13 -7
- package/dist/src/planner/building/delete.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 +24 -15
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +51 -43
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +4 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +122 -21
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +6 -2
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +20 -5
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +20 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -0
- package/dist/src/planner/building/select-ordinal.js +62 -0
- package/dist/src/planner/building/select-ordinal.js.map +1 -0
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +64 -17
- 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 +34 -27
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +25 -2
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +22 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +36 -6
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +6 -2
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +5 -3
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +24 -8
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +5 -12
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- 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 +22 -26
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- 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 -2
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +7 -3
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-merge.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.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 +161 -9
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +2 -2
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +286 -7
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +12 -7
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +125 -62
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +6 -6
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +133 -76
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +61 -10
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/scalar-function.js +2 -1
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +4 -2
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +8 -5
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +2 -2
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +2 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +18 -0
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column.d.ts +7 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/function.d.ts +4 -3
- 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 +32 -6
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +165 -23
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts +4 -0
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -0
- package/dist/src/schema/rename-rewriter.js +506 -0
- package/dist/src/schema/rename-rewriter.js.map +1 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +41 -4
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/table.d.ts +65 -2
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +144 -0
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/util/async-iterator.d.ts +2 -1
- package/dist/src/util/async-iterator.d.ts.map +1 -1
- package/dist/src/util/async-iterator.js +4 -4
- package/dist/src/util/async-iterator.js.map +1 -1
- package/dist/src/util/patterns.d.ts.map +1 -1
- package/dist/src/util/patterns.js +58 -10
- package/dist/src/util/patterns.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +7 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/memory/index.d.ts +8 -0
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +11 -0
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +8 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +36 -2
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +5 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +63 -13
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +21 -2
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +6 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +93 -14
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts +27 -0
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -0
- package/dist/src/vtab/memory/utils/predicate.js +182 -0
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
2
|
-
import {
|
|
3
|
-
import { StatusCode } from '../../common/types.js';
|
|
2
|
+
import { ConstraintError, FailConflictError, RollbackConflictError } from '../../common/errors.js';
|
|
4
3
|
import { RowOpFlag } from '../../schema/table.js';
|
|
4
|
+
import { ConflictResolution } from '../../common/constants.js';
|
|
5
5
|
import { withAsyncRowContext, createRowSlot } from '../context-helpers.js';
|
|
6
6
|
import { expressionToString } from '../../emit/ast-stringify.js';
|
|
7
7
|
import { composeCombinedDescriptor } from '../descriptor-helpers.js';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the effective conflict action for a single failure.
|
|
10
|
+
*
|
|
11
|
+
* Precedence: statement-level OR clause > per-constraint default > ABORT.
|
|
12
|
+
*/
|
|
13
|
+
function pickAction(stmtOR, constraintDefault) {
|
|
14
|
+
return stmtOR ?? constraintDefault ?? ConflictResolution.ABORT;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Throws an appropriate ConstraintError subclass based on the effective
|
|
18
|
+
* conflict action. ABORT/REPLACE/IGNORE callers must not reach this — IGNORE
|
|
19
|
+
* is handled by skipping the row, REPLACE by substitution / passthrough, and
|
|
20
|
+
* ABORT throws a plain ConstraintError.
|
|
21
|
+
*/
|
|
22
|
+
function throwForAction(action, message) {
|
|
23
|
+
if (action === ConflictResolution.FAIL) {
|
|
24
|
+
throw new FailConflictError(message);
|
|
25
|
+
}
|
|
26
|
+
if (action === ConflictResolution.ROLLBACK) {
|
|
27
|
+
throw new RollbackConflictError(message);
|
|
28
|
+
}
|
|
29
|
+
throw new ConstraintError(message);
|
|
30
|
+
}
|
|
8
31
|
export function emitConstraintCheck(plan, ctx) {
|
|
9
32
|
// Get the table schema to access constraints
|
|
10
33
|
const tableSchema = plan.table.tableSchema;
|
|
@@ -14,6 +37,7 @@ export function emitConstraintCheck(plan, ctx) {
|
|
|
14
37
|
const mutationContextValues = plan.mutationContextValues;
|
|
15
38
|
const contextAttributes = plan.contextAttributes;
|
|
16
39
|
const contextDescriptor = plan.contextDescriptor;
|
|
40
|
+
const stmtOR = plan.onConflict;
|
|
17
41
|
// Emit mutation context value evaluators if present
|
|
18
42
|
const contextEvaluatorInstructions = [];
|
|
19
43
|
if (mutationContextValues && contextAttributes) {
|
|
@@ -26,6 +50,9 @@ export function emitConstraintCheck(plan, ctx) {
|
|
|
26
50
|
}
|
|
27
51
|
// Emit evaluator instructions for each pre-built constraint expression
|
|
28
52
|
const checkEvaluators = plan.constraintChecks.map(check => emitCallFromPlan(check.expression, ctx));
|
|
53
|
+
// Emit evaluators for NOT NULL DEFAULT substitution (used by REPLACE).
|
|
54
|
+
const notNullDefaultPlans = plan.notNullDefaults ?? [];
|
|
55
|
+
const notNullDefaultInstructions = notNullDefaultPlans.map(d => emitCallFromPlan(d.defaultNode, ctx));
|
|
29
56
|
const constraintMetadata = plan.constraintChecks.map((check, idx) => {
|
|
30
57
|
const evaluatorInstruction = checkEvaluators[idx];
|
|
31
58
|
const constraintName = check.constraint.name ?? generateDefaultConstraintName(tableSchema, check.constraint);
|
|
@@ -39,57 +66,58 @@ export function emitConstraintCheck(plan, ctx) {
|
|
|
39
66
|
shouldDefer: Boolean(check.deferrable || check.initiallyDeferred || check.needsDeferred),
|
|
40
67
|
baseTable: `${tableSchema.schemaName}.${tableSchema.name}`,
|
|
41
68
|
contextRow: undefined,
|
|
42
|
-
contextDescriptor
|
|
69
|
+
contextDescriptor,
|
|
70
|
+
kind: check.kind ?? 'check',
|
|
43
71
|
};
|
|
44
72
|
});
|
|
45
73
|
async function* run(rctx, inputRows, ...evaluatorFunctions) {
|
|
46
74
|
if (!inputRows) {
|
|
47
75
|
return;
|
|
48
76
|
}
|
|
49
|
-
//
|
|
77
|
+
// Split: first contextEvaluatorInstructions are context evaluators, then constraint
|
|
78
|
+
// evaluators, then NOT NULL DEFAULT evaluators.
|
|
79
|
+
const numContextEvaluators = contextEvaluatorInstructions.length;
|
|
80
|
+
const numConstraintEvaluators = constraintMetadata.length;
|
|
50
81
|
let contextRow;
|
|
51
82
|
let contextSlot;
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
const contextEvalFunctions = evaluatorFunctions.slice(0, contextEvaluatorInstructions.length);
|
|
55
|
-
const constraintEvalFunctions = evaluatorFunctions.slice(contextEvaluatorInstructions.length);
|
|
56
|
-
// Evaluate all context values
|
|
83
|
+
if (numContextEvaluators > 0 && contextDescriptor) {
|
|
84
|
+
const contextEvalFunctions = evaluatorFunctions.slice(0, numContextEvaluators);
|
|
57
85
|
contextRow = [];
|
|
58
86
|
for (const contextEvaluator of contextEvalFunctions) {
|
|
59
87
|
const value = await contextEvaluator(rctx);
|
|
60
88
|
contextRow.push(value);
|
|
61
89
|
}
|
|
62
|
-
// Store context row in metadata for deferred constraints
|
|
63
90
|
constraintMetadata.forEach(meta => {
|
|
64
91
|
meta.contextRow = contextRow;
|
|
65
92
|
});
|
|
66
|
-
// Create a row slot for the mutation context that persists for the whole statement
|
|
67
93
|
contextSlot = createRowSlot(rctx, contextDescriptor);
|
|
68
94
|
contextSlot.set(contextRow);
|
|
69
|
-
// Use constraint evaluators for the rest of the function
|
|
70
|
-
evaluatorFunctions = constraintEvalFunctions;
|
|
71
95
|
}
|
|
96
|
+
const constraintEvalFunctions = evaluatorFunctions.slice(numContextEvaluators, numContextEvaluators + numConstraintEvaluators);
|
|
97
|
+
const defaultEvalFunctions = evaluatorFunctions.slice(numContextEvaluators + numConstraintEvaluators);
|
|
98
|
+
const defaultsRuntime = notNullDefaultPlans.map((d, i) => ({
|
|
99
|
+
columnIndex: d.columnIndex,
|
|
100
|
+
evaluator: defaultEvalFunctions[i],
|
|
101
|
+
}));
|
|
72
102
|
// Pre-compute the combined descriptor (constant across rows)
|
|
73
103
|
const combinedDescriptor = contextDescriptor && contextRow
|
|
74
104
|
? composeCombinedDescriptor(contextDescriptor, flatRowDescriptor)
|
|
75
105
|
: flatRowDescriptor;
|
|
76
106
|
try {
|
|
77
107
|
for await (const inputRow of inputRows) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const result = await withAsyncRowContext(rctx, combinedDescriptor, () => combinedRow, async () => {
|
|
82
|
-
// Check all constraints that apply to this operation
|
|
83
|
-
await checkConstraints(rctx, plan, tableSchema, flatRow, constraintMetadata, evaluatorFunctions);
|
|
84
|
-
// If all constraints pass, yield the flat row for downstream processing
|
|
85
|
-
// All downstream operations (INSERT executor, DELETE executor, RETURNING) expect flat rows
|
|
86
|
-
return flatRow;
|
|
108
|
+
let flatRow = inputRow;
|
|
109
|
+
const evaluation = await withAsyncRowContext(rctx, combinedDescriptor, () => contextRow ? [...contextRow, ...flatRow] : flatRow, async () => {
|
|
110
|
+
return await checkConstraints(rctx, plan, tableSchema, flatRow, constraintMetadata, constraintEvalFunctions, stmtOR, defaultsRuntime);
|
|
87
111
|
});
|
|
88
|
-
|
|
112
|
+
if (evaluation.skip)
|
|
113
|
+
continue;
|
|
114
|
+
if (evaluation.replacedRow) {
|
|
115
|
+
flatRow = evaluation.replacedRow;
|
|
116
|
+
}
|
|
117
|
+
yield flatRow;
|
|
89
118
|
}
|
|
90
119
|
}
|
|
91
120
|
finally {
|
|
92
|
-
// Clean up context slot if we created one
|
|
93
121
|
if (contextSlot) {
|
|
94
122
|
contextSlot.close();
|
|
95
123
|
}
|
|
@@ -98,68 +126,103 @@ export function emitConstraintCheck(plan, ctx) {
|
|
|
98
126
|
// Emit the source instruction
|
|
99
127
|
const sourceInstruction = emitPlanNode(plan.source, ctx);
|
|
100
128
|
return {
|
|
101
|
-
params: [sourceInstruction, ...contextEvaluatorInstructions, ...checkEvaluators],
|
|
129
|
+
params: [sourceInstruction, ...contextEvaluatorInstructions, ...checkEvaluators, ...notNullDefaultInstructions],
|
|
102
130
|
run: run,
|
|
103
|
-
note: `constraintCheck(${plan.operation}, ${contextEvaluatorInstructions.length} ctx, ${plan.constraintChecks.length} checks)`
|
|
131
|
+
note: `constraintCheck(${plan.operation}, ${contextEvaluatorInstructions.length} ctx, ${plan.constraintChecks.length} checks, ${notNullDefaultInstructions.length} defaults)`
|
|
104
132
|
};
|
|
105
133
|
}
|
|
106
|
-
async function checkConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions) {
|
|
107
|
-
//
|
|
108
|
-
await
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
134
|
+
async function checkConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions, stmtOR, notNullDefaults) {
|
|
135
|
+
// NOT NULL constraints with possible REPLACE-DEFAULT substitution.
|
|
136
|
+
const nnResult = await checkNotNullConstraints(rctx, plan, tableSchema, row, stmtOR, notNullDefaults);
|
|
137
|
+
if (nnResult.skip)
|
|
138
|
+
return { skip: true };
|
|
139
|
+
if (nnResult.replacedRow)
|
|
140
|
+
row = nnResult.replacedRow;
|
|
141
|
+
// CHECK constraints (and synthetic FK existence checks built as RowConstraintSchema).
|
|
142
|
+
const ckResult = await checkCheckConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions, stmtOR);
|
|
143
|
+
if (ckResult.skip)
|
|
144
|
+
return { skip: true };
|
|
145
|
+
return { skip: false, replacedRow: nnResult.replacedRow };
|
|
113
146
|
}
|
|
114
|
-
async function checkNotNullConstraints(rctx, plan, tableSchema, flatRow) {
|
|
115
|
-
// For INSERT operations, check NOT NULL on NEW values
|
|
116
|
-
// For UPDATE operations, check NOT NULL on NEW values
|
|
117
|
-
// DELETE operations don't need NOT NULL checks
|
|
147
|
+
async function checkNotNullConstraints(rctx, plan, tableSchema, flatRow, stmtOR, notNullDefaults) {
|
|
118
148
|
if (plan.operation === RowOpFlag.DELETE) {
|
|
119
|
-
return;
|
|
149
|
+
return { skip: false };
|
|
120
150
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
151
|
+
if (!plan.newRowDescriptor) {
|
|
152
|
+
return { skip: false };
|
|
153
|
+
}
|
|
154
|
+
const numCols = tableSchema.columns.length;
|
|
155
|
+
let mutableRow;
|
|
156
|
+
for (let i = 0; i < numCols; i++) {
|
|
157
|
+
const column = tableSchema.columns[i];
|
|
158
|
+
if (!column.notNull)
|
|
159
|
+
continue;
|
|
160
|
+
const newValueIndex = numCols + i; // NEW section: n..2n-1
|
|
161
|
+
const value = (mutableRow ?? flatRow)[newValueIndex];
|
|
162
|
+
if (value !== null && value !== undefined)
|
|
163
|
+
continue;
|
|
164
|
+
const action = pickAction(stmtOR, column.defaultConflict);
|
|
165
|
+
const message = `NOT NULL constraint failed: ${tableSchema.name}.${column.name}`;
|
|
166
|
+
if (action === ConflictResolution.IGNORE) {
|
|
167
|
+
return { skip: true };
|
|
168
|
+
}
|
|
169
|
+
if (action === ConflictResolution.REPLACE) {
|
|
170
|
+
// Try to substitute the column's DEFAULT.
|
|
171
|
+
const defaultEntry = notNullDefaults.find(d => d.columnIndex === i);
|
|
172
|
+
if (!defaultEntry) {
|
|
173
|
+
// No DEFAULT available — REPLACE cannot recover.
|
|
174
|
+
throw new ConstraintError(message);
|
|
132
175
|
}
|
|
176
|
+
const defaultValue = await defaultEntry.evaluator(rctx);
|
|
177
|
+
if (defaultValue === null || defaultValue === undefined) {
|
|
178
|
+
// DEFAULT itself is NULL — substitution does not satisfy NOT NULL.
|
|
179
|
+
throw new ConstraintError(message);
|
|
180
|
+
}
|
|
181
|
+
if (!mutableRow)
|
|
182
|
+
mutableRow = [...flatRow];
|
|
183
|
+
mutableRow[newValueIndex] = defaultValue;
|
|
184
|
+
continue;
|
|
133
185
|
}
|
|
186
|
+
// ABORT / FAIL / ROLLBACK
|
|
187
|
+
throwForAction(action, message);
|
|
134
188
|
}
|
|
189
|
+
return { skip: false, replacedRow: mutableRow };
|
|
135
190
|
}
|
|
136
|
-
async function
|
|
137
|
-
// Primary Key constraints are enforced at the VTable level for now
|
|
138
|
-
// This is simpler and more efficient than trying to implement it at the engine level
|
|
139
|
-
// since the VTable has direct access to the current table state
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
async function checkCheckConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions) {
|
|
143
|
-
// Evaluate each CHECK constraint using pre-built evaluators
|
|
191
|
+
async function checkCheckConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions, stmtOR) {
|
|
144
192
|
for (let i = 0; i < constraintMetadata.length; i++) {
|
|
145
193
|
const metadata = constraintMetadata[i];
|
|
146
194
|
const evaluator = evaluatorFunctions[i] ?? metadata.evaluator;
|
|
147
|
-
|
|
195
|
+
// Resolve effective action up front; non-default actions (IGNORE/REPLACE/FAIL/ROLLBACK)
|
|
196
|
+
// must be applied at row time, so we cannot let those defer to commit.
|
|
197
|
+
const effectiveAction = pickAction(stmtOR, metadata.schema.defaultConflict);
|
|
198
|
+
const mustEvaluateNow = effectiveAction !== ConflictResolution.ABORT;
|
|
199
|
+
if (metadata.shouldDefer && !mustEvaluateNow) {
|
|
148
200
|
const activeConnectionId = rctx.activeConnection?.connectionId;
|
|
149
201
|
rctx.db._queueDeferredConstraintRow(metadata.baseTable, metadata.constraintName, row.slice(), metadata.flatRowDescriptor, evaluator, activeConnectionId, metadata.contextRow, metadata.contextDescriptor);
|
|
150
202
|
continue;
|
|
151
203
|
}
|
|
152
204
|
const result = await evaluator(rctx);
|
|
153
|
-
// CHECK
|
|
154
|
-
// It fails only if result is false or 0 (SQLite-style numeric boolean)
|
|
205
|
+
// CHECK passes if truthy or NULL; fails on false / 0 (SQLite numeric boolean).
|
|
155
206
|
if (result === false || result === 0) {
|
|
156
|
-
// Include constraint expression in error message for better debugging
|
|
157
207
|
const exprHint = metadata.constraintExpr.length <= 60
|
|
158
208
|
? ` (${metadata.constraintExpr})`
|
|
159
209
|
: '';
|
|
160
|
-
|
|
210
|
+
// Both engine-level CHECK and synthetic FK existence checks share the
|
|
211
|
+
// same "CHECK constraint failed" prefix for backward compatibility with
|
|
212
|
+
// existing assertions; downstream consumers identify FK by name.
|
|
213
|
+
const baseMessage = `CHECK constraint failed: ${metadata.constraintName}${exprHint}`;
|
|
214
|
+
if (effectiveAction === ConflictResolution.IGNORE) {
|
|
215
|
+
return { skip: true };
|
|
216
|
+
}
|
|
217
|
+
// REPLACE does NOT mask CHECK / FK violations — fall through to abort.
|
|
218
|
+
// (SQLite's OR REPLACE only relaxes UNIQUE/PK and NOT-NULL; CHECK still aborts.)
|
|
219
|
+
if (effectiveAction === ConflictResolution.REPLACE) {
|
|
220
|
+
throw new ConstraintError(baseMessage);
|
|
221
|
+
}
|
|
222
|
+
throwForAction(effectiveAction, baseMessage);
|
|
161
223
|
}
|
|
162
224
|
}
|
|
225
|
+
return { skip: false };
|
|
163
226
|
}
|
|
164
227
|
function generateDefaultConstraintName(tableSchema, constraint) {
|
|
165
228
|
// Find the index of this constraint in the original array to get the correct constraint number
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-check.js","sourceRoot":"","sources":["../../../../src/runtime/emit/constraint-check.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"constraint-check.js","sourceRoot":"","sources":["../../../../src/runtime/emit/constraint-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-assertion.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/create-assertion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"create-assertion.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/create-assertion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CA+EjG"}
|
|
@@ -31,14 +31,14 @@ export function emitCreateAssertion(plan, _ctx) {
|
|
|
31
31
|
const planNode = rctx.db.getPlan(violationSql);
|
|
32
32
|
const deps = new Map();
|
|
33
33
|
(function collect(node) {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
for (const child of
|
|
34
|
+
const candidate = node;
|
|
35
|
+
if (candidate && typeof candidate.getRelations === 'function') {
|
|
36
|
+
for (const child of candidate.getRelations())
|
|
37
37
|
collect(child);
|
|
38
38
|
}
|
|
39
|
-
if (
|
|
40
|
-
const base = `${
|
|
41
|
-
const relationKey = `${base}#${
|
|
39
|
+
if (candidate?.tableSchema?.name && candidate?.id !== undefined) {
|
|
40
|
+
const base = `${candidate.tableSchema.schemaName}.${candidate.tableSchema.name}`.toLowerCase();
|
|
41
|
+
const relationKey = `${base}#${String(candidate.id)}`;
|
|
42
42
|
if (!deps.has(relationKey))
|
|
43
43
|
deps.set(relationKey, { relationKey, base });
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-assertion.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-assertion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAY,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,GAAG,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,IAAyB,EAAE,IAAqB;IAEnF,KAAK,UAAU,GAAG,CAAC,IAAoB;QACtC,wEAAwE;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEnC,uDAAuD;QACvD,sEAAsE;QACtE,6DAA6D;QAC7D,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzD,YAAY,GAAG,uBAAuB,OAAO,GAAG,CAAC;QAClD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,IAAI,YAAY,CACrB,4BAA4B,IAAI,CAAC,IAAI,8CAA8C,EACnF,UAAU,CAAC,KAAK,EAChB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAClC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,eAAe,GAA6B;YACjD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY;YACZ,UAAU,EAAE,IAAI,EAAE,4CAA4C;YAC9D,iBAAiB,EAAE,IAAI;YACvB,eAAe,EAAE,EAAE;SACnB,CAAC;QAEF,4EAA4E;QAC5E,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmC,CAAC;YACxD,CAAC,SAAS,OAAO,CAAC,IAAa;gBAC9B,MAAM,
|
|
1
|
+
{"version":3,"file":"create-assertion.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dml-executor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/dml-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AAM5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAuD9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"dml-executor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/dml-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AAM5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAuD9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAsjBxF"}
|