@quereus/store 4.5.0 → 4.6.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/README.md +30 -4
- package/dist/src/common/encoding.d.ts +4 -3
- package/dist/src/common/encoding.d.ts.map +1 -1
- package/dist/src/common/encoding.js +17 -13
- package/dist/src/common/encoding.js.map +1 -1
- package/dist/src/common/events.d.ts +5 -1
- package/dist/src/common/events.d.ts.map +1 -1
- package/dist/src/common/events.js.map +1 -1
- package/dist/src/common/implicit-unique-index.d.ts +80 -0
- package/dist/src/common/implicit-unique-index.d.ts.map +1 -0
- package/dist/src/common/implicit-unique-index.js +148 -0
- package/dist/src/common/implicit-unique-index.js.map +1 -0
- package/dist/src/common/index.d.ts +7 -3
- package/dist/src/common/index.d.ts.map +1 -1
- package/dist/src/common/index.js +5 -2
- package/dist/src/common/index.js.map +1 -1
- package/dist/src/common/json-key.d.ts +2 -2
- package/dist/src/common/json-key.js +2 -2
- package/dist/src/common/key-builder.d.ts +33 -14
- package/dist/src/common/key-builder.d.ts.map +1 -1
- package/dist/src/common/key-builder.js +24 -17
- package/dist/src/common/key-builder.js.map +1 -1
- package/dist/src/common/kv-store.d.ts +10 -0
- package/dist/src/common/kv-store.d.ts.map +1 -1
- package/dist/src/common/pk-key-resolution.d.ts +275 -0
- package/dist/src/common/pk-key-resolution.d.ts.map +1 -0
- package/dist/src/common/pk-key-resolution.js +389 -0
- package/dist/src/common/pk-key-resolution.js.map +1 -0
- package/dist/src/common/store-module-access-plan.d.ts +32 -0
- package/dist/src/common/store-module-access-plan.d.ts.map +1 -0
- package/dist/src/common/store-module-access-plan.js +424 -0
- package/dist/src/common/store-module-access-plan.js.map +1 -0
- package/dist/src/common/store-module-alter-column.d.ts +23 -0
- package/dist/src/common/store-module-alter-column.d.ts.map +1 -0
- package/dist/src/common/store-module-alter-column.js +393 -0
- package/dist/src/common/store-module-alter-column.js.map +1 -0
- package/dist/src/common/store-module-alter.d.ts +55 -0
- package/dist/src/common/store-module-alter.d.ts.map +1 -0
- package/dist/src/common/store-module-alter.js +519 -0
- package/dist/src/common/store-module-alter.js.map +1 -0
- package/dist/src/common/store-module-base.d.ts +268 -0
- package/dist/src/common/store-module-base.d.ts.map +1 -0
- package/dist/src/common/store-module-base.js +362 -0
- package/dist/src/common/store-module-base.js.map +1 -0
- package/dist/src/common/store-module-catalog.d.ts +269 -0
- package/dist/src/common/store-module-catalog.d.ts.map +1 -0
- package/dist/src/common/store-module-catalog.js +462 -0
- package/dist/src/common/store-module-catalog.js.map +1 -0
- package/dist/src/common/store-module-index-build.d.ts +88 -0
- package/dist/src/common/store-module-index-build.d.ts.map +1 -0
- package/dist/src/common/store-module-index-build.js +280 -0
- package/dist/src/common/store-module-index-build.js.map +1 -0
- package/dist/src/common/store-module-index.d.ts +116 -0
- package/dist/src/common/store-module-index.d.ts.map +1 -0
- package/dist/src/common/store-module-index.js +373 -0
- package/dist/src/common/store-module-index.js.map +1 -0
- package/dist/src/common/store-module-rename.d.ts +49 -0
- package/dist/src/common/store-module-rename.d.ts.map +1 -0
- package/dist/src/common/store-module-rename.js +244 -0
- package/dist/src/common/store-module-rename.js.map +1 -0
- package/dist/src/common/store-module-schema-rewrite.d.ts +57 -0
- package/dist/src/common/store-module-schema-rewrite.d.ts.map +1 -0
- package/dist/src/common/store-module-schema-rewrite.js +140 -0
- package/dist/src/common/store-module-schema-rewrite.js.map +1 -0
- package/dist/src/common/store-module-schema-sync.d.ts +232 -0
- package/dist/src/common/store-module-schema-sync.d.ts.map +1 -0
- package/dist/src/common/store-module-schema-sync.js +529 -0
- package/dist/src/common/store-module-schema-sync.js.map +1 -0
- package/dist/src/common/store-module.d.ts +43 -909
- package/dist/src/common/store-module.d.ts.map +1 -1
- package/dist/src/common/store-module.js +184 -3276
- package/dist/src/common/store-module.js.map +1 -1
- package/dist/src/common/store-table-base.d.ts +523 -0
- package/dist/src/common/store-table-base.d.ts.map +1 -0
- package/dist/src/common/store-table-base.js +878 -0
- package/dist/src/common/store-table-base.js.map +1 -0
- package/dist/src/common/store-table-constraints.d.ts +237 -0
- package/dist/src/common/store-table-constraints.d.ts.map +1 -0
- package/dist/src/common/store-table-constraints.js +624 -0
- package/dist/src/common/store-table-constraints.js.map +1 -0
- package/dist/src/common/store-table-scan.d.ts +415 -0
- package/dist/src/common/store-table-scan.d.ts.map +1 -0
- package/dist/src/common/store-table-scan.js +821 -0
- package/dist/src/common/store-table-scan.js.map +1 -0
- package/dist/src/common/store-table.d.ts +71 -1144
- package/dist/src/common/store-table.d.ts.map +1 -1
- package/dist/src/common/store-table.js +166 -2383
- package/dist/src/common/store-table.js.map +1 -1
- package/dist/src/testing/index.d.ts +12 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +12 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/kv-assert.d.ts +19 -0
- package/dist/src/testing/kv-assert.d.ts.map +1 -0
- package/dist/src/testing/kv-assert.js +25 -0
- package/dist/src/testing/kv-assert.js.map +1 -0
- package/dist/src/testing/kv-conformance.d.ts.map +1 -1
- package/dist/src/testing/kv-conformance.js +1 -15
- package/dist/src/testing/kv-conformance.js.map +1 -1
- package/dist/src/testing/kv-provider-conformance.d.ts +54 -0
- package/dist/src/testing/kv-provider-conformance.d.ts.map +1 -0
- package/dist/src/testing/kv-provider-conformance.js +183 -0
- package/dist/src/testing/kv-provider-conformance.js.map +1 -0
- package/package.json +8 -8
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
* `compareCodePoints` (BINARY) for a string-vs-string pair when no collation is
|
|
58
58
|
* supplied. So the ORDERING paths (the isolation merge, UNIQUE enforcement, the
|
|
59
59
|
* memory BTree's collation-carrying comparator) and the PK-EQUALITY-only paths
|
|
60
|
-
* (`resolvePkSemanticEquality` in
|
|
60
|
+
* (`resolvePkSemanticEquality` in pk-key-resolution.ts, the isolation layer's
|
|
61
61
|
* `getPkSemanticComparators`) all agree with these key bytes for JSON string leaves.
|
|
62
62
|
*
|
|
63
63
|
* ## Identity
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
import { type SqlValue } from '@quereus/quereus';
|
|
89
89
|
/**
|
|
90
90
|
* Encode a JSON value into structural key bytes — the store's key transform for
|
|
91
|
-
* columns declared `json` (see `storeSemanticKeyTransform` in
|
|
91
|
+
* columns declared `json` (see `storeSemanticKeyTransform` in pk-key-resolution.ts).
|
|
92
92
|
* NULL never reaches a key transform (`encodeCompositeKey` exempts it), but a
|
|
93
93
|
* NESTED JSON null is a real node and encodes with its own tag.
|
|
94
94
|
*/
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
* `compareCodePoints` (BINARY) for a string-vs-string pair when no collation is
|
|
58
58
|
* supplied. So the ORDERING paths (the isolation merge, UNIQUE enforcement, the
|
|
59
59
|
* memory BTree's collation-carrying comparator) and the PK-EQUALITY-only paths
|
|
60
|
-
* (`resolvePkSemanticEquality` in
|
|
60
|
+
* (`resolvePkSemanticEquality` in pk-key-resolution.ts, the isolation layer's
|
|
61
61
|
* `getPkSemanticComparators`) all agree with these key bytes for JSON string leaves.
|
|
62
62
|
*
|
|
63
63
|
* ## Identity
|
|
@@ -100,7 +100,7 @@ const KEY_MARKER = 0x01;
|
|
|
100
100
|
const utf8 = new TextEncoder();
|
|
101
101
|
/**
|
|
102
102
|
* Encode a JSON value into structural key bytes — the store's key transform for
|
|
103
|
-
* columns declared `json` (see `storeSemanticKeyTransform` in
|
|
103
|
+
* columns declared `json` (see `storeSemanticKeyTransform` in pk-key-resolution.ts).
|
|
104
104
|
* NULL never reaches a key transform (`encodeCompositeKey` exempts it), but a
|
|
105
105
|
* NESTED JSON null is a real node and encodes with its own tag.
|
|
106
106
|
*/
|
|
@@ -81,25 +81,38 @@ export declare function buildStatsKey(schemaName: string, tableName: string): Ui
|
|
|
81
81
|
* semantic-ordering member ('PT1H' / 'PT60M') land on one key.
|
|
82
82
|
*/
|
|
83
83
|
export declare function buildDataKey(pkValues: SqlValue[], options?: EncodeOptions, directions?: ReadonlyArray<boolean>, collations?: ReadonlyArray<string | undefined>, transforms?: ReadonlyArray<KeyValueTransform | undefined>): Uint8Array;
|
|
84
|
+
/**
|
|
85
|
+
* One half of a secondary-index key — the index-column prefix or the PK suffix.
|
|
86
|
+
* Each half carries its own per-column DESC `directions`, key `collations`
|
|
87
|
+
* (overriding `options.collation`; see {@link encodeCompositeKey}), and
|
|
88
|
+
* {@link KeyValueTransform}s, positionally aligned with `values`.
|
|
89
|
+
*/
|
|
90
|
+
export interface IndexKeyHalf {
|
|
91
|
+
values: SqlValue[];
|
|
92
|
+
directions?: ReadonlyArray<boolean>;
|
|
93
|
+
collations?: ReadonlyArray<string | undefined>;
|
|
94
|
+
transforms?: ReadonlyArray<KeyValueTransform | undefined>;
|
|
95
|
+
}
|
|
84
96
|
/**
|
|
85
97
|
* Build a secondary index key.
|
|
86
98
|
* Format: {encoded_index_cols}{encoded_pk}
|
|
87
99
|
*
|
|
88
100
|
* The index columns come first for range scans, followed by PK for uniqueness.
|
|
89
|
-
*
|
|
90
|
-
* for each half so ordered index scans honor per-column direction.
|
|
101
|
+
* The two halves are symmetric {@link IndexKeyHalf}s:
|
|
91
102
|
*
|
|
92
|
-
* `
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
103
|
+
* - `index.collations` encodes each index column under its own key collation
|
|
104
|
+
* (`resolveIndexKeyCollations` — the index column's COLLATE, else the table
|
|
105
|
+
* column's declared collation, else BINARY), so the stored bytes agree with the
|
|
106
|
+
* collation everything that COMPARES those values uses (`matchesFilters`, the
|
|
107
|
+
* planner's cover analysis, UNIQUE enforcement).
|
|
108
|
+
* - `pk.collations` MUST be the same per-column collations as the data key (see
|
|
109
|
+
* `buildDataKey` / `resolvePkKeyCollations`), so index maintenance
|
|
110
|
+
* (delete-then-insert on UPDATE/DELETE) addresses the same bytes the data store
|
|
111
|
+
* keys by.
|
|
112
|
+
* - Each half's `transforms` canonicalize its values before encoding; the PK
|
|
113
|
+
* suffix's MUST match the data key's for the same reason as its collations.
|
|
101
114
|
*/
|
|
102
|
-
export declare function buildIndexKey(
|
|
115
|
+
export declare function buildIndexKey(index: IndexKeyHalf, pk: IndexKeyHalf, options?: EncodeOptions): Uint8Array;
|
|
103
116
|
/**
|
|
104
117
|
* Build a catalog key for DDL storage.
|
|
105
118
|
* Format: {schema}.{table}
|
|
@@ -201,6 +214,12 @@ export declare function buildFullScanBounds(): {
|
|
|
201
214
|
* `directions[i] === true` flips bytes of prefix component i to match DESC
|
|
202
215
|
* encoding in the stored index keys.
|
|
203
216
|
*
|
|
217
|
+
* `collations[i]`, when defined, encodes prefix component i under its own key
|
|
218
|
+
* collation (overriding `options.collation`) — MUST be the same per-column index
|
|
219
|
+
* key collations `buildIndexKey`'s index half was written under
|
|
220
|
+
* (`resolveIndexKeyCollations`), or the bounds address different bytes than the
|
|
221
|
+
* stored entries. Same parameter order as {@link buildPkPrefixBounds}.
|
|
222
|
+
*
|
|
204
223
|
* `lt` is omitted when the encoded prefix is all-0xff bytes (e.g. a single
|
|
205
224
|
* leading DESC NULL, whose type byte inverts to 0xff) — no finite exclusive
|
|
206
225
|
* upper bound exists, so the scan runs to the end of the store.
|
|
@@ -216,11 +235,11 @@ export declare function buildFullScanBounds(): {
|
|
|
216
235
|
* semantic-ordering column before it gets here (the EQ-prefix loop breaks on
|
|
217
236
|
* `hasSemanticOrdering`; the range arm is gated on `keyOrderMatchesCollation`; the
|
|
218
237
|
* multi-seek throws INTERNAL, its plan having already been declined by
|
|
219
|
-
* `
|
|
238
|
+
* `tryIndexAccessPlan` (store-module-access-plan.ts)). If backlog `feat-reopen-timespan-store-seeks`
|
|
220
239
|
* re-opens any arm, thread the column's transforms through first or the bounds will
|
|
221
240
|
* address raw-value bytes while the index holds transformed ones.
|
|
222
241
|
*/
|
|
223
|
-
export declare function buildIndexPrefixBounds(prefixValues: SqlValue[], options?: EncodeOptions, directions?: ReadonlyArray<boolean>, transforms?: ReadonlyArray<KeyValueTransform | undefined>): {
|
|
242
|
+
export declare function buildIndexPrefixBounds(prefixValues: SqlValue[], options?: EncodeOptions, directions?: ReadonlyArray<boolean>, collations?: ReadonlyArray<string | undefined>, transforms?: ReadonlyArray<KeyValueTransform | undefined>): {
|
|
224
243
|
gte: Uint8Array;
|
|
225
244
|
lt?: Uint8Array;
|
|
226
245
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-builder.d.ts","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAiD,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK1H;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,mCAAmC;AACnC,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,iCAAiC;AACjC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAgB5C;;;;;;;;;;;;;;;;;;GAkBG;AASH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GACf,MAAM,CAGR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAG/E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,CAAC,EAAE,aAAa,EACvB,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EACnC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,EAC9C,UAAU,CAAC,EAAE,aAAa,CAAC,iBAAiB,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED
|
|
1
|
+
{"version":3,"file":"key-builder.d.ts","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -121,22 +121,23 @@ export function buildDataKey(pkValues, options, directions, collations, transfor
|
|
|
121
121
|
* Format: {encoded_index_cols}{encoded_pk}
|
|
122
122
|
*
|
|
123
123
|
* The index columns come first for range scans, followed by PK for uniqueness.
|
|
124
|
-
*
|
|
125
|
-
* for each half so ordered index scans honor per-column direction.
|
|
124
|
+
* The two halves are symmetric {@link IndexKeyHalf}s:
|
|
126
125
|
*
|
|
127
|
-
* `
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
126
|
+
* - `index.collations` encodes each index column under its own key collation
|
|
127
|
+
* (`resolveIndexKeyCollations` — the index column's COLLATE, else the table
|
|
128
|
+
* column's declared collation, else BINARY), so the stored bytes agree with the
|
|
129
|
+
* collation everything that COMPARES those values uses (`matchesFilters`, the
|
|
130
|
+
* planner's cover analysis, UNIQUE enforcement).
|
|
131
|
+
* - `pk.collations` MUST be the same per-column collations as the data key (see
|
|
132
|
+
* `buildDataKey` / `resolvePkKeyCollations`), so index maintenance
|
|
133
|
+
* (delete-then-insert on UPDATE/DELETE) addresses the same bytes the data store
|
|
134
|
+
* keys by.
|
|
135
|
+
* - Each half's `transforms` canonicalize its values before encoding; the PK
|
|
136
|
+
* suffix's MUST match the data key's for the same reason as its collations.
|
|
136
137
|
*/
|
|
137
|
-
export function buildIndexKey(
|
|
138
|
-
const indexEncoded = encodeCompositeKey(
|
|
139
|
-
const pkEncoded = encodeCompositeKey(
|
|
138
|
+
export function buildIndexKey(index, pk, options) {
|
|
139
|
+
const indexEncoded = encodeCompositeKey(index.values, options, index.directions, index.collations, index.transforms);
|
|
140
|
+
const pkEncoded = encodeCompositeKey(pk.values, options, pk.directions, pk.collations, pk.transforms);
|
|
140
141
|
return concatBytes(indexEncoded, pkEncoded);
|
|
141
142
|
}
|
|
142
143
|
/**
|
|
@@ -295,6 +296,12 @@ export function buildFullScanBounds() {
|
|
|
295
296
|
* `directions[i] === true` flips bytes of prefix component i to match DESC
|
|
296
297
|
* encoding in the stored index keys.
|
|
297
298
|
*
|
|
299
|
+
* `collations[i]`, when defined, encodes prefix component i under its own key
|
|
300
|
+
* collation (overriding `options.collation`) — MUST be the same per-column index
|
|
301
|
+
* key collations `buildIndexKey`'s index half was written under
|
|
302
|
+
* (`resolveIndexKeyCollations`), or the bounds address different bytes than the
|
|
303
|
+
* stored entries. Same parameter order as {@link buildPkPrefixBounds}.
|
|
304
|
+
*
|
|
298
305
|
* `lt` is omitted when the encoded prefix is all-0xff bytes (e.g. a single
|
|
299
306
|
* leading DESC NULL, whose type byte inverts to 0xff) — no finite exclusive
|
|
300
307
|
* upper bound exists, so the scan runs to the end of the store.
|
|
@@ -310,15 +317,15 @@ export function buildFullScanBounds() {
|
|
|
310
317
|
* semantic-ordering column before it gets here (the EQ-prefix loop breaks on
|
|
311
318
|
* `hasSemanticOrdering`; the range arm is gated on `keyOrderMatchesCollation`; the
|
|
312
319
|
* multi-seek throws INTERNAL, its plan having already been declined by
|
|
313
|
-
* `
|
|
320
|
+
* `tryIndexAccessPlan` (store-module-access-plan.ts)). If backlog `feat-reopen-timespan-store-seeks`
|
|
314
321
|
* re-opens any arm, thread the column's transforms through first or the bounds will
|
|
315
322
|
* address raw-value bytes while the index holds transformed ones.
|
|
316
323
|
*/
|
|
317
|
-
export function buildIndexPrefixBounds(prefixValues, options, directions, transforms) {
|
|
324
|
+
export function buildIndexPrefixBounds(prefixValues, options, directions, collations, transforms) {
|
|
318
325
|
if (prefixValues.length === 0) {
|
|
319
326
|
return buildFullScanBounds();
|
|
320
327
|
}
|
|
321
|
-
const prefixEncoded = encodeCompositeKey(prefixValues, options, directions,
|
|
328
|
+
const prefixEncoded = encodeCompositeKey(prefixValues, options, directions, collations, transforms);
|
|
322
329
|
return {
|
|
323
330
|
gte: prefixEncoded,
|
|
324
331
|
lt: incrementLastByte(prefixEncoded),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-builder.js","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAA8C,MAAM,eAAe,CAAC;AAE1H,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,QAAQ;CACN,CAAC;AAEX,mCAAmC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD,iCAAiC;AACjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,GAAG,KAAe;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,IAAI,GAAG,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,+EAA+E;AAC/E,gFAAgF;AAChF,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,SAAiB;IACvE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAClC,UAAkB,EAClB,SAAiB,EACjB,SAAiB;IAEjB,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3D,OAAO,GAAG,UAAU,IAAI,SAAS,QAAQ,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,SAAiB;IACxE,OAAO,GAAG,UAAU,IAAI,SAAS,QAAQ,CAAC,WAAW,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,SAAiB;IAClE,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC3B,QAAoB,EACpB,OAAuB,EACvB,UAAmC,EACnC,UAA8C,EAC9C,UAAyD;IAEzD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAClF,CAAC;
|
|
1
|
+
{"version":3,"file":"key-builder.js","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,6 +90,16 @@ export interface WriteBatch {
|
|
|
90
90
|
* so for one (store, key) pair the later op wins. The coordinator replays its
|
|
91
91
|
* pending ops into one atomic batch without collapsing duplicates, so a
|
|
92
92
|
* transaction that writes then deletes the same row depends on this.
|
|
93
|
+
*
|
|
94
|
+
* SINGLE USE: a batch is spent once `write()` resolves — queue one commit's ops, write
|
|
95
|
+
* once, drop it (what the coordinator does). Reuse after `write()` is deliberately
|
|
96
|
+
* unspecified and backends differ: LevelDB's chained batch is closed by `write()` and
|
|
97
|
+
* throws on any later call, while IndexedDB's merely resets its op list and keeps working.
|
|
98
|
+
*
|
|
99
|
+
* NOTE: there is also no dispose — a batch that is built and then abandoned without
|
|
100
|
+
* `write()` (only reachable today if queueing throws MISUSE, i.e. a programming error)
|
|
101
|
+
* leaks whatever the backend holds until GC. If an abandoned-batch path ever becomes
|
|
102
|
+
* ordinary, give this interface a `close()` and make both behaviors conformance-tested.
|
|
93
103
|
*/
|
|
94
104
|
export interface AtomicBatch {
|
|
95
105
|
/** Queue a put against the given store. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-store.d.ts","sourceRoot":"","sources":["../../../src/common/kv-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,gEAAgE;IAChE,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,6BAA6B;IAC7B,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,2BAA2B;IAC3B,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,wDAAwD;IACxD,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IAC1B,mFAAmF;IACnF,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9C,sFAAsF;IACtF,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gDAAgD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;CACd;AAED
|
|
1
|
+
{"version":3,"file":"kv-store.d.ts","sourceRoot":"","sources":["../../../src/common/kv-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolution of the physical KEY properties of a table's primary-key and
|
|
3
|
+
* secondary-index columns: the per-column key collation, the key-identity value
|
|
4
|
+
* transform for semantic-ordering types, and the order-safety predicates that
|
|
5
|
+
* decide whether a byte window may stand in for a comparator range.
|
|
6
|
+
*
|
|
7
|
+
* Shared by the store table (data-key + index-maintenance encoding) and
|
|
8
|
+
* `StoreModule` (index rebuild, access planning) so key encoding can never drift
|
|
9
|
+
* between the two.
|
|
10
|
+
*/
|
|
11
|
+
import { type LogicalType, type Database, type ColumnSchema, type TableSchema, type TableIndexSchema, type SqlValue } from '@quereus/quereus';
|
|
12
|
+
import { type KeyValueTransform } from './encoding.js';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the per-column KEY collation for each primary-key column.
|
|
15
|
+
*
|
|
16
|
+
* The store encodes PRIMARY KEY uniqueness/ordering PHYSICALLY in the key bytes, so each
|
|
17
|
+
* text-capable PK column's key must be encoded under the collation the engine actually
|
|
18
|
+
* COMPARES that column under. Returns one entry per PK member, in `pkDef` order:
|
|
19
|
+
* - collation-aware member (`text`, `any` — the types whose `compare` applies the
|
|
20
|
+
* collation it is handed, `LogicalType.collationAware`) → its declared `collation`
|
|
21
|
+
* (normalized upper-case), or `fallback` (the table key collation K) when the
|
|
22
|
+
* column carries none.
|
|
23
|
+
* - text-capable but collation-blind member — `json` and the temporal types
|
|
24
|
+
* (`date` / `time` / `datetime` / `timespan`) → hard-coded `'BINARY'`: those
|
|
25
|
+
* types' `compare` is not the generic storage-class + collation comparison (the
|
|
26
|
+
* temporals ignore the argument; JSON ranks structurally), and their empty
|
|
27
|
+
* `supportedCollations` list keeps a non-BINARY column COLLATE out at DDL time.
|
|
28
|
+
* - never-text member → `undefined`: collation is meaningless for
|
|
29
|
+
* integer/real/blob keys (they encode type-natively), so the encoder ignores
|
|
30
|
+
* it and the data/index key bytes are identical regardless.
|
|
31
|
+
*
|
|
32
|
+
* Note that `undefined` does NOT mean "encode type-natively" to `encodeValue` — it means
|
|
33
|
+
* "fall back to `options.collation`", the table key collation K. Only a never-text column
|
|
34
|
+
* may be left `undefined`, because only it never reaches the collation branch.
|
|
35
|
+
*
|
|
36
|
+
* Every name returned here is encoded through the key-normalizer resolver carried
|
|
37
|
+
* in `EncodeOptions.normalizers` (`db.getKeyNormalizerResolver()`), so a collation
|
|
38
|
+
* registered or overridden with `db.registerCollation` produces key bytes that agree
|
|
39
|
+
* with the comparator the store's UNIQUE enforcement uses. A collation that cannot
|
|
40
|
+
* key — unregistered, or registered with a comparator but no normalizer — is rejected
|
|
41
|
+
* at DDL time by `StoreTableBase.validateKeyCollations`, so no encode call ever has
|
|
42
|
+
* to fall back. Shared by `StoreTable` (data-key + index-maintenance) and
|
|
43
|
+
* the index rebuild `buildIndexEntries` (store-module-index-build.ts) so the PK suffix
|
|
44
|
+
* encoding can never drift between the two.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolvePkKeyCollations(pkDef: ReadonlyArray<{
|
|
47
|
+
index: number;
|
|
48
|
+
}>, columns: ReadonlyArray<ColumnSchema>, fallback: string): (string | undefined)[];
|
|
49
|
+
/**
|
|
50
|
+
* Per-column KEY collation for a secondary index's OWN columns (the index half of
|
|
51
|
+
* `buildIndexKey`), positionally aligned with `index.columns` — the index twin of
|
|
52
|
+
* {@link resolvePkKeyCollations}. Same three-way branch, delegated to the engine's
|
|
53
|
+
* `pkKeyCollationName`:
|
|
54
|
+
* - never-text column (`integer`, `real`, `blob`) → `undefined`: encoded
|
|
55
|
+
* type-natively, collation is moot.
|
|
56
|
+
* - text-capable but collation-blind (`json`, the temporal types) → hard-coded
|
|
57
|
+
* `'BINARY'` — those types' `compare` is not the generic collation comparison.
|
|
58
|
+
* - collation-aware (`text`, `any`) → the index column's own COLLATE, else the
|
|
59
|
+
* table column's declared collation, else `'BINARY'`.
|
|
60
|
+
*
|
|
61
|
+
* The fallback is `BINARY`, NOT the table key collation K — deliberately asymmetric
|
|
62
|
+
* with {@link resolvePkKeyCollations}, whose fallback IS K. For a PK member the
|
|
63
|
+
* asymmetry is illusory: `reconcilePkCollations` (store-module-schema-rewrite.ts)
|
|
64
|
+
* rewrites an undecorated text PK column's declared collation to K at CREATE time, so
|
|
65
|
+
* for a PK member K *is* the declared collation. No such rewrite exists for non-PK
|
|
66
|
+
* columns — an undecorated `text` column genuinely compares under BINARY (in the
|
|
67
|
+
* engine's operators and in the store's `matchesFilters` residual alike), so BINARY is
|
|
68
|
+
* what its index bytes must encode under, or the stored order/equality disagrees with
|
|
69
|
+
* every comparison made against it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolveIndexKeyCollations(index: TableIndexSchema, columns: ReadonlyArray<ColumnSchema>): (string | undefined)[];
|
|
72
|
+
/**
|
|
73
|
+
* The store's per-type key VALUE TRANSFORM for a semantic-ordering logical type, or
|
|
74
|
+
* `undefined` when raw values already key faithfully.
|
|
75
|
+
*
|
|
76
|
+
* The contract is TWO-sided — identity AND order. `StoreTable` implements no
|
|
77
|
+
* `comparePrimaryKey`, so the isolation layer merges overlay against underlying with
|
|
78
|
+
* its own fallback comparator (the PK type's `compare` via `createTypedComparator`)
|
|
79
|
+
* and needs this table's key BYTE order to agree with it; and byte equality must be
|
|
80
|
+
* exactly the type's equality, or two spellings of one value land on two keys.
|
|
81
|
+
*
|
|
82
|
+
* - JSON → the store-local structural encoder ({@link jsonStructuralKey}): a
|
|
83
|
+
* `Uint8Array` whose memcmp order reproduces the type's structural `compare`
|
|
84
|
+
* (canonical-text bytes are identity-faithful but sort `[10]` before `[2]`,
|
|
85
|
+
* which broke overlay shadowing — see json-key.ts).
|
|
86
|
+
* - Everything else → the engine's {@link semanticKeyTransform} (the type's
|
|
87
|
+
* `groupKey`). Today that is TIMESPAN: total seconds against the same reference
|
|
88
|
+
* date as `TIMESPAN.compare`, so 'PT1H' and 'PT60M' collide on one key AND byte
|
|
89
|
+
* order is elapsed-time order.
|
|
90
|
+
*
|
|
91
|
+
* JSON deliberately gets NO engine `groupKey` — `groupKey` also drives GROUP BY /
|
|
92
|
+
* `IN` / hash-join identity, where canonical-text identity is already correct and a
|
|
93
|
+
* `Uint8Array` key would be a behaviour change for no benefit. Hence this
|
|
94
|
+
* store-local seam. A semantic-ordering type with NEITHER a `groupKey` nor an entry
|
|
95
|
+
* here cannot key a persisted structure soundly; `StoreTable` rejects it at DDL time
|
|
96
|
+
* (see `validateSemanticKeyTransforms`).
|
|
97
|
+
*
|
|
98
|
+
* This is the PHYSICAL KEY BYTES resolver — it feeds `buildIndexKey` / `buildDataKey`
|
|
99
|
+
* and its output is memcmp-ordered and persisted. {@link storeDedupeKeyTransform} is
|
|
100
|
+
* its build/validate-time twin: same job, but for the transient UNIQUE dedupe
|
|
101
|
+
* signature, which is free to leave a comparable value for `serializeKey`'s collation
|
|
102
|
+
* normalizer instead of committing to structural bytes.
|
|
103
|
+
*/
|
|
104
|
+
export declare function storeSemanticKeyTransform(type: LogicalType | undefined): KeyValueTransform | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* The build/validate-time twin of {@link storeSemanticKeyTransform}, for the UNIQUE
|
|
107
|
+
* dedupe SIGNATURE rather than physical key bytes (`buildIndexEntries`'s in-pass
|
|
108
|
+
* `seen` check and `assertNoDuplicateRows`, both in store-module-index-build.ts).
|
|
109
|
+
*
|
|
110
|
+
* The signature is a `serializeKey` call over the (possibly transformed) values, and
|
|
111
|
+
* `serializeKey` applies a column's collation NORMALIZER only to a raw `string` value
|
|
112
|
+
* — a transform that returns a `Uint8Array` (as {@link storeSemanticKeyTransform} does
|
|
113
|
+
* for JSON, via {@link jsonStructuralKey}) is tagged as an opaque byte array instead,
|
|
114
|
+
* and the normalizer never runs. For JSON that would silently drop the index
|
|
115
|
+
* COLLATE on exactly the case `JSON_TYPE.compare` treats as text (a string-scalar
|
|
116
|
+
* pair) and let a build-time UNIQUE index admit rows a write-time insert would then
|
|
117
|
+
* reject (bug-store-index-build-dedupe-skips-collation) — so this resolver special-
|
|
118
|
+
* cases JSON: a string scalar is left AS a string, so `serializeKey`'s normalizer
|
|
119
|
+
* still runs; every other JSON value (object, array, number, boolean, or null) falls
|
|
120
|
+
* back to the structural bytes, matching `JSON_TYPE.compare`'s non-text ranking.
|
|
121
|
+
*
|
|
122
|
+
* Every other semantic-ordering type (TIMESPAN today) is unaffected: its `compare`
|
|
123
|
+
* ignores the collation it is handed, and its `groupKey` transform already collides
|
|
124
|
+
* every equal-identity spelling onto one value on both the build and write paths, so
|
|
125
|
+
* this resolver defers to {@link storeSemanticKeyTransform} unchanged.
|
|
126
|
+
*/
|
|
127
|
+
export declare function storeDedupeKeyTransform(type: LogicalType | undefined): KeyValueTransform | undefined;
|
|
128
|
+
/**
|
|
129
|
+
* Resolve the per-column key value transform for each primary-key column —
|
|
130
|
+
* {@link storeSemanticKeyTransform} of the member's logical type. One entry per PK
|
|
131
|
+
* member in `pkDef` order; `undefined` for every type whose raw value already keys
|
|
132
|
+
* faithfully. The companion of {@link resolvePkKeyCollations}: every call site that
|
|
133
|
+
* threads the collations MUST thread these too, or key identity/order drifts
|
|
134
|
+
* between the write path and the rebuild/lookup path.
|
|
135
|
+
*/
|
|
136
|
+
export declare function resolvePkKeyTransforms(pkDef: ReadonlyArray<{
|
|
137
|
+
index: number;
|
|
138
|
+
}>, columns: ReadonlyArray<ColumnSchema>): (KeyValueTransform | undefined)[];
|
|
139
|
+
/**
|
|
140
|
+
* Per-column key value transforms for a secondary index's OWN columns (the
|
|
141
|
+
* index half of `buildIndexKey`), positionally aligned with `index.columns`.
|
|
142
|
+
* Same rule as {@link resolvePkKeyTransforms}: a semantic-ordering member
|
|
143
|
+
* canonicalizes through {@link storeSemanticKeyTransform}, everything else
|
|
144
|
+
* encodes raw.
|
|
145
|
+
*/
|
|
146
|
+
export declare function resolveIndexKeyTransforms(index: TableIndexSchema, columns: ReadonlyArray<ColumnSchema>): (KeyValueTransform | undefined)[];
|
|
147
|
+
/**
|
|
148
|
+
* Per-column {@link storeDedupeKeyTransform} for an arbitrary column-index list —
|
|
149
|
+
* the UNIQUE dedupe-signature counterpart of {@link resolveIndexKeyTransforms},
|
|
150
|
+
* shared by both build/validate-time dedupe sites (`buildIndexEntries`' in-pass
|
|
151
|
+
* `seen` check over an index's columns, `assertNoDuplicateRows` over a constraint's)
|
|
152
|
+
* so the two cannot drift onto different transforms.
|
|
153
|
+
*/
|
|
154
|
+
export declare function resolveDedupeKeyTransforms(colIndices: ReadonlyArray<number>, columns: ReadonlyArray<ColumnSchema>): (KeyValueTransform | undefined)[];
|
|
155
|
+
/**
|
|
156
|
+
* Per-PK-column typed equality comparator for semantic-ordering members, `undefined`
|
|
157
|
+
* elsewhere. Backs `StoreTableConstraints.keysEqual`: two PK arrays naming the same
|
|
158
|
+
* physical key under {@link resolvePkKeyTransforms} ('PT1H' / 'PT60M') must also
|
|
159
|
+
* answer "same row" here, or self-PK exclusion in the UNIQUE checks false-conflicts
|
|
160
|
+
* a row against its own differently-spelled image.
|
|
161
|
+
*/
|
|
162
|
+
export declare function resolvePkSemanticEquality(pkDef: ReadonlyArray<{
|
|
163
|
+
index: number;
|
|
164
|
+
}>, columns: ReadonlyArray<ColumnSchema>): (((a: SqlValue, b: SqlValue) => number) | undefined)[];
|
|
165
|
+
/**
|
|
166
|
+
* True when `col` can produce a TEXT value at runtime, and so when its physical
|
|
167
|
+
* key bytes are produced by a collation normalizer rather than a type-native
|
|
168
|
+
* encoding. The `ColumnSchema`-shaped wrapper over the engine's
|
|
169
|
+
* {@link logicalTypeCanHoldText}; both collation-safety guards over the store's
|
|
170
|
+
* secondary indexes — the write-side `StoreTableConstraints.indexSeekHonorsEnforcementCollation`
|
|
171
|
+
* and the read-side {@link keyOrderMatchesCollation} — exempt a never-text column from their
|
|
172
|
+
* key-vs-comparison collation test, so a false "non-text" answer is a silent wrong-result
|
|
173
|
+
* (a seek under the wrong collation, with the residual dropped).
|
|
174
|
+
*/
|
|
175
|
+
export declare function columnCanHoldText(col: ColumnSchema | undefined): boolean;
|
|
176
|
+
/**
|
|
177
|
+
* True when a byte window — or a byte-order advertisement — over `column` is SOUND.
|
|
178
|
+
*
|
|
179
|
+
* The store physically orders rows by memcmp of each column's key bytes, which for a
|
|
180
|
+
* text-capable column are produced by `keyCollation`'s normalizer. A range seek (and the
|
|
181
|
+
* `providesOrdering` / `monotonicOn` advertisement) equates that byte order with the order
|
|
182
|
+
* `compareCollation`'s comparator defines. Two things must hold for that equation:
|
|
183
|
+
*
|
|
184
|
+
* - **Same collation on both sides** (`compareCollation === keyCollation`). A `keyCollation`
|
|
185
|
+
* merely COARSER than `compareCollation` is not enough: it would need the key normalizer
|
|
186
|
+
* to be monotone with respect to the OTHER collation's order. It generally is not, even
|
|
187
|
+
* for built-ins: with `keyCollation = NOCASE` and `compareCollation = BINARY`,
|
|
188
|
+
* 'K' (U+212A KELVIN SIGN) is `> 'z'` under BINARY, yet its key bytes are
|
|
189
|
+
* `toLowerCase('K') = 'k'`, which sorts BEFORE 'z' — the row falls outside a `> 'z'`
|
|
190
|
+
* window and is silently dropped.
|
|
191
|
+
* - **The normalizer preserves order** (`db._isCollationOrderPreserving`). `registerCollation`
|
|
192
|
+
* promises only that a normalizer partitions strings the way the comparator calls them
|
|
193
|
+
* equal; a custom pair may agree on equality and disagree on order.
|
|
194
|
+
*
|
|
195
|
+
* A never-text column is exempt: its key bytes are type-native and collation-independent.
|
|
196
|
+
*
|
|
197
|
+
* Returning `false` costs an optimization (the caller full-scans and lets the
|
|
198
|
+
* collation-aware `matchesFilters` residual decide); returning `true` wrongly is a silent
|
|
199
|
+
* wrong-result. Shared by `StoreTable`'s read arms and `StoreModule`'s access planner so the
|
|
200
|
+
* "mark handled" and "build a window" decisions can never disagree.
|
|
201
|
+
*
|
|
202
|
+
* The PK caller ({@link pkOrderPreservingPrefixLength}) can genuinely pass two DIFFERENT
|
|
203
|
+
* collations, because {@link resolvePkKeyCollations} still falls back to the table key
|
|
204
|
+
* collation K for an undecorated text PK member. The secondary-index caller
|
|
205
|
+
* ({@link indexLeadingRangeIsOrderSafe}) usually passes the same name on both sides — index
|
|
206
|
+
* key bytes encode under the index column's own effective collation, which is what the scan
|
|
207
|
+
* residual re-compares under — so for a `text` or `any` column it reduces to the
|
|
208
|
+
* `orderPreserving` assertion alone. The one index shape where the two sides still differ is
|
|
209
|
+
* a collation-blind column (`json`, the temporal types) under an index column carrying an
|
|
210
|
+
* explicit non-BINARY COLLATE (index DDL does not type-gate the way column DDL does): its
|
|
211
|
+
* key bytes are hard-`BINARY` while its residual compares under the declared name, and this
|
|
212
|
+
* predicate correctly declines it.
|
|
213
|
+
*/
|
|
214
|
+
export declare function keyOrderMatchesCollation(db: Database, column: ColumnSchema | undefined, keyCollation: string, compareCollation: string): boolean;
|
|
215
|
+
/**
|
|
216
|
+
* True when an EQUALITY/prefix byte window over the leading `prefixLength` columns of
|
|
217
|
+
* secondary `index` is EXACTLY the qualifying set — the condition under which the access
|
|
218
|
+
* planner may claim the equality filters handled and drop the residual Filter.
|
|
219
|
+
*
|
|
220
|
+
* `keyCollations` is {@link resolveIndexKeyCollations}' output for `index` (the scan passes
|
|
221
|
+
* its memoized copy, the access planner resolves one on the spot): the collation each
|
|
222
|
+
* position's key bytes are ACTUALLY encoded under. The window equals the qualifying set iff
|
|
223
|
+
* that agrees, per position, with {@link indexResidualCollation}.
|
|
224
|
+
*
|
|
225
|
+
* For a `text` or `any` column the two agree by construction — both resolve to the index
|
|
226
|
+
* `COLLATE` else the declared collation else BINARY — so those admit, including the
|
|
227
|
+
* `text` column of a table whose key collation K is something else entirely, and an
|
|
228
|
+
* `x any collate nocase` index column (whose window is now genuinely the NOCASE-equal
|
|
229
|
+
* set — ANY's `compare` honors the collation, so key bytes, residual, and enforcement
|
|
230
|
+
* all agree). The shape that does NOT agree is a collation-blind column (`json`, the
|
|
231
|
+
* temporal types) under an index column carrying an explicit non-BINARY COLLATE:
|
|
232
|
+
* `pkKeyCollationName` keys those hard-`BINARY` while the residual still compares under
|
|
233
|
+
* the declared name, so the window would be byte-equal only and miss rows the residual
|
|
234
|
+
* admits — declined. Never-text columns are exempt — their key bytes are type-native.
|
|
235
|
+
*/
|
|
236
|
+
export declare function indexPrefixSeekIsCollationExact(columns: ReadonlyArray<ColumnSchema>, index: TableIndexSchema, keyCollations: ReadonlyArray<string | undefined>, prefixLength: number): boolean;
|
|
237
|
+
/**
|
|
238
|
+
* True when a byte RANGE window over the LEADING column of secondary `index` is SOUND.
|
|
239
|
+
*
|
|
240
|
+
* Strictly stronger than {@link indexPrefixSeekIsCollationExact} at position 0: the same
|
|
241
|
+
* key-vs-residual collation agreement, PLUS the collation's `orderPreserving` assertion,
|
|
242
|
+
* because a range window also equates memcmp of the key bytes with the residual
|
|
243
|
+
* comparator's ORDER. Both halves are {@link keyOrderMatchesCollation}, which also declines
|
|
244
|
+
* a semantic-ordering column outright.
|
|
245
|
+
*
|
|
246
|
+
* THE shared predicate for the two decision sites: `tryIndexAccessPlan`
|
|
247
|
+
* (store-module-access-plan.ts) marks the range filters handled only when it holds, and
|
|
248
|
+
* `StoreTableScan.analyzeIndexAccess` builds a window only when it holds. They must agree —
|
|
249
|
+
* a plan that claims a filter the scan then declines to window loses the residual Filter and
|
|
250
|
+
* returns the whole table — so they call this rather than each restating it.
|
|
251
|
+
*/
|
|
252
|
+
export declare function indexLeadingRangeIsOrderSafe(db: Database, columns: ReadonlyArray<ColumnSchema>, index: TableIndexSchema, keyCollations: ReadonlyArray<string | undefined>): boolean;
|
|
253
|
+
/**
|
|
254
|
+
* How many LEADING primary-key members have key bytes whose memcmp order matches their
|
|
255
|
+
* declared collation's comparator order, per {@link keyOrderMatchesCollation}.
|
|
256
|
+
*
|
|
257
|
+
* `pkKeyCollations` is {@link resolvePkKeyCollations}' output for this table; an `undefined`
|
|
258
|
+
* entry belongs to a never-text member, which {@link keyOrderMatchesCollation} exempts
|
|
259
|
+
* outright — `tableKeyCollation` is passed only so the exempt branch has a name to ignore.
|
|
260
|
+
* The comparison collation is the column's declared one, which `reconcilePkCollations` has
|
|
261
|
+
* already aligned with the key collation for every *textual* PK member.
|
|
262
|
+
*
|
|
263
|
+
* What the advertisement is measured against is the order the planner's `Sort` would have
|
|
264
|
+
* produced. For most members Sort orders under the operand's COLLATION, so a collation match
|
|
265
|
+
* is the question; for a member whose logical type carries SEMANTIC ordering (TIMESPAN, JSON
|
|
266
|
+
* — see docs/types.md "Semantic ordering") Sort now ranks by `logicalType.compare`, which no
|
|
267
|
+
* text-byte encoding reproduces, and {@link keyOrderMatchesCollation} closes the gate for
|
|
268
|
+
* such members outright (the memory backend's typed BTree order is the canonical order under
|
|
269
|
+
* that ruling; the store declines rather than advertising a divergent byte order).
|
|
270
|
+
*
|
|
271
|
+
* `0` ⇒ even the leading member is unsafe: no range seek, no PK-order advertisement.
|
|
272
|
+
* A prefix shorter than the PK truncates the ordering advertisement rather than voiding it.
|
|
273
|
+
*/
|
|
274
|
+
export declare function pkOrderPreservingPrefixLength(db: Database, schema: TableSchema, pkKeyCollations: ReadonlyArray<string | undefined>, tableKeyCollation: string): number;
|
|
275
|
+
//# sourceMappingURL=pk-key-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pk-key-resolution.d.ts","sourceRoot":"","sources":["../../../src/common/pk-key-resolution.ts"],"names":[],"mappings":"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"}
|