@quereus/quereus 0.6.3 → 0.6.5
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/README.md +20 -2
- package/dist/src/common/logger.d.ts +59 -0
- package/dist/src/common/logger.d.ts.map +1 -1
- package/dist/src/common/logger.js +68 -0
- package/dist/src/common/logger.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +10 -5
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/index.d.ts +5 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +4 -0
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +2 -1
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +4 -1
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +4 -2
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +8 -2
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +11 -2
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/validation/determinism-validator.d.ts +29 -0
- package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -0
- package/dist/src/planner/validation/determinism-validator.js +47 -0
- package/dist/src/planner/validation/determinism-validator.js.map +1 -0
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +3 -0
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +84 -8
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/types.d.ts +1 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +41 -0
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/util/ast-stringify.d.ts.map +1 -1
- package/dist/src/util/ast-stringify.js +14 -1
- package/dist/src/util/ast-stringify.js.map +1 -1
- package/dist/src/util/mutation-statement.d.ts +16 -0
- package/dist/src/util/mutation-statement.d.ts.map +1 -0
- package/dist/src/util/mutation-statement.js +92 -0
- package/dist/src/util/mutation-statement.js.map +1 -0
- package/dist/src/util/plugin-helper.d.ts +45 -0
- package/dist/src/util/plugin-helper.d.ts.map +1 -0
- package/dist/src/util/plugin-helper.js +85 -0
- package/dist/src/util/plugin-helper.js.map +1 -0
- package/dist/src/util/sql-literal.d.ts +11 -0
- package/dist/src/util/sql-literal.d.ts.map +1 -0
- package/dist/src/util/sql-literal.js +18 -0
- package/dist/src/util/sql-literal.js.map +1 -0
- package/dist/src/vtab/memory/table.d.ts +1 -2
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +3 -3
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/table.d.ts +23 -5
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js +6 -0
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +4 -2
- package/src/common/logger.ts +75 -1
- package/src/func/builtins/datetime.ts +10 -5
- package/src/index.ts +13 -16
- package/src/planner/building/constraint-builder.ts +5 -0
- package/src/planner/building/delete.ts +5 -1
- package/src/planner/building/insert.ts +8 -1
- package/src/planner/building/update.ts +10 -2
- package/src/planner/nodes/dml-executor-node.ts +8 -2
- package/src/planner/validation/determinism-validator.ts +76 -0
- package/src/runtime/emit/add-constraint.ts +3 -0
- package/src/runtime/emit/dml-executor.ts +105 -9
- package/src/runtime/types.ts +3 -0
- package/src/schema/manager.ts +45 -0
- package/src/util/ast-stringify.ts +24 -1
- package/src/util/hash.ts +90 -90
- package/src/util/mutation-statement.ts +129 -0
- package/src/util/plugin-helper.ts +110 -0
- package/src/util/sql-literal.ts +22 -0
- package/src/vtab/memory/table.ts +3 -8
- package/src/vtab/table.ts +25 -10
- package/dist/src/config/loader.d.ts +0 -41
- package/dist/src/config/loader.d.ts.map +0 -1
- package/dist/src/config/loader.js +0 -102
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/planner/nodes/physical-access-nodes.d.ts +0 -83
- package/dist/src/planner/nodes/physical-access-nodes.d.ts.map +0 -1
- package/dist/src/planner/nodes/physical-access-nodes.js +0 -226
- package/dist/src/planner/nodes/physical-access-nodes.js.map +0 -1
- package/dist/src/planner/nodes/scan.d.ts +0 -27
- package/dist/src/planner/nodes/scan.d.ts.map +0 -1
- package/dist/src/planner/nodes/scan.js +0 -78
- package/dist/src/planner/nodes/scan.js.map +0 -1
- package/dist/src/planner/nodes/update-executor-node.d.ts +0 -24
- package/dist/src/planner/nodes/update-executor-node.d.ts.map +0 -1
- package/dist/src/planner/nodes/update-executor-node.js +0 -57
- package/dist/src/planner/nodes/update-executor-node.js.map +0 -1
- package/dist/src/planner/physical-utils.d.ts +0 -36
- package/dist/src/planner/physical-utils.d.ts.map +0 -1
- package/dist/src/planner/physical-utils.js +0 -122
- package/dist/src/planner/physical-utils.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-filter-optimization.js +0 -49
- package/dist/src/planner/rules/physical/rule-filter-optimization.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-mark-physical.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-mark-physical.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-mark-physical.js +0 -29
- package/dist/src/planner/rules/physical/rule-mark-physical.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-project-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-project-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-project-optimization.js +0 -44
- package/dist/src/planner/rules/physical/rule-project-optimization.js.map +0 -1
- package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts +0 -11
- package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts.map +0 -1
- package/dist/src/planner/rules/physical/rule-sort-optimization.js +0 -53
- package/dist/src/planner/rules/physical/rule-sort-optimization.js.map +0 -1
- package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts +0 -11
- package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts.map +0 -1
- package/dist/src/planner/rules/rewrite/rule-constant-folding.js +0 -59
- package/dist/src/planner/rules/rewrite/rule-constant-folding.js.map +0 -1
- package/dist/src/planner/util/deferred-constraint.d.ts +0 -14
- package/dist/src/planner/util/deferred-constraint.d.ts.map +0 -1
- package/dist/src/planner/util/deferred-constraint.js +0 -85
- package/dist/src/planner/util/deferred-constraint.js.map +0 -1
- package/dist/src/runtime/emit/table-reference.d.ts +0 -5
- package/dist/src/runtime/emit/table-reference.d.ts.map +0 -1
- package/dist/src/runtime/emit/table-reference.js +0 -67
- package/dist/src/runtime/emit/table-reference.js.map +0 -1
- package/dist/src/runtime/emit/update-executor.d.ts +0 -5
- package/dist/src/runtime/emit/update-executor.d.ts.map +0 -1
- package/dist/src/runtime/emit/update-executor.js +0 -54
- package/dist/src/runtime/emit/update-executor.js.map +0 -1
- package/dist/src/util/plugin-loader.d.ts +0 -52
- package/dist/src/util/plugin-loader.d.ts.map +0 -1
- package/dist/src/util/plugin-loader.js +0 -307
- package/dist/src/util/plugin-loader.js.map +0 -1
- package/src/config/loader.ts +0 -140
- package/src/util/plugin-loader.ts +0 -387
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { expressionToString } from './ast-stringify.js';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a SqlValue to its SQL literal string representation.
|
|
4
|
+
* This is used for mutation logging to create deterministic, replayable SQL statements.
|
|
5
|
+
* Uses the existing expressionToString function for consistency.
|
|
6
|
+
*
|
|
7
|
+
* @param value The value to convert to a SQL literal
|
|
8
|
+
* @returns SQL literal string representation
|
|
9
|
+
*/
|
|
10
|
+
export function sqlValueToLiteral(value) {
|
|
11
|
+
// Create a literal expression AST node and use expressionToString
|
|
12
|
+
const literalExpr = {
|
|
13
|
+
type: 'literal',
|
|
14
|
+
value: value
|
|
15
|
+
};
|
|
16
|
+
return expressionToString(literalExpr);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=sql-literal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-literal.js","sourceRoot":"","sources":["../../../src/util/sql-literal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAChD,kEAAkE;IAClE,MAAM,WAAW,GAAoB;QACpC,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK;KACZ,CAAC;IAEF,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -5,7 +5,6 @@ import { type IndexSchema, type TableSchema } from '../../schema/table.js';
|
|
|
5
5
|
import type { MemoryTableConnection } from './layer/connection.js';
|
|
6
6
|
import type { FilterInfo } from '../filter-info.js';
|
|
7
7
|
import type { VirtualTableConnection } from '../connection.js';
|
|
8
|
-
import type { ConflictResolution } from '../../common/constants.js';
|
|
9
8
|
/**
|
|
10
9
|
* Represents a connection-specific instance of an in-memory table using the layer-based MVCC model.
|
|
11
10
|
* This class acts as a thin wrapper around the shared MemoryTableManager,
|
|
@@ -26,7 +25,7 @@ export declare class MemoryTable extends VirtualTable {
|
|
|
26
25
|
getConnection(): VirtualTableConnection | undefined;
|
|
27
26
|
query(filterInfo: FilterInfo): AsyncIterable<Row>;
|
|
28
27
|
/** Performs mutation through the connection's transaction layer */
|
|
29
|
-
update(
|
|
28
|
+
update(args: import('../table.js').UpdateArgs): Promise<Row | undefined>;
|
|
30
29
|
/** Begins a transaction for this connection */
|
|
31
30
|
begin(): Promise<void>;
|
|
32
31
|
/** Commits this connection's transaction */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../src/vtab/memory/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../src/vtab/memory/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAM/D;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAuB5C,oDAAoD;IACpD,SAAS,IAAI,WAAW,GAAG,SAAS;IAKpC,8CAA8C;IAC9C,UAAU,IAAI,OAAO;IAKrB,2DAA2D;YAC7C,gBAAgB;IAsB9B,kFAAkF;IAClF,aAAa,CAAC,gBAAgB,EAAE,qBAAqB,GAAG,IAAI;IAK5D,mEAAmE;IACnE,gBAAgB,IAAI,sBAAsB;IAK1C,yEAAyE;IACzE,aAAa,IAAI,sBAAsB,GAAG,SAAS;IAQ5C,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC;IAoBxD,mEAAmE;IAC7D,MAAM,CAAC,IAAI,EAAE,OAAO,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAO9E,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,4CAA4C;IACtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B,+CAA+C;IACzC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,mDAAmD;IAC7C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,6CAA6C;IACvC,WAAW,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC9D,4DAA4D;IACtD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOjD"}
|
|
@@ -95,11 +95,11 @@ export class MemoryTable extends VirtualTable {
|
|
|
95
95
|
}
|
|
96
96
|
// Note: getBestAccessPlan is handled by the MemoryTableModule, not the table instance.
|
|
97
97
|
/** Performs mutation through the connection's transaction layer */
|
|
98
|
-
async update(
|
|
98
|
+
async update(args) {
|
|
99
99
|
const conn = await this.ensureConnection();
|
|
100
100
|
// Delegate mutation to the manager.
|
|
101
|
-
//
|
|
102
|
-
return this.manager.performMutation(conn, operation, values, oldKeyValues, onConflict);
|
|
101
|
+
// Note: mutationStatement is ignored by memory table (could be logged if needed)
|
|
102
|
+
return this.manager.performMutation(conn, args.operation, args.values, args.oldKeyValues, args.onConflict);
|
|
103
103
|
}
|
|
104
104
|
/** Begins a transaction for this connection */
|
|
105
105
|
async begin() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../../src/vtab/memory/table.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../../src/vtab/memory/table.ts"],"names":[],"mappings":"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"}
|
package/dist/src/vtab/table.d.ts
CHANGED
|
@@ -8,6 +8,21 @@ import type { RowOp } from '../common/types.js';
|
|
|
8
8
|
import type { ConflictResolution } from '../common/constants.js';
|
|
9
9
|
import type { VirtualTableConnection } from './connection.js';
|
|
10
10
|
import type { PlanNode } from '../planner/nodes/plan-node.js';
|
|
11
|
+
/**
|
|
12
|
+
* Arguments passed to VirtualTable.update() method.
|
|
13
|
+
*/
|
|
14
|
+
export interface UpdateArgs {
|
|
15
|
+
/** The operation to perform (insert, update, delete) */
|
|
16
|
+
operation: RowOp;
|
|
17
|
+
/** For INSERT/UPDATE, the values to insert/update. For DELETE, undefined */
|
|
18
|
+
values: Row | undefined;
|
|
19
|
+
/** For UPDATE/DELETE, the old key values of the row to modify. Undefined for INSERT */
|
|
20
|
+
oldKeyValues?: Row;
|
|
21
|
+
/** Conflict resolution mode (defaults to ABORT if unspecified) */
|
|
22
|
+
onConflict?: ConflictResolution;
|
|
23
|
+
/** Optional: Deterministic SQL statement that reproduces this mutation (if logMutations is enabled) */
|
|
24
|
+
mutationStatement?: string;
|
|
25
|
+
}
|
|
11
26
|
/**
|
|
12
27
|
* Base class representing a virtual table instance.
|
|
13
28
|
* Module implementations should subclass this to provide specific table behavior.
|
|
@@ -19,6 +34,12 @@ export declare abstract class VirtualTable {
|
|
|
19
34
|
readonly schemaName: string;
|
|
20
35
|
errorMessage?: string;
|
|
21
36
|
tableSchema?: TableSchema;
|
|
37
|
+
/**
|
|
38
|
+
* When true, the update() method will receive a mutationStatement parameter
|
|
39
|
+
* containing a deterministic SQL statement that reproduces the mutation.
|
|
40
|
+
* This enables replication, audit logging, and change data capture.
|
|
41
|
+
*/
|
|
42
|
+
wantStatements?: boolean;
|
|
22
43
|
constructor(db: Database, module: AnyVirtualTableModule, schemaName: string, tableName: string);
|
|
23
44
|
/**
|
|
24
45
|
* Sets an error message for the VTable
|
|
@@ -51,14 +72,11 @@ export declare abstract class VirtualTable {
|
|
|
51
72
|
executePlan?(db: Database, plan: PlanNode, ctx?: unknown): AsyncIterable<Row>;
|
|
52
73
|
/**
|
|
53
74
|
* Performs an INSERT, UPDATE, or DELETE operation
|
|
54
|
-
* @param
|
|
55
|
-
* @param values For INSERT/UPDATE, the values to insert/update. For DELETE, undefined
|
|
56
|
-
* @param oldKeyValues For UPDATE/DELETE, the old key values of the row to modify. Undefined for INSERT
|
|
57
|
-
* @param onConflict Conflict resolution mode (defaults to ABORT if unspecified)
|
|
75
|
+
* @param args Arguments object containing operation details and optional mutation statement
|
|
58
76
|
* @returns new row for INSERT/UPDATE, undefined for DELETE
|
|
59
77
|
* @throws QuereusError or ConstraintError on failure
|
|
60
78
|
*/
|
|
61
|
-
abstract update(
|
|
79
|
+
abstract update(args: UpdateArgs): Promise<Row | undefined>;
|
|
62
80
|
/**
|
|
63
81
|
* (Optional) Creates a new connection for transaction support.
|
|
64
82
|
* If implemented, this enables proper transaction isolation for this table.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/vtab/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE9D;;;GAGG;AACH,8BAAsB,YAAY;IACjC,SAAgB,MAAM,EAAE,qBAAqB,CAAC;IAC9C,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/vtab/table.ts"],"names":[],"mappings":"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"}
|
package/dist/src/vtab/table.js
CHANGED
|
@@ -9,6 +9,12 @@ export class VirtualTable {
|
|
|
9
9
|
schemaName;
|
|
10
10
|
errorMessage;
|
|
11
11
|
tableSchema;
|
|
12
|
+
/**
|
|
13
|
+
* When true, the update() method will receive a mutationStatement parameter
|
|
14
|
+
* containing a deterministic SQL statement that reproduces the mutation.
|
|
15
|
+
* This enables replication, audit logging, and change data capture.
|
|
16
|
+
*/
|
|
17
|
+
wantStatements;
|
|
12
18
|
constructor(db, module, schemaName, tableName) {
|
|
13
19
|
this.db = db;
|
|
14
20
|
this.module = module;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/vtab/table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/vtab/table.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,MAAM,OAAgB,YAAY;IACjB,MAAM,CAAwB;IAC9B,EAAE,CAAW;IACb,SAAS,CAAS;IAClB,UAAU,CAAS;IAC5B,YAAY,CAAU;IACtB,WAAW,CAAe;IAEjC;;;;OAIG;IACI,cAAc,CAAW;IAEhC,YAAY,EAAY,EAAE,MAA6B,EAAE,UAAkB,EAAE,SAAiB;QAC7F,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACO,eAAe,CAAC,OAA2B;QACpD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC7B,CAAC;CAqHD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/quereus",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Federated SQL query processor",
|
|
6
6
|
"publisher": "Got Choices Foundation",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
|
-
"clean": "
|
|
28
|
+
"clean": "rimraf dist",
|
|
29
29
|
"doc": "npx typedoc -out doc src",
|
|
30
30
|
"build": "tsc",
|
|
31
31
|
"lint": "eslint src/**/*.ts test/**/*.ts",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"typecheck": "tsc --noEmit"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
+
"@quereus/plugin-loader": "*",
|
|
40
41
|
"@types/chai": "^5.2.2",
|
|
41
42
|
"@types/debug": "^4.1.12",
|
|
42
43
|
"@types/mocha": "^10.0.10",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"eslint-plugin-import": "^2.31.0",
|
|
49
50
|
"fast-check": "^4.1.1",
|
|
50
51
|
"mocha": "^11.5.0",
|
|
52
|
+
"rimraf": "^6.1.2",
|
|
51
53
|
"ts-node": "^10.9.2",
|
|
52
54
|
"tsc-alias": "^1.8.16",
|
|
53
55
|
"typedoc": "^0.28.5",
|
package/src/common/logger.ts
CHANGED
|
@@ -19,5 +19,79 @@ const BASE_NAMESPACE = 'quereus';
|
|
|
19
19
|
* @returns A debug instance.
|
|
20
20
|
*/
|
|
21
21
|
export function createLogger(subNamespace: string): debug.Debugger {
|
|
22
|
-
|
|
22
|
+
return debug(`${BASE_NAMESPACE}:${subNamespace}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Enable Quereus debug logging programmatically.
|
|
27
|
+
*
|
|
28
|
+
* This is particularly useful in environments like React Native where
|
|
29
|
+
* environment variables are not available at runtime.
|
|
30
|
+
*
|
|
31
|
+
* @param pattern - Debug pattern to enable (default: 'quereus:*')
|
|
32
|
+
* Examples:
|
|
33
|
+
* - 'quereus:*' - all Quereus logs
|
|
34
|
+
* - 'quereus:vtab:*' - virtual table operations
|
|
35
|
+
* - 'quereus:vtab:memory' - memory table operations only
|
|
36
|
+
* - 'quereus:planner' - query planner logs
|
|
37
|
+
* - 'quereus:runtime' - VDBE execution (very verbose)
|
|
38
|
+
* - 'quereus:*,-quereus:runtime' - all except verbose runtime
|
|
39
|
+
* @param logFn - Optional custom log function. Defaults to console.log.
|
|
40
|
+
* Useful in environments where console.debug may be filtered.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* import { enableLogging } from '@quereus/quereus';
|
|
45
|
+
*
|
|
46
|
+
* // Enable all Quereus logs
|
|
47
|
+
* enableLogging();
|
|
48
|
+
*
|
|
49
|
+
* // Enable only memory table logs
|
|
50
|
+
* enableLogging('quereus:vtab:memory');
|
|
51
|
+
*
|
|
52
|
+
* // Enable all logs with custom output (e.g., React Native)
|
|
53
|
+
* enableLogging('quereus:*', console.log.bind(console));
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function enableLogging(
|
|
57
|
+
pattern: string = `${BASE_NAMESPACE}:*`,
|
|
58
|
+
logFn?: (...args: unknown[]) => void
|
|
59
|
+
): void {
|
|
60
|
+
if (logFn) {
|
|
61
|
+
debug.log = logFn;
|
|
62
|
+
}
|
|
63
|
+
debug.enable(pattern);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Disable all Quereus debug logging.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* import { disableLogging } from '@quereus/quereus';
|
|
72
|
+
*
|
|
73
|
+
* disableLogging();
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export function disableLogging(): void {
|
|
77
|
+
debug.disable();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Check if logging is enabled for a specific namespace.
|
|
82
|
+
*
|
|
83
|
+
* @param namespace - The namespace to check (without 'quereus:' prefix)
|
|
84
|
+
* @returns true if logging is enabled for this namespace
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* import { isLoggingEnabled } from '@quereus/quereus';
|
|
89
|
+
*
|
|
90
|
+
* if (isLoggingEnabled('vtab:memory')) {
|
|
91
|
+
* // Perform expensive debug operations
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export function isLoggingEnabled(namespace: string): boolean {
|
|
96
|
+
return debug.enabled(`${BASE_NAMESPACE}:${namespace}`);
|
|
23
97
|
}
|
|
@@ -309,8 +309,9 @@ function processDateTimeArgs(args: ReadonlyArray<SqlValue>): Temporal.ZonedDateT
|
|
|
309
309
|
// --- Function Implementations --- //
|
|
310
310
|
|
|
311
311
|
// date(timestring, modifier, ...)
|
|
312
|
+
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
312
313
|
export const dateFunc = createScalarFunction(
|
|
313
|
-
{ name: 'date', numArgs: -1, deterministic:
|
|
314
|
+
{ name: 'date', numArgs: -1, deterministic: false },
|
|
314
315
|
(...args: SqlValue[]): SqlValue => {
|
|
315
316
|
const finalDt = processDateTimeArgs(args);
|
|
316
317
|
if (!finalDt) return null;
|
|
@@ -319,8 +320,9 @@ export const dateFunc = createScalarFunction(
|
|
|
319
320
|
);
|
|
320
321
|
|
|
321
322
|
// time(timestring, modifier, ...)
|
|
323
|
+
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
322
324
|
export const timeFunc = createScalarFunction(
|
|
323
|
-
{ name: 'time', numArgs: -1, deterministic:
|
|
325
|
+
{ name: 'time', numArgs: -1, deterministic: false },
|
|
324
326
|
(...args: SqlValue[]): SqlValue => {
|
|
325
327
|
const finalDt = processDateTimeArgs(args);
|
|
326
328
|
if (!finalDt) return null;
|
|
@@ -329,8 +331,9 @@ export const timeFunc = createScalarFunction(
|
|
|
329
331
|
);
|
|
330
332
|
|
|
331
333
|
// datetime(timestring, modifier, ...)
|
|
334
|
+
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
332
335
|
export const datetimeFunc = createScalarFunction(
|
|
333
|
-
{ name: 'datetime', numArgs: -1, deterministic:
|
|
336
|
+
{ name: 'datetime', numArgs: -1, deterministic: false },
|
|
334
337
|
(...args: SqlValue[]): SqlValue => {
|
|
335
338
|
const finalDt = processDateTimeArgs(args);
|
|
336
339
|
if (!finalDt) return null;
|
|
@@ -341,8 +344,9 @@ export const datetimeFunc = createScalarFunction(
|
|
|
341
344
|
);
|
|
342
345
|
|
|
343
346
|
// julianday(timestring, modifier, ...)
|
|
347
|
+
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
344
348
|
export const juliandayFunc = createScalarFunction(
|
|
345
|
-
{ name: 'julianday', numArgs: -1, deterministic:
|
|
349
|
+
{ name: 'julianday', numArgs: -1, deterministic: false },
|
|
346
350
|
(...args: SqlValue[]): SqlValue => {
|
|
347
351
|
const finalDt = processDateTimeArgs(args);
|
|
348
352
|
if (!finalDt) return null;
|
|
@@ -352,8 +356,9 @@ export const juliandayFunc = createScalarFunction(
|
|
|
352
356
|
);
|
|
353
357
|
|
|
354
358
|
// strftime(format, timestring, modifier, ...)
|
|
359
|
+
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
355
360
|
export const strftimeFunc = createScalarFunction(
|
|
356
|
-
{ name: 'strftime', numArgs: -1, deterministic:
|
|
361
|
+
{ name: 'strftime', numArgs: -1, deterministic: false },
|
|
357
362
|
(format: SqlValue, ...timeArgs: SqlValue[]): SqlValue => {
|
|
358
363
|
if (typeof format !== 'string') return null;
|
|
359
364
|
const finalDt = processDateTimeArgs(timeArgs);
|
package/src/index.ts
CHANGED
|
@@ -91,7 +91,6 @@ export { ParseError } from './parser/parser.js';
|
|
|
91
91
|
export { SchemaManager } from './schema/manager.js';
|
|
92
92
|
export type { TableSchema, IndexSchema as TableIndexSchema } from './schema/table.js';
|
|
93
93
|
export type { ColumnSchema } from './schema/column.js';
|
|
94
|
-
export type { FunctionSchema } from './schema/function.js';
|
|
95
94
|
|
|
96
95
|
// Runtime utilities
|
|
97
96
|
export { isAsyncIterable, asyncIterableToArray } from './runtime/utils.js';
|
|
@@ -107,17 +106,24 @@ export type {
|
|
|
107
106
|
ScalarFunc,
|
|
108
107
|
TableValuedFunc,
|
|
109
108
|
AggregateReducer,
|
|
110
|
-
AggregateFinalizer
|
|
109
|
+
AggregateFinalizer,
|
|
110
|
+
FunctionSchema
|
|
111
111
|
} from './schema/function.js';
|
|
112
112
|
|
|
113
113
|
// Utility functions
|
|
114
114
|
export { Latches } from './util/latches.js';
|
|
115
115
|
|
|
116
|
+
// Plugin helper for static loading (React Native, etc.)
|
|
117
|
+
export { registerPlugin } from './util/plugin-helper.js';
|
|
118
|
+
export type { PluginFunction } from './util/plugin-helper.js';
|
|
119
|
+
|
|
116
120
|
// Initialize runtime emitters (this ensures they are registered)
|
|
117
121
|
import './runtime/register.js';
|
|
118
122
|
|
|
119
|
-
// Re-export
|
|
120
|
-
export {
|
|
123
|
+
// Re-export virtual table framework
|
|
124
|
+
export type { VirtualTableModule } from './vtab/module.js';
|
|
125
|
+
|
|
126
|
+
// Re-export plugin manifest types (for plugin authors, but not the loader)
|
|
121
127
|
export type {
|
|
122
128
|
PluginManifest,
|
|
123
129
|
PluginRecord,
|
|
@@ -129,18 +135,9 @@ export type {
|
|
|
129
135
|
PluginRegistrations
|
|
130
136
|
} from './vtab/manifest.js';
|
|
131
137
|
|
|
132
|
-
// Re-export config system
|
|
133
|
-
export {
|
|
134
|
-
interpolateEnvVars,
|
|
135
|
-
interpolateConfigEnvVars,
|
|
136
|
-
loadPluginsFromConfig,
|
|
137
|
-
validateConfig
|
|
138
|
-
} from './config/loader.js';
|
|
139
|
-
export type { QuoombConfig, PluginConfig } from './config/loader.js';
|
|
140
|
-
|
|
141
|
-
// Re-export virtual table framework
|
|
142
|
-
export type { VirtualTableModule } from './vtab/module.js';
|
|
143
|
-
|
|
144
138
|
// Debug and development utilities
|
|
145
139
|
export { serializePlanTree, formatPlanTree, formatPlanSummary, serializePlanTreeWithOptions } from './planner/debug.js';
|
|
146
140
|
export type { PlanDisplayOptions } from './planner/debug.js';
|
|
141
|
+
|
|
142
|
+
// Logging control (for environments like React Native where env vars aren't available)
|
|
143
|
+
export { enableLogging, disableLogging, isLoggingEnabled } from './common/logger.js';
|
|
@@ -9,6 +9,7 @@ import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
|
9
9
|
import { ColumnReferenceNode } from '../nodes/reference.js';
|
|
10
10
|
import type { ScalarPlanNode } from '../nodes/plan-node.js';
|
|
11
11
|
import * as AST from '../../parser/ast.js';
|
|
12
|
+
import { validateDeterministicConstraint } from '../validation/determinism-validator.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Determines if a constraint should be checked for the given operation
|
|
@@ -137,6 +138,10 @@ export function buildConstraintChecks(
|
|
|
137
138
|
constraint.expr
|
|
138
139
|
) as ScalarPlanNode;
|
|
139
140
|
|
|
141
|
+
// Validate that the constraint expression is deterministic
|
|
142
|
+
const constraintName = constraint.name ?? `_check_${tableSchema.name}`;
|
|
143
|
+
validateDeterministicConstraint(expression, constraintName, tableSchema.name);
|
|
144
|
+
|
|
140
145
|
// Heuristic: auto-defer if the expression contains a subquery
|
|
141
146
|
// or references a different relation via attribute bindings (NEW/OLD already localized).
|
|
142
147
|
const needsDeferred = containsSubquery(expression);
|
|
@@ -148,7 +148,11 @@ export function buildDeleteStmt(
|
|
|
148
148
|
deleteCtx.scope,
|
|
149
149
|
deleteNode,
|
|
150
150
|
tableReference,
|
|
151
|
-
'delete'
|
|
151
|
+
'delete',
|
|
152
|
+
undefined, // onConflict not used for DELETE
|
|
153
|
+
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
154
|
+
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
155
|
+
contextDescriptor
|
|
152
156
|
);
|
|
153
157
|
|
|
154
158
|
const resultNode: RelationalPlanNode = dmlExecutorNode;
|
|
@@ -22,6 +22,7 @@ import { ProjectNode, type Projection } from '../nodes/project-node.js';
|
|
|
22
22
|
import { buildOldNewRowDescriptors } from '../../util/row-descriptor.js';
|
|
23
23
|
import { DmlExecutorNode } from '../nodes/dml-executor-node.js';
|
|
24
24
|
import { buildConstraintChecks } from './constraint-builder.js';
|
|
25
|
+
import { validateDeterministicDefault } from '../validation/determinism-validator.js';
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Creates a uniform row expansion projection that maps any relational source
|
|
@@ -103,6 +104,9 @@ function createRowExpansionProjection(
|
|
|
103
104
|
if (typeof tableColumn.defaultValue === 'object' && tableColumn.defaultValue !== null && 'type' in tableColumn.defaultValue) {
|
|
104
105
|
// It's an AST.Expression - build it into a plan node with context scope
|
|
105
106
|
defaultNode = buildExpression(defaultCtx, tableColumn.defaultValue as AST.Expression) as ScalarPlanNode;
|
|
107
|
+
|
|
108
|
+
// Validate that the default expression is deterministic
|
|
109
|
+
validateDeterministicDefault(defaultNode, tableColumn.name, tableSchema.name);
|
|
106
110
|
} else {
|
|
107
111
|
// Literal default value
|
|
108
112
|
defaultNode = buildExpression(defaultCtx, { type: 'literal', value: tableColumn.defaultValue }) as ScalarPlanNode;
|
|
@@ -358,7 +362,10 @@ export function buildInsertStmt(
|
|
|
358
362
|
constraintCheckNode,
|
|
359
363
|
tableReference,
|
|
360
364
|
'insert',
|
|
361
|
-
stmt.onConflict
|
|
365
|
+
stmt.onConflict,
|
|
366
|
+
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
367
|
+
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
368
|
+
contextDescriptor
|
|
362
369
|
);
|
|
363
370
|
|
|
364
371
|
const resultNode: RelationalPlanNode = dmlExecutorNode;
|
|
@@ -270,7 +270,11 @@ export function buildUpdateStmt(
|
|
|
270
270
|
updateCtx.scope,
|
|
271
271
|
constraintCheckNode,
|
|
272
272
|
tableReference,
|
|
273
|
-
'update'
|
|
273
|
+
'update',
|
|
274
|
+
undefined, // onConflict not used for UPDATE
|
|
275
|
+
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
276
|
+
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
277
|
+
contextDescriptor
|
|
274
278
|
);
|
|
275
279
|
|
|
276
280
|
// Return the RETURNING results from the executed update
|
|
@@ -312,7 +316,11 @@ export function buildUpdateStmt(
|
|
|
312
316
|
updateCtx.scope,
|
|
313
317
|
constraintCheckNode,
|
|
314
318
|
tableReference,
|
|
315
|
-
'update'
|
|
319
|
+
'update',
|
|
320
|
+
undefined, // onConflict not used for UPDATE
|
|
321
|
+
mutationContextValues.size > 0 ? mutationContextValues : undefined,
|
|
322
|
+
contextAttributes.length > 0 ? contextAttributes : undefined,
|
|
323
|
+
contextDescriptor
|
|
316
324
|
);
|
|
317
325
|
|
|
318
326
|
return new SinkNode(updateCtx.scope, updateExecutorNode, 'update');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Scope } from '../scopes/scope.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type Attribute, type PhysicalProperties, isRelationalNode } from './plan-node.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type Attribute, type PhysicalProperties, type ScalarPlanNode, type RowDescriptor, isRelationalNode } from './plan-node.js';
|
|
3
3
|
import { PlanNodeType } from './plan-node-type.js';
|
|
4
4
|
import type { TableReferenceNode } from './reference.js';
|
|
5
5
|
import type { RelationType } from '../../common/datatype.js';
|
|
@@ -20,6 +20,9 @@ export class DmlExecutorNode extends PlanNode implements RelationalPlanNode {
|
|
|
20
20
|
public readonly table: TableReferenceNode,
|
|
21
21
|
public readonly operation: RowOp,
|
|
22
22
|
public readonly onConflict?: ConflictResolution, // Used for INSERT operations
|
|
23
|
+
public readonly mutationContextValues?: Map<string, ScalarPlanNode>, // Mutation context value expressions
|
|
24
|
+
public readonly contextAttributes?: Attribute[], // Mutation context attributes
|
|
25
|
+
public readonly contextDescriptor?: RowDescriptor, // Mutation context row descriptor
|
|
23
26
|
) {
|
|
24
27
|
super(scope);
|
|
25
28
|
}
|
|
@@ -63,7 +66,10 @@ export class DmlExecutorNode extends PlanNode implements RelationalPlanNode {
|
|
|
63
66
|
newSource as RelationalPlanNode,
|
|
64
67
|
this.table,
|
|
65
68
|
this.operation,
|
|
66
|
-
this.onConflict
|
|
69
|
+
this.onConflict,
|
|
70
|
+
this.mutationContextValues,
|
|
71
|
+
this.contextAttributes,
|
|
72
|
+
this.contextDescriptor
|
|
67
73
|
);
|
|
68
74
|
}
|
|
69
75
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { QuereusError } from '../../common/errors.js';
|
|
2
|
+
import { StatusCode } from '../../common/types.js';
|
|
3
|
+
import type { ScalarPlanNode } from '../nodes/plan-node.js';
|
|
4
|
+
import { createLogger } from '../../common/logger.js';
|
|
5
|
+
|
|
6
|
+
const log = createLogger('planner:validation:determinism');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Validates that an expression is deterministic (suitable for constraints and defaults).
|
|
10
|
+
* Non-deterministic expressions must be passed via mutation context instead.
|
|
11
|
+
*
|
|
12
|
+
* @param expr The expression plan node to validate
|
|
13
|
+
* @param context Description of where the expression is used (e.g., "DEFAULT for column 'created_at'")
|
|
14
|
+
* @throws QuereusError if the expression is non-deterministic
|
|
15
|
+
*/
|
|
16
|
+
export function validateDeterministicExpression(
|
|
17
|
+
expr: ScalarPlanNode,
|
|
18
|
+
context: string
|
|
19
|
+
): void {
|
|
20
|
+
log('Validating determinism for: %s', context);
|
|
21
|
+
|
|
22
|
+
// Check physical properties - this will recursively check all child nodes
|
|
23
|
+
const physical = expr.physical;
|
|
24
|
+
|
|
25
|
+
if (physical.deterministic === false) {
|
|
26
|
+
log('Non-deterministic expression detected in %s: %s', context, expr.toString());
|
|
27
|
+
|
|
28
|
+
throw new QuereusError(
|
|
29
|
+
`Non-deterministic expression not allowed in ${context}. ` +
|
|
30
|
+
`Expression: ${expr.toString()}. ` +
|
|
31
|
+
`Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`,
|
|
32
|
+
StatusCode.ERROR
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
log('Expression is deterministic: %s', expr.toString());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Validates that a CHECK constraint expression is deterministic.
|
|
41
|
+
*
|
|
42
|
+
* @param expr The constraint expression plan node
|
|
43
|
+
* @param constraintName The name of the constraint (for error messages)
|
|
44
|
+
* @param tableName The name of the table (for error messages)
|
|
45
|
+
* @throws QuereusError if the expression is non-deterministic
|
|
46
|
+
*/
|
|
47
|
+
export function validateDeterministicConstraint(
|
|
48
|
+
expr: ScalarPlanNode,
|
|
49
|
+
constraintName: string,
|
|
50
|
+
tableName: string
|
|
51
|
+
): void {
|
|
52
|
+
validateDeterministicExpression(
|
|
53
|
+
expr,
|
|
54
|
+
`CHECK constraint '${constraintName}' on table '${tableName}'`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Validates that a DEFAULT expression is deterministic.
|
|
60
|
+
*
|
|
61
|
+
* @param expr The default value expression plan node
|
|
62
|
+
* @param columnName The name of the column (for error messages)
|
|
63
|
+
* @param tableName The name of the table (for error messages)
|
|
64
|
+
* @throws QuereusError if the expression is non-deterministic
|
|
65
|
+
*/
|
|
66
|
+
export function validateDeterministicDefault(
|
|
67
|
+
expr: ScalarPlanNode,
|
|
68
|
+
columnName: string,
|
|
69
|
+
tableName: string
|
|
70
|
+
): void {
|
|
71
|
+
validateDeterministicExpression(
|
|
72
|
+
expr,
|
|
73
|
+
`DEFAULT for column '${columnName}' in table '${tableName}'`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
@@ -31,6 +31,9 @@ export function emitAddConstraint(plan: AddConstraintNode, _ctx: EmissionContext
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
// Create the constraint schema object
|
|
34
|
+
// Note: We don't validate determinism here because constraints may reference NEW/OLD
|
|
35
|
+
// which require special scoping. Determinism is validated at INSERT/UPDATE plan time
|
|
36
|
+
// in constraint-builder.ts when the constraint is actually checked.
|
|
34
37
|
const constraintSchema: RowConstraintSchema = {
|
|
35
38
|
name: constraint.name || `check_${tableSchema.checkConstraints.length}`,
|
|
36
39
|
expr: constraint.expr,
|