@quereus/quereus 4.7.0 → 4.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/types.d.ts +19 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database.d.ts +45 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +212 -2
- 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 +86 -0
- 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 +3 -2
- 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/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/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/index.d.ts +11 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +18 -3
- 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/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/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/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/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +12 -10
- package/dist/src/runtime/emit/binary.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/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/materialized-view-helpers.d.ts +26 -9
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +37 -17
- 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/remote-query.d.ts.map +1 -1
- package/dist/src/runtime/emit/remote-query.js +8 -3
- package/dist/src/runtime/emit/remote-query.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +4 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +2 -2
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +4 -3
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +8 -3
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/types.d.ts +10 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/runtime/utils.d.ts.map +1 -1
- package/dist/src/runtime/utils.js +11 -0
- package/dist/src/runtime/utils.js.map +1 -1
- 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/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 +12 -28
- 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-types.d.ts +11 -0
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +82 -0
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/abort-signal.d.ts +25 -0
- package/dist/src/util/abort-signal.d.ts.map +1 -0
- package/dist/src/util/abort-signal.js +40 -0
- package/dist/src/util/abort-signal.js.map +1 -0
- 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/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/concurrency.d.ts +15 -0
- package/dist/src/vtab/concurrency.d.ts.map +1 -1
- package/dist/src/vtab/concurrency.js +17 -0
- package/dist/src/vtab/concurrency.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +10 -0
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +10 -0
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/interface.d.ts +24 -0
- package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +21 -3
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +118 -93
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +11 -0
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +19 -0
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +41 -0
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +41 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +12 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +12 -1
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/module.d.ts +33 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/test-support/commit-stall.d.ts +53 -0
- package/dist/src/vtab/test-support/commit-stall.d.ts.map +1 -0
- package/dist/src/vtab/test-support/commit-stall.js +73 -0
- package/dist/src/vtab/test-support/commit-stall.js.map +1 -0
- package/dist/src/vtab/test-support/committed-read-conformance.d.ts +96 -0
- package/dist/src/vtab/test-support/committed-read-conformance.d.ts.map +1 -0
- package/dist/src/vtab/test-support/committed-read-conformance.js +364 -0
- package/dist/src/vtab/test-support/committed-read-conformance.js.map +1 -0
- package/package.json +3 -3
|
@@ -49,6 +49,25 @@ export interface StatementOptions {
|
|
|
49
49
|
* before any work is performed.
|
|
50
50
|
*/
|
|
51
51
|
signal?: AbortSignal;
|
|
52
|
+
/**
|
|
53
|
+
* Read concurrency for this execution.
|
|
54
|
+
*
|
|
55
|
+
* - `'serialized'` (default) — queue behind the execution mutex. The read
|
|
56
|
+
* sees whatever an already-queued write left behind, exactly as today.
|
|
57
|
+
* - `'committed'` — when the statement is eligible (a read-only query in
|
|
58
|
+
* autocommit mode whose every table's module declares
|
|
59
|
+
* `readCommittedSnapshot`), run WITHOUT the mutex against each table's last
|
|
60
|
+
* committed state, so the read completes even while another statement is
|
|
61
|
+
* blocked in its virtual-table commit. An ineligible statement silently
|
|
62
|
+
* falls back to `'serialized'` — never an error.
|
|
63
|
+
*
|
|
64
|
+
* `'committed'` deliberately gives up the ordering guarantee that
|
|
65
|
+
* `void db.exec(insert); await db.get(select)` shows the insert — the read
|
|
66
|
+
* may serve the pre-insert state. That is why it is opt-in per call.
|
|
67
|
+
* Honored by the row-returning entry points (`Database.get`, `Database.eval`,
|
|
68
|
+
* `Statement.get/all/iterateRows/run`); `Database.exec` ignores it.
|
|
69
|
+
*/
|
|
70
|
+
readConcurrency?: 'serialized' | 'committed';
|
|
52
71
|
}
|
|
53
72
|
/**
|
|
54
73
|
* Standard status/error codes that significantly match SQLite.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,YAAY,CAAC,CAAC,IACzB,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,GACpH,CAAC,GACD,CAAC,SAAS,SAAS,GAClB,CAAC,GACD;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,EAAE,CAAC;AAEtE;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,WAAW,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAAA;AAE3E,4EAA4E;AAC5E,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAmFA;;;GAGG;AACH,MAAM,CAAN,IAAY,UAgCX;AAhCD,WAAY,UAAU;IACrB,uCAAM,CAAA;IACN,6CAAS,CAAA;IACT,mDAAY,CAAA;IACZ,2CAAQ,CAAA;IACR,6CAAS,CAAA;IACT,2CAAQ,CAAA;IACR,+CAAU,CAAA;IACV,6CAAS,CAAA;IACT,mDAAY,CAAA;IACZ,qDAAa,CAAA;IACb,8CAAU,CAAA;IACV,kDAAY,CAAA;IACZ,oDAAa,CAAA;IACb,4CAAS,CAAA;IACT,oDAAa,CAAA;IACb,oDAAa,CAAA;IACb,8CAAU,CAAA;IACV,gDAAW,CAAA;IACX,gDAAW,CAAA;IACX,wDAAe,CAAA;IACf,oDAAa,CAAA;IACb,gDAAW,CAAA;IACX,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,gDAAW,CAAA;IACX,8CAAU,CAAA;IACV,gDAAW,CAAA;IACX,gDAAW,CAAA;IACX,kDAAY,CAAA;IACZ,gDAAW,CAAA;IACX,0DAAgB,CAAA;AACjB,CAAC,EAhCW,UAAU,KAAV,UAAU,QAgCrB;AAED;;;GAGG;AACH,MAAM,CAAN,IAAY,WAQX;AARD,WAAY,WAAW;IACtB,6CAAQ,CAAA;IACR,mDAAW,CAAA;IACX,6CAAQ,CAAA;IACR,6CAAQ,CAAA;IACR,6CAAQ,CAAA;IACR,mDAAW,CAAA;IACX,mDAAW,CAAA;AACZ,CAAC,EARW,WAAW,KAAX,WAAW,QAQtB;AAqDD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACzD,OAAO,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvF,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7C,iDAAiD;IACjD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/G,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACvD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACtC,IAAI,KAAK,YAAY,UAAU;YAAE,OAAO,YAAY,CAAC;QACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,cAAc,CAAC;QAChD,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;YAAE,OAAO,eAAe,CAAC;QAC9E,OAAQ,KAAgB,CAAC,WAAW,EAAE,IAAI,IAAI,QAAQ,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -31,6 +31,24 @@ export interface BuildPlanResult {
|
|
|
31
31
|
plan: BlockNode;
|
|
32
32
|
schemaDependencies: BuildTimeDependencyTracker;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Live handle for one mutex-free committed read (see
|
|
36
|
+
* {@link import('../common/types.js').StatementOptions.readConcurrency}).
|
|
37
|
+
* Minted by {@link Database._beginConcurrentRead}; the read combines `signal`
|
|
38
|
+
* with the caller's own signal and MUST call `end()` on every exit path
|
|
39
|
+
* (completion, break, error, abort) — {@link Database.close} awaits `done`,
|
|
40
|
+
* so a leaked scope hangs close.
|
|
41
|
+
*/
|
|
42
|
+
export interface ConcurrentReadScope {
|
|
43
|
+
/** Fired by {@link Database.close} so an in-flight read unwinds (with an
|
|
44
|
+
* AbortError) at its next row boundary. */
|
|
45
|
+
readonly signal: AbortSignal;
|
|
46
|
+
/** Resolves once {@link end} has run — i.e. the read's teardown (scan
|
|
47
|
+
* connection disconnects included) is complete. */
|
|
48
|
+
readonly done: Promise<void>;
|
|
49
|
+
/** Marks the read finished. Idempotent. */
|
|
50
|
+
end(): void;
|
|
51
|
+
}
|
|
34
52
|
/** Options accepted by {@link Database.registerCollation}'s third argument. */
|
|
35
53
|
export interface RegisterCollationOptions {
|
|
36
54
|
normalizer?: (s: string) => string;
|
|
@@ -56,6 +74,13 @@ export declare class Database implements TransactionManagerContext, AssertionEva
|
|
|
56
74
|
* Mutex for serializing statement execution.
|
|
57
75
|
* This prevents concurrent statements from interfering with each other's
|
|
58
76
|
* transaction state, matching SQLite's behavior of serializing writes.
|
|
77
|
+
*
|
|
78
|
+
* Not quite unconditional: a read-only statement executed with
|
|
79
|
+
* `readConcurrency: 'committed'` (see {@link StatementOptions}) that passes
|
|
80
|
+
* {@link _isConcurrentReadEligible} runs WITHOUT this mutex against each
|
|
81
|
+
* table's last committed state, so it completes even while another statement
|
|
82
|
+
* is blocked in its virtual-table commit. Everything else — every write, every
|
|
83
|
+
* default read — still serializes here.
|
|
59
84
|
*/
|
|
60
85
|
private execMutex;
|
|
61
86
|
/**
|
|
@@ -66,6 +91,12 @@ export declare class Database implements TransactionManagerContext, AssertionEva
|
|
|
66
91
|
* detect it must defer rather than deadlock on the held mutex.
|
|
67
92
|
*/
|
|
68
93
|
private execMutexDepth;
|
|
94
|
+
/**
|
|
95
|
+
* Live mutex-free committed-read scopes → their abort controllers.
|
|
96
|
+
* {@link close} aborts each and awaits its `done` before tearing down shared
|
|
97
|
+
* state, so no read is left iterating a schema being cleared.
|
|
98
|
+
*/
|
|
99
|
+
private readonly concurrentReads;
|
|
69
100
|
/** Database-level event emitter for unified reactivity */
|
|
70
101
|
private readonly eventEmitter;
|
|
71
102
|
/** Transaction management */
|
|
@@ -150,7 +181,9 @@ export declare class Database implements TransactionManagerContext, AssertionEva
|
|
|
150
181
|
* @param params Optional parameters to bind.
|
|
151
182
|
* @param options Optional execution options (e.g. an `AbortSignal` for
|
|
152
183
|
* cooperative cancellation — checked before preparing and at the row
|
|
153
|
-
* boundary while the first row is produced
|
|
184
|
+
* boundary while the first row is produced; or `readConcurrency:
|
|
185
|
+
* 'committed'` to run an eligible read-only query mutex-free against
|
|
186
|
+
* committed state — honored via `Statement.get`).
|
|
154
187
|
* @returns A Promise resolving to the first result row as an object, or undefined if no rows.
|
|
155
188
|
* @throws QuereusError on failure (an `AbortError` if the signal fired).
|
|
156
189
|
*/
|
|
@@ -183,6 +216,17 @@ export declare class Database implements TransactionManagerContext, AssertionEva
|
|
|
183
216
|
* surrounding explicit transaction until the user issues `COMMIT` or
|
|
184
217
|
* `ROLLBACK`.
|
|
185
218
|
*
|
|
219
|
+
* `options.readConcurrency` is IGNORED here: `exec` returns no rows, so a
|
|
220
|
+
* concurrent committed read through it would have no consumer, and its
|
|
221
|
+
* per-statement implicit-transaction loop is exactly the machinery the
|
|
222
|
+
* mutex-free path must not touch. Use `get`/`eval` for concurrent reads.
|
|
223
|
+
*
|
|
224
|
+
* Every statement runs to completion, including row-returning ones (`select`,
|
|
225
|
+
* `values`, `explain`, ...) — their rows are pulled and discarded so any side
|
|
226
|
+
* effects and errors the query produces still happen. A caller passing a
|
|
227
|
+
* row-returning query pays for the full scan and sees any error it raises,
|
|
228
|
+
* but never sees the rows themselves; use `get`/`eval` to consume them.
|
|
229
|
+
*
|
|
186
230
|
* @param sql The SQL string(s) to execute.
|
|
187
231
|
* @param params Optional parameters to bind.
|
|
188
232
|
* @param options Optional execution options (e.g. an `AbortSignal` for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtI,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,EAA+E,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG5I,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/core/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtI,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,EAA+E,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG5I,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,OAAO,EAAE,QAAQ,EAAoB,MAAM,+BAA+B,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAC;AAGpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAsB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAOpI,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAsB,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAG/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAsB,KAAK,yBAAyB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACvH,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnG,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1C,wFAAwF;AACxF,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,kBAAkB,EAAE,0BAA0B,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IACnC;gDAC4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;wDACoD;IACpD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,2CAA2C;IAC3C,GAAG,IAAI,IAAI,CAAC;CACZ;AAED,+EAA+E;AAC/E,MAAM,WAAW,wBAAwB;IACxC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAiBD;;;GAGG;AACH,qBAAa,QAAS,YAAW,yBAAyB,EAAE,yBAAyB,EAAE,qBAAqB;IAC3G,SAAgB,aAAa,EAAE,aAAa,CAAC;IAC7C,SAAgB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,iBAAiB,CAA6C;IACtE,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,OAAO,EAAE,sBAAsB,CAAC;IAChD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqC;IACzE;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,SAAS,CAAoC;IACrD;;;;;;OAMG;IACH,OAAO,CAAC,cAAc,CAAK;IAC3B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmD;IACnF,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAC3D,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE;;;;;;;;qEAQiE;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;IAChE;oFACgF;IAChF,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C;iDAC6C;IAC7C,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD;;;;;OAKG;IACH,SAAgB,OAAO,UAAiB;;IA8DxC,yCAAyC;IACzC,oBAAoB,IAAI,GAAG,CAAC,MAAM,CAAC;IAInC,sDAAsD;IACtD,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,EAAE;IAI/C;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE;IAI5G;;;OAGG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,MAAM,IAAI;IAmM/F;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS;IAW9G;;;;;;;;;;;;;;OAcG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;IA8CtI;;;;;;;;;;OAUG;IACH,YAAY,IAAI,OAAO;IA2RvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAQjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2D1F;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IA+CpF;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,YAAY,CACX,QAAQ,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,EAClD,OAAO,CAAC,EAAE,6BAA6B,GACrC,MAAM,IAAI;IAKb;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CACb,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,EACpD,OAAO,CAAC,EAAE,+BAA+B,GACvC,MAAM,IAAI;IAKb;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAyB7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxF;;;;;OAKG;IACH,iCAAiC,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAKhE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,MAAM,IAAI;IAalF;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD5B;;OAEG;IACH,aAAa,IAAI,OAAO;IAKxB;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAS1C,8EAA8E;IAC9E,OAAO,CAAC,iCAAiC;IAmBzC;;;;;;OAMG;IACH,oBAAoB,CACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KACjB,EACD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,QAAQ,GACrC,IAAI;IAgBP;;;;;;;OAOG;IACH,uBAAuB,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACvB,EACD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,EACxD,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GACnC,IAAI;IAgBP;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAiC9C,gDAAgD;IAChD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKtC,sCAAsC;IACtC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;IAWxD;;;OAGG;IACH,oBAAoB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;KAAE;IAKxE;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAMpC;;;;;;;;;;OAUG;IACH,aAAa,IAAI,MAAM,EAAE;IAKzB;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/C;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlC,uCAAuC;IACvC,OAAO,CAAC,qBAAqB;IAI7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IAmBH,iBAAiB,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,EACvB,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,wBAAwB,GACtE,IAAI;IA8CP;;;;;;;;OAQG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,GAAG,IAAI;IAmCzD;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAKjE;;;OAGG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,SAAS;IAIrD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,oBAAoB,IAAI,iBAAiB;IAczC;;;;;;;;;;;;;;;;;;OAkBG;IACH,wBAAwB,IAAI,qBAAqB;IAqE1C,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,iBAAiB,CAAC,EAAE,aAAa,GAAG,IAAI;IAIxO,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAcvD;;;sBAGkB;IACX,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIjF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIjF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIrG;;;;;;OAMG;IACI,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7C;;;;OAIG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9C;;;;OAIG;IACI,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA6D1C,eAAe,IAAI,IAAI;IAI9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IA4GnI;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ;IA2BxE;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAkB7G;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS;IAuBzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAoM9E;;;OAGG;YACW,wBAAwB;IAgBtC,OAAO,CAAC,SAAS;IAIJ,mBAAmB,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgE5E;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY;IAW9D;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACU,wBAAwB,CACpC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,OAAO,CAAC,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IAuBvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACU,2BAA2B,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAwHhG"}
|
|
@@ -18,6 +18,10 @@ import { createStrictRowContextMap, wrapTableContextsStrict } from '../runtime/s
|
|
|
18
18
|
import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
|
|
19
19
|
import { ParameterScope } from '../planner/scopes/param.js';
|
|
20
20
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
21
|
+
import { PlanNode, isRelationalNode } from '../planner/nodes/plan-node.js';
|
|
22
|
+
import { TableReferenceNode } from '../planner/nodes/reference.js';
|
|
23
|
+
import { PlanNodeType } from '../planner/nodes/plan-node-type.js';
|
|
24
|
+
import { getModuleReadCommittedSnapshot } from '../vtab/concurrency.js';
|
|
21
25
|
import { registerEmitters } from '../runtime/register.js';
|
|
22
26
|
import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
|
|
23
27
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
@@ -30,6 +34,7 @@ import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js
|
|
|
30
34
|
import { registerType as registerTypeInRegistry } from '../types/registry.js';
|
|
31
35
|
import { getParameterTypes } from './param.js';
|
|
32
36
|
import { rowToObject } from './utils.js';
|
|
37
|
+
import { isAsyncIterable, disconnectVTable } from '../runtime/utils.js';
|
|
33
38
|
import { wrapAsyncIterator } from '../util/async-iterator.js';
|
|
34
39
|
import { Latches } from '../util/latches.js';
|
|
35
40
|
import { DatabaseEventEmitter, } from './database-events.js';
|
|
@@ -69,6 +74,13 @@ export class Database {
|
|
|
69
74
|
* Mutex for serializing statement execution.
|
|
70
75
|
* This prevents concurrent statements from interfering with each other's
|
|
71
76
|
* transaction state, matching SQLite's behavior of serializing writes.
|
|
77
|
+
*
|
|
78
|
+
* Not quite unconditional: a read-only statement executed with
|
|
79
|
+
* `readConcurrency: 'committed'` (see {@link StatementOptions}) that passes
|
|
80
|
+
* {@link _isConcurrentReadEligible} runs WITHOUT this mutex against each
|
|
81
|
+
* table's last committed state, so it completes even while another statement
|
|
82
|
+
* is blocked in its virtual-table commit. Everything else — every write, every
|
|
83
|
+
* default read — still serializes here.
|
|
72
84
|
*/
|
|
73
85
|
execMutex = Promise.resolve();
|
|
74
86
|
/**
|
|
@@ -79,6 +91,12 @@ export class Database {
|
|
|
79
91
|
* detect it must defer rather than deadlock on the held mutex.
|
|
80
92
|
*/
|
|
81
93
|
execMutexDepth = 0;
|
|
94
|
+
/**
|
|
95
|
+
* Live mutex-free committed-read scopes → their abort controllers.
|
|
96
|
+
* {@link close} aborts each and awaits its `done` before tearing down shared
|
|
97
|
+
* state, so no read is left iterating a schema being cleared.
|
|
98
|
+
*/
|
|
99
|
+
concurrentReads = new Map();
|
|
82
100
|
/** Database-level event emitter for unified reactivity */
|
|
83
101
|
eventEmitter = new DatabaseEventEmitter();
|
|
84
102
|
/** Transaction management */
|
|
@@ -397,7 +415,9 @@ export class Database {
|
|
|
397
415
|
* @param params Optional parameters to bind.
|
|
398
416
|
* @param options Optional execution options (e.g. an `AbortSignal` for
|
|
399
417
|
* cooperative cancellation — checked before preparing and at the row
|
|
400
|
-
* boundary while the first row is produced
|
|
418
|
+
* boundary while the first row is produced; or `readConcurrency:
|
|
419
|
+
* 'committed'` to run an eligible read-only query mutex-free against
|
|
420
|
+
* committed state — honored via `Statement.get`).
|
|
401
421
|
* @returns A Promise resolving to the first result row as an object, or undefined if no rows.
|
|
402
422
|
* @throws QuereusError on failure (an `AbortError` if the signal fired).
|
|
403
423
|
*/
|
|
@@ -459,6 +479,106 @@ export class Database {
|
|
|
459
479
|
_isExecuting() {
|
|
460
480
|
return this.execMutexDepth > 0;
|
|
461
481
|
}
|
|
482
|
+
/**
|
|
483
|
+
* @internal True when this optimized block may run on the mutex-free
|
|
484
|
+
* committed-read path. Pure predicate — no side effects, no awaits. All of
|
|
485
|
+
* the following must hold, else the caller falls back to the serialized path
|
|
486
|
+
* (falling back is always correct, so this never throws):
|
|
487
|
+
*
|
|
488
|
+
* - No EXPLICIT transaction is open. A read inside a user `BEGIN` must see
|
|
489
|
+
* the transaction's own writes, so it always serializes. An *implicit*
|
|
490
|
+
* transaction (another statement's in-flight autocommit wrapper — including
|
|
491
|
+
* one parked in its virtual-table commit, the motivating case) does NOT
|
|
492
|
+
* disqualify: the committed read never joins it and serves the last
|
|
493
|
+
* committed state.
|
|
494
|
+
* - Every statement in the block is relational (row-producing). Transaction
|
|
495
|
+
* control and DDL lower to void nodes whose `physical.readonly` does not
|
|
496
|
+
* model their engine-level effects, so `readonly` alone is not a safe gate.
|
|
497
|
+
* - No node in any statement's subtree has side effects.
|
|
498
|
+
* - Every {@link TableReferenceNode} resolves to a module declaring
|
|
499
|
+
* `readCommittedSnapshot` (universal, not existential — one unqualified
|
|
500
|
+
* table makes the whole block serialize). Checked on the OPTIMIZED plan, so
|
|
501
|
+
* tables reached through views and materialized views are covered.
|
|
502
|
+
* - No table-valued function is called. A TVF reaches its data outside the
|
|
503
|
+
* `TableReferenceNode` gate above, and `TableFunctionCallNode` reports
|
|
504
|
+
* `readonly: true` unconditionally, so neither of the other checks can see
|
|
505
|
+
* what it does — `execution_trace('insert ...')`, for one, prepares and
|
|
506
|
+
* runs arbitrary SQL. Fail closed, matching the module contract's
|
|
507
|
+
* opt-in-or-serialize discipline.
|
|
508
|
+
*
|
|
509
|
+
* Evaluated at routing time; a `BEGIN` landing after routing does not
|
|
510
|
+
* invalidate an in-flight concurrent read — that read is already pinned to a
|
|
511
|
+
* committed snapshot and simply does not see the new transaction's writes,
|
|
512
|
+
* which is the documented semantics.
|
|
513
|
+
*
|
|
514
|
+
* NOTE: deliberately no plan-time schema gate. `Statement.compile()` is
|
|
515
|
+
* synchronous (cannot observe half-applied multi-step DDL), captured schema
|
|
516
|
+
* objects re-validate at execution start, and for the long window (the scan
|
|
517
|
+
* itself) the `readCommittedSnapshot` obligation requires the module to keep
|
|
518
|
+
* serving its pinned snapshot across concurrent DDL. A shared/exclusive gate
|
|
519
|
+
* becomes necessary only if a module that cannot pin across DDL ever wants
|
|
520
|
+
* onto this path — see backlog/debt-concurrent-reads-schema-gate.
|
|
521
|
+
*/
|
|
522
|
+
_isConcurrentReadEligible(block) {
|
|
523
|
+
if (!this.isOpen)
|
|
524
|
+
return false;
|
|
525
|
+
if (!this.transactionManager.getAutocommit() && !this.transactionManager.isImplicitTransaction()) {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
if (block.statements.length === 0)
|
|
529
|
+
return false;
|
|
530
|
+
return block.statements.every(stmt => isRelationalNode(stmt) && Database.isCommittedReadSafeSubtree(stmt));
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* @internal Single walk over one optimized statement tree: rejects on any
|
|
534
|
+
* side-effecting node, any table-valued function call, or any table whose
|
|
535
|
+
* module does not declare `readCommittedSnapshot`. See
|
|
536
|
+
* {@link _isConcurrentReadEligible} for why each is disqualifying.
|
|
537
|
+
*/
|
|
538
|
+
static isCommittedReadSafeSubtree(root) {
|
|
539
|
+
const stack = [root];
|
|
540
|
+
while (stack.length > 0) {
|
|
541
|
+
const node = stack.pop();
|
|
542
|
+
if (PlanNode.hasSideEffects(node.physical))
|
|
543
|
+
return false;
|
|
544
|
+
// NOTE: rejects every TVF, pure ones (`json_each`) included, because no
|
|
545
|
+
// declaration distinguishes them from `execution_trace`, which runs
|
|
546
|
+
// arbitrary SQL. If a pure TVF ever needs this path, add an explicit
|
|
547
|
+
// opt-in flag to the table-valued function schema and gate on it here.
|
|
548
|
+
if (node.nodeType === PlanNodeType.TableFunctionCall)
|
|
549
|
+
return false;
|
|
550
|
+
if (node instanceof TableReferenceNode && !getModuleReadCommittedSnapshot(node.vtabModule)) {
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
for (const child of node.getChildren()) {
|
|
554
|
+
stack.push(child);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* @internal Registers a mutex-free committed read. The returned scope's
|
|
561
|
+
* `signal` fires when {@link close} runs; the read must call `end()` on every
|
|
562
|
+
* exit path or `close()` waits forever on `done`.
|
|
563
|
+
*/
|
|
564
|
+
_beginConcurrentRead() {
|
|
565
|
+
this.checkOpen();
|
|
566
|
+
const controller = new AbortController();
|
|
567
|
+
let resolveDone;
|
|
568
|
+
const done = new Promise(resolve => {
|
|
569
|
+
resolveDone = resolve;
|
|
570
|
+
});
|
|
571
|
+
const scope = {
|
|
572
|
+
signal: controller.signal,
|
|
573
|
+
done,
|
|
574
|
+
end: () => {
|
|
575
|
+
if (this.concurrentReads.delete(scope))
|
|
576
|
+
resolveDone();
|
|
577
|
+
},
|
|
578
|
+
};
|
|
579
|
+
this.concurrentReads.set(scope, controller);
|
|
580
|
+
return scope;
|
|
581
|
+
}
|
|
462
582
|
/**
|
|
463
583
|
* Executes a function with the execution mutex held.
|
|
464
584
|
* The mutex serializes all database access to prevent concurrent interference.
|
|
@@ -583,6 +703,7 @@ export class Database {
|
|
|
583
703
|
else if (params) {
|
|
584
704
|
boundArgs = { ...params };
|
|
585
705
|
}
|
|
706
|
+
const scanConnections = new Map();
|
|
586
707
|
const runtimeCtx = {
|
|
587
708
|
db: this,
|
|
588
709
|
stmt: undefined,
|
|
@@ -592,8 +713,25 @@ export class Database {
|
|
|
592
713
|
tracer: this.instructionTracer,
|
|
593
714
|
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
594
715
|
signal,
|
|
716
|
+
scanConnections,
|
|
595
717
|
};
|
|
596
|
-
|
|
718
|
+
try {
|
|
719
|
+
const result = await scheduler.run(runtimeCtx);
|
|
720
|
+
// A row-returning statement does its work only as its rows are pulled. `exec` wants
|
|
721
|
+
// none of them, but it does want the work — an un-drained stream means the statement
|
|
722
|
+
// never ran at all. Drain and discard, checking the abort signal at row boundaries the
|
|
723
|
+
// way Statement._iterateWithSignal does.
|
|
724
|
+
if (isAsyncIterable(result)) {
|
|
725
|
+
for await (const _row of result) {
|
|
726
|
+
throwIfAborted(signal);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
finally {
|
|
731
|
+
for (const vtab of scanConnections.values()) {
|
|
732
|
+
await disconnectVTable(runtimeCtx, vtab);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
597
735
|
}
|
|
598
736
|
/**
|
|
599
737
|
* @internal
|
|
@@ -626,6 +764,17 @@ export class Database {
|
|
|
626
764
|
* surrounding explicit transaction until the user issues `COMMIT` or
|
|
627
765
|
* `ROLLBACK`.
|
|
628
766
|
*
|
|
767
|
+
* `options.readConcurrency` is IGNORED here: `exec` returns no rows, so a
|
|
768
|
+
* concurrent committed read through it would have no consumer, and its
|
|
769
|
+
* per-statement implicit-transaction loop is exactly the machinery the
|
|
770
|
+
* mutex-free path must not touch. Use `get`/`eval` for concurrent reads.
|
|
771
|
+
*
|
|
772
|
+
* Every statement runs to completion, including row-returning ones (`select`,
|
|
773
|
+
* `values`, `explain`, ...) — their rows are pulled and discarded so any side
|
|
774
|
+
* effects and errors the query produces still happen. A caller passing a
|
|
775
|
+
* row-returning query pays for the full scan and sees any error it raises,
|
|
776
|
+
* but never sees the rows themselves; use `get`/`eval` to consume them.
|
|
777
|
+
*
|
|
629
778
|
* @param sql The SQL string(s) to execute.
|
|
630
779
|
* @param params Optional parameters to bind.
|
|
631
780
|
* @param options Optional execution options (e.g. an `AbortSignal` for
|
|
@@ -929,6 +1078,16 @@ export class Database {
|
|
|
929
1078
|
}
|
|
930
1079
|
log("Closing database...");
|
|
931
1080
|
this.isOpen = false;
|
|
1081
|
+
// Abort every live mutex-free committed read and wait for each to tear
|
|
1082
|
+
// down (its scan connections disconnect in the read's own finally) before
|
|
1083
|
+
// touching shared state. A read parked at a yield unwinds at the
|
|
1084
|
+
// consumer's next pull/return — close() waits for that, so an abandoned,
|
|
1085
|
+
// never-again-pulled iterator delays close (same discipline as any held
|
|
1086
|
+
// iterator).
|
|
1087
|
+
for (const controller of this.concurrentReads.values()) {
|
|
1088
|
+
controller.abort();
|
|
1089
|
+
}
|
|
1090
|
+
await Promise.all(Array.from(this.concurrentReads.keys()).map(scope => scope.done));
|
|
932
1091
|
// Disconnect all active connections first
|
|
933
1092
|
await this.disconnectAllConnections();
|
|
934
1093
|
// Drain the internal FK/DDL statement pool (finalizes its cached statements,
|
|
@@ -1589,8 +1748,59 @@ export class Database {
|
|
|
1589
1748
|
* ```
|
|
1590
1749
|
*/
|
|
1591
1750
|
eval(sql, params, options) {
|
|
1751
|
+
if (options?.readConcurrency === 'committed') {
|
|
1752
|
+
// Routing (parse + compile + eligibility) happens at first pull inside the
|
|
1753
|
+
// delegating generator, so an unconsumed iterator holds no resources.
|
|
1754
|
+
return this._evalRoutedGenerator(sql, params, options);
|
|
1755
|
+
}
|
|
1592
1756
|
return wrapAsyncIterator(this._evalGenerator(sql, params, options?.signal), (commit, error) => this._finalizeImplicitTransaction(commit, error));
|
|
1593
1757
|
}
|
|
1758
|
+
/**
|
|
1759
|
+
* @internal Committed-read routing for {@link eval}: a SINGLE-statement,
|
|
1760
|
+
* concurrent-read-eligible batch runs mutex-free against committed state
|
|
1761
|
+
* (never touching the implicit-transaction lifecycle — the writer owns any
|
|
1762
|
+
* open one); everything else — multi-statement batches included — delegates
|
|
1763
|
+
* to the serialized path with identical semantics. `yield*` forwards
|
|
1764
|
+
* `return()`/`throw()` into the wrapped serialized iterator, so its
|
|
1765
|
+
* transaction-finalize cleanup still runs on early exit.
|
|
1766
|
+
*/
|
|
1767
|
+
async *_evalRoutedGenerator(sql, params, options) {
|
|
1768
|
+
this.checkOpen();
|
|
1769
|
+
throwIfAborted(options?.signal);
|
|
1770
|
+
let stmt = null;
|
|
1771
|
+
try {
|
|
1772
|
+
const candidate = this.prepare(sql, params);
|
|
1773
|
+
let eligible = false;
|
|
1774
|
+
if (candidate.astBatch.length === 1) {
|
|
1775
|
+
try {
|
|
1776
|
+
// compile() is synchronous — no awaited DDL can interleave.
|
|
1777
|
+
eligible = this._isConcurrentReadEligible(candidate.compile());
|
|
1778
|
+
}
|
|
1779
|
+
catch (e) {
|
|
1780
|
+
// A compile error re-surfaces identically on the serialized path
|
|
1781
|
+
// below (compile failures are not memoized), so routing stays
|
|
1782
|
+
// error-free. Logged for diagnosability, not swallowed.
|
|
1783
|
+
log('eval committed-read routing declined (compile failed): %O', e);
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
if (!eligible) {
|
|
1787
|
+
await candidate.finalize();
|
|
1788
|
+
yield* wrapAsyncIterator(this._evalGenerator(sql, params, options?.signal), (commit, error) => this._finalizeImplicitTransaction(commit, error));
|
|
1789
|
+
return;
|
|
1790
|
+
}
|
|
1791
|
+
stmt = candidate;
|
|
1792
|
+
// Params were already bound by prepare(); passing them again would rebind.
|
|
1793
|
+
const names = stmt.getColumnNames();
|
|
1794
|
+
for await (const row of stmt._iterateConcurrent(undefined, options)) {
|
|
1795
|
+
yield rowToObject(row, names);
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
finally {
|
|
1799
|
+
if (stmt) {
|
|
1800
|
+
await stmt.finalize();
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1594
1804
|
/**
|
|
1595
1805
|
* Internal generator for eval() that yields result rows.
|
|
1596
1806
|
* Transaction finalization is handled by the wrapper returned by eval().
|