@wavehouse/chtypes 0.5.2 → 1.0.2
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/CHANGELOG.md +34 -0
- package/README.md +34 -38
- package/dist/abi1/buildinfo.d.ts +40 -0
- package/dist/abi1/buildinfo.d.ts.map +1 -0
- package/dist/abi1/buildinfo.js +83 -0
- package/dist/abi1/buildinfo.js.map +1 -0
- package/dist/abi1/calls.gen.d.ts +55 -0
- package/dist/abi1/calls.gen.d.ts.map +1 -0
- package/dist/abi1/calls.gen.js +110 -0
- package/dist/abi1/calls.gen.js.map +1 -0
- package/dist/abi1/decls.gen.d.ts +115 -0
- package/dist/abi1/decls.gen.d.ts.map +1 -0
- package/dist/abi1/decls.gen.js +1613 -0
- package/dist/abi1/decls.gen.js.map +1 -0
- package/dist/abi1/errmap.gen.d.ts +18 -0
- package/dist/abi1/errmap.gen.d.ts.map +1 -0
- package/dist/abi1/errmap.gen.js +66 -0
- package/dist/abi1/errmap.gen.js.map +1 -0
- package/dist/abi1/errors.d.ts +107 -0
- package/dist/abi1/errors.d.ts.map +1 -0
- package/dist/abi1/errors.js +134 -0
- package/dist/abi1/errors.js.map +1 -0
- package/dist/abi1/handles.d.ts +31 -0
- package/dist/abi1/handles.d.ts.map +1 -0
- package/dist/abi1/handles.js +76 -0
- package/dist/abi1/handles.js.map +1 -0
- package/dist/abi1/index.d.ts +17 -0
- package/dist/abi1/index.d.ts.map +1 -0
- package/dist/abi1/index.js +17 -0
- package/dist/abi1/index.js.map +1 -0
- package/dist/abi1/libc.d.ts +54 -0
- package/dist/abi1/libc.d.ts.map +1 -0
- package/dist/abi1/libc.gen.d.ts +12 -0
- package/dist/abi1/libc.gen.d.ts.map +1 -0
- package/dist/abi1/libc.gen.js +75 -0
- package/dist/abi1/libc.gen.js.map +1 -0
- package/dist/abi1/libc.js +109 -0
- package/dist/abi1/libc.js.map +1 -0
- package/dist/abi1/loader.d.ts +101 -0
- package/dist/abi1/loader.d.ts.map +1 -0
- package/dist/abi1/loader.js +274 -0
- package/dist/abi1/loader.js.map +1 -0
- package/dist/abi1/raw.d.ts +104 -0
- package/dist/abi1/raw.d.ts.map +1 -0
- package/dist/abi1/raw.js +296 -0
- package/dist/abi1/raw.js.map +1 -0
- package/dist/abi1/strictjson.d.ts +19 -0
- package/dist/abi1/strictjson.d.ts.map +1 -0
- package/dist/abi1/strictjson.js +78 -0
- package/dist/abi1/strictjson.js.map +1 -0
- package/dist/abi1/vocab.gen.d.ts +169 -0
- package/dist/abi1/vocab.gen.d.ts.map +1 -0
- package/dist/abi1/vocab.gen.js +306 -0
- package/dist/abi1/vocab.gen.js.map +1 -0
- package/dist/cli.d.ts +25 -26
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +206 -218
- package/dist/cli.js.map +1 -1
- package/dist/documents.d.ts +195 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +389 -0
- package/dist/documents.js.map +1 -0
- package/dist/env.d.ts +16 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +57 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +19 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -23
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +11 -89
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js +16 -180
- package/dist/json.js.map +1 -1
- package/dist/library.d.ts +53 -309
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +77 -315
- package/dist/library.js.map +1 -1
- package/dist/ocifetch/constants.gen.d.ts +84 -0
- package/dist/ocifetch/constants.gen.d.ts.map +1 -0
- package/dist/ocifetch/constants.gen.js +92 -0
- package/dist/ocifetch/constants.gen.js.map +1 -0
- package/dist/ocifetch/dsse.d.ts +114 -0
- package/dist/ocifetch/dsse.d.ts.map +1 -0
- package/dist/ocifetch/dsse.js +331 -0
- package/dist/ocifetch/dsse.js.map +1 -0
- package/dist/ocifetch/ensure.d.ts +65 -0
- package/dist/ocifetch/ensure.d.ts.map +1 -0
- package/dist/ocifetch/ensure.js +775 -0
- package/dist/ocifetch/ensure.js.map +1 -0
- package/dist/ocifetch/errors.d.ts +92 -0
- package/dist/ocifetch/errors.d.ts.map +1 -0
- package/dist/ocifetch/errors.js +101 -0
- package/dist/ocifetch/errors.js.map +1 -0
- package/dist/ocifetch/goldens.d.ts +44 -0
- package/dist/ocifetch/goldens.d.ts.map +1 -0
- package/dist/ocifetch/goldens.js +62 -0
- package/dist/ocifetch/goldens.js.map +1 -0
- package/dist/ocifetch/http.d.ts +124 -0
- package/dist/ocifetch/http.d.ts.map +1 -0
- package/dist/ocifetch/http.js +549 -0
- package/dist/ocifetch/http.js.map +1 -0
- package/dist/ocifetch/index.d.ts +17 -0
- package/dist/ocifetch/index.d.ts.map +1 -0
- package/dist/ocifetch/index.js +14 -0
- package/dist/ocifetch/index.js.map +1 -0
- package/dist/ocifetch/layout.d.ts +126 -0
- package/dist/ocifetch/layout.d.ts.map +1 -0
- package/dist/ocifetch/layout.js +375 -0
- package/dist/ocifetch/layout.js.map +1 -0
- package/dist/ocifetch/localverify.d.ts +43 -0
- package/dist/ocifetch/localverify.d.ts.map +1 -0
- package/dist/ocifetch/localverify.js +164 -0
- package/dist/ocifetch/localverify.js.map +1 -0
- package/dist/ocifetch/lock.d.ts +39 -0
- package/dist/ocifetch/lock.d.ts.map +1 -0
- package/dist/ocifetch/lock.js +140 -0
- package/dist/ocifetch/lock.js.map +1 -0
- package/dist/ocifetch/oci.d.ts +100 -0
- package/dist/ocifetch/oci.d.ts.map +1 -0
- package/dist/ocifetch/oci.js +323 -0
- package/dist/ocifetch/oci.js.map +1 -0
- package/dist/ocifetch/referrers.d.ts +55 -0
- package/dist/ocifetch/referrers.d.ts.map +1 -0
- package/dist/ocifetch/referrers.js +132 -0
- package/dist/ocifetch/referrers.js.map +1 -0
- package/dist/ocifetch/types.d.ts +167 -0
- package/dist/ocifetch/types.d.ts.map +1 -0
- package/dist/ocifetch/types.js +88 -0
- package/dist/ocifetch/types.js.map +1 -0
- package/dist/ocifetch/unpack.d.ts +55 -0
- package/dist/ocifetch/unpack.d.ts.map +1 -0
- package/dist/ocifetch/unpack.js +205 -0
- package/dist/ocifetch/unpack.js.map +1 -0
- package/dist/registry.d.ts +38 -387
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +95 -819
- package/dist/registry.js.map +1 -1
- package/dist/schema.d.ts +77 -588
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +87 -549
- package/dist/schema.js.map +1 -1
- package/dist/settings.d.ts +27 -36
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +75 -25
- package/dist/settings.js.map +1 -1
- package/dist/setup.d.ts +46 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +79 -0
- package/dist/setup.js.map +1 -0
- package/dist/tar.d.ts +27 -11
- package/dist/tar.d.ts.map +1 -1
- package/dist/tar.js +54 -32
- package/dist/tar.js.map +1 -1
- package/package.json +2 -2
- package/dist/discover.d.ts +0 -142
- package/dist/discover.d.ts.map +0 -1
- package/dist/discover.js +0 -288
- package/dist/discover.js.map +0 -1
- package/dist/error-codes.d.ts +0 -80
- package/dist/error-codes.d.ts.map +0 -1
- package/dist/error-codes.js +0 -139
- package/dist/error-codes.js.map +0 -1
- package/dist/errors.d.ts +0 -284
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -321
- package/dist/errors.js.map +0 -1
- package/dist/fetch.d.ts +0 -382
- package/dist/fetch.d.ts.map +0 -1
- package/dist/fetch.js +0 -1498
- package/dist/fetch.js.map +0 -1
- package/dist/ffi.d.ts +0 -410
- package/dist/ffi.d.ts.map +0 -1
- package/dist/ffi.js +0 -1154
- package/dist/ffi.js.map +0 -1
- package/dist/format.d.ts +0 -128
- package/dist/format.d.ts.map +0 -1
- package/dist/format.js +0 -132
- package/dist/format.js.map +0 -1
- package/dist/numeric.d.ts +0 -20
- package/dist/numeric.d.ts.map +0 -1
- package/dist/numeric.js +0 -107
- package/dist/numeric.js.map +0 -1
- package/dist/paths.d.ts +0 -55
- package/dist/paths.d.ts.map +0 -1
- package/dist/paths.js +0 -87
- package/dist/paths.js.map +0 -1
- package/dist/results.d.ts +0 -495
- package/dist/results.d.ts.map +0 -1
- package/dist/results.js +0 -406
- package/dist/results.js.map +0 -1
- package/dist/transform.d.ts +0 -73
- package/dist/transform.d.ts.map +0 -1
- package/dist/transform.js +0 -533
- package/dist/transform.js.map +0 -1
package/dist/transform.js
DELETED
|
@@ -1,533 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Silent-transformation detection — a port of `go/chtypes/transform.go`.
|
|
3
|
-
*
|
|
4
|
-
* ClickHouse has no notion of "I changed your value": `readIntText` wraps mod
|
|
5
|
-
* 2^N, `SerializationDateTime` truncates, `parseUUID` maps every non-hex byte to
|
|
6
|
-
* 0xff, and all of it returns success. So the fact of a change has to be
|
|
7
|
-
* established from outside, and this is the one part of chtypes that is derived
|
|
8
|
-
* rather than executed by ClickHouse — which makes it the one part a binding can
|
|
9
|
-
* get wrong without the C library noticing. Omitting it scores 0 % recall on the
|
|
10
|
-
* arbiter's transformation axis regardless of everything else.
|
|
11
|
-
*
|
|
12
|
-
* Two independent detectors run and their union is reported:
|
|
13
|
-
*
|
|
14
|
-
* 1. **Supplied vs stored** — the raw input text against ClickHouse's rendering
|
|
15
|
-
* of what it kept. Models nothing; catches changes a widened type makes
|
|
16
|
-
* identically (2024-02-30 -> 2024-03-01) and types with no wider type to
|
|
17
|
-
* compare against (Float64, Int256, String).
|
|
18
|
-
* 2. **Reference type** — the C layer already parsed each field a second time
|
|
19
|
-
* through a structurally identical type with widened leaves and reported it
|
|
20
|
-
* as `ref` / `ref_type`. This names the reason precisely (an overflow wrap
|
|
21
|
-
* versus a decimal truncation) and still fires where the supplied text is
|
|
22
|
-
* not comparable (a CSV field, a base64 blob).
|
|
23
|
-
*
|
|
24
|
-
* Neither reimplements a coercion rule: the first compares two values already in
|
|
25
|
-
* hand, the second compares two ClickHouse answers.
|
|
26
|
-
*
|
|
27
|
-
* Both compare **bytes**. A supplied field and a stored `String` can each be any
|
|
28
|
-
* byte sequence, and two different byte sequences that both decode to U+FFFD are
|
|
29
|
-
* not the same value — deciding on decoded text would silently merge them, and
|
|
30
|
-
* `equivalent`'s fast path would then call a real change identical.
|
|
31
|
-
*/
|
|
32
|
-
import { parseJsonValue } from './json.js';
|
|
33
|
-
import { denormal, isNumericText, numEqual, parseRational, trimQuotes } from './numeric.js';
|
|
34
|
-
/** The stable reason vocabulary. The harness groups on these strings. */
|
|
35
|
-
export const Reason = {
|
|
36
|
-
OverflowWrap: 'overflow_wrap',
|
|
37
|
-
NullToDefault: 'null_to_default',
|
|
38
|
-
NullLoss: 'null_loss',
|
|
39
|
-
DecimalTruncate: 'decimal_truncate',
|
|
40
|
-
DateClamp: 'date_clamp',
|
|
41
|
-
DateTimeWrap: 'datetime_wrap',
|
|
42
|
-
DateShift: 'date_shift',
|
|
43
|
-
UuidMangle: 'uuid_mangle',
|
|
44
|
-
IpMangle: 'ip_mangle',
|
|
45
|
-
FloatPrecision: 'float_precision',
|
|
46
|
-
LossyNumeric: 'lossy_numeric',
|
|
47
|
-
FixedStringPad: 'fixedstring_pad',
|
|
48
|
-
Emptied: 'emptied',
|
|
49
|
-
ElementChanged: 'element_changed',
|
|
50
|
-
EnumCoerce: 'enum_coerce',
|
|
51
|
-
ValueChanged: 'value_changed',
|
|
52
|
-
Poisoned: 'poisoned',
|
|
53
|
-
DuplicateKeyDropped: 'duplicate_key_dropped',
|
|
54
|
-
Reformat: 'reformat',
|
|
55
|
-
DefaultFilled: 'default_filled',
|
|
56
|
-
ZeroFilled: 'zero_filled',
|
|
57
|
-
DefaultMaterialized: 'default_materialized',
|
|
58
|
-
TtlExpired: 'ttl_expired',
|
|
59
|
-
TtlColumnExpired: 'ttl_column_expired',
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Four reasons change how a value is written, or add one the row never carried,
|
|
63
|
-
* without losing information. Everything else is a warning. All of them are
|
|
64
|
-
* still reported: a preview must show the tenant what the table will hold, and
|
|
65
|
-
* 1700000000 becoming "2023-11-14 22:13:20" is a visible change.
|
|
66
|
-
*/
|
|
67
|
-
const NON_LOSSY = new Set([
|
|
68
|
-
Reason.Reformat,
|
|
69
|
-
Reason.DefaultFilled,
|
|
70
|
-
Reason.ZeroFilled,
|
|
71
|
-
Reason.DefaultMaterialized,
|
|
72
|
-
]);
|
|
73
|
-
/**
|
|
74
|
-
* Whether a transform reason means information was LOST (a warning to raise to
|
|
75
|
-
* the tenant) rather than merely re-spelled or filled in. False for exactly
|
|
76
|
-
* four reasons — `reformat`, `default_filled`, `zero_filled`,
|
|
77
|
-
* `default_materialized` — true for everything else, unknown strings included:
|
|
78
|
-
* a reason nobody has audited must degrade to a warning, never to silence.
|
|
79
|
-
* Mirrors `Transform#lossy`. Never throws.
|
|
80
|
-
*/
|
|
81
|
-
export function isLossyReason(reason) {
|
|
82
|
-
return !NON_LOSSY.has(reason);
|
|
83
|
-
}
|
|
84
|
-
const EMPTY = Buffer.alloc(0);
|
|
85
|
-
const UNREADABLE = Buffer.from('<unreadable>', 'utf8');
|
|
86
|
-
/**
|
|
87
|
-
* One reported change. Built from bytes, with the text spellings derived — so a
|
|
88
|
-
* consumer that can take bytes never sees a U+FFFD this binding invented.
|
|
89
|
-
*/
|
|
90
|
-
function transform(column, input, stored, reason) {
|
|
91
|
-
return {
|
|
92
|
-
column,
|
|
93
|
-
input: input.toString('utf8'),
|
|
94
|
-
stored: stored.toString('utf8'),
|
|
95
|
-
inputBytes: input,
|
|
96
|
-
storedBytes: stored,
|
|
97
|
-
reason,
|
|
98
|
-
row: 0,
|
|
99
|
-
lossy: isLossyReason(reason),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/** Classify one column of a row document. */
|
|
103
|
-
export function classify(c) {
|
|
104
|
-
switch (c.src) {
|
|
105
|
-
case 'skipped':
|
|
106
|
-
case 'default_expr_unsupported':
|
|
107
|
-
case 'default_volatile_unresolved':
|
|
108
|
-
case 'default_pending':
|
|
109
|
-
// Source.EphemeralInput (issue #97): a listed EPHEMERAL column's value
|
|
110
|
-
// is read but never stored, so — like 'skipped' — there is no stored
|
|
111
|
-
// value to have silently changed. NOT Source.MaterializedInput: under
|
|
112
|
-
// insert_allow_materialized_columns=1 that value IS stored, replacing
|
|
113
|
-
// the column's expression, and must still be classified.
|
|
114
|
-
case 'ephemeral_input':
|
|
115
|
-
return [];
|
|
116
|
-
default:
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
// The accept-then-poison class: ClickHouse stores a value it cannot read back.
|
|
120
|
-
// Not a changed value — a destroyed one — but silent at insert time.
|
|
121
|
-
if (c.poison) {
|
|
122
|
-
return [transform(c.name, c.inputBytes, UNREADABLE, Reason.Poisoned)];
|
|
123
|
-
}
|
|
124
|
-
const stored = c.storedBytes;
|
|
125
|
-
// A duplicate key whose later value ClickHouse discarded. Reported first
|
|
126
|
-
// because the value comparison below sees only the value that survived.
|
|
127
|
-
if (c.dupDropped) {
|
|
128
|
-
return [transform(c.name, c.inputBytes, stored, Reason.DuplicateKeyDropped)];
|
|
129
|
-
}
|
|
130
|
-
// A column the row did not supply that ClickHouse populated. Input is empty —
|
|
131
|
-
// an absent column has none — and the reason says where the value came from.
|
|
132
|
-
switch (c.src) {
|
|
133
|
-
case 'default':
|
|
134
|
-
return [transform(c.name, EMPTY, stored, Reason.DefaultFilled)];
|
|
135
|
-
case 'default_substituted':
|
|
136
|
-
return [transform(c.name, EMPTY, stored, Reason.DefaultMaterialized)];
|
|
137
|
-
case 'absent':
|
|
138
|
-
return [transform(c.name, EMPTY, stored, Reason.ZeroFilled)];
|
|
139
|
-
default:
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
// ---- detector 2: reference type. Run first because it names the reason.
|
|
143
|
-
let refReason = '';
|
|
144
|
-
if (c.refType !== '' && c.refBytes.length > 0 && !equivalent(c.base, stored, c.refBytes)) {
|
|
145
|
-
refReason = reasonFor(c.base, c.stored, c.ref);
|
|
146
|
-
}
|
|
147
|
-
// ---- detector 1: supplied vs stored.
|
|
148
|
-
let suppliedReason = '';
|
|
149
|
-
if (c.src === 'input') {
|
|
150
|
-
const sup = parseJsonValue(c.inputBytes);
|
|
151
|
-
const st = parseJsonValue(stored);
|
|
152
|
-
if (sup !== null && st !== null) {
|
|
153
|
-
if (!sameValue(sup, st)) {
|
|
154
|
-
suppliedReason = severity(sup, st);
|
|
155
|
-
}
|
|
156
|
-
else if (!sameKindDeep(sup, st)) {
|
|
157
|
-
// Same value, different JSON type: "1024" -> 1024, or a number inside an
|
|
158
|
-
// Array(Map(String,String)) coming back as a string. Nothing is lost, but
|
|
159
|
-
// the preview and the table disagree on the type, and the check has to
|
|
160
|
-
// recurse: the change is often inside a container.
|
|
161
|
-
suppliedReason = Reason.Reformat;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
else if (c.nullInput && !c.nullable) {
|
|
165
|
-
// A null the format layer replaced with a default. In CSV/TSV the raw text
|
|
166
|
-
// is `\N`, which is not JSON, so it never reaches the branch above — and
|
|
167
|
-
// this is the single largest lossy class.
|
|
168
|
-
suppliedReason = Reason.NullToDefault;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (refReason === '' && suppliedReason === '')
|
|
172
|
-
return [];
|
|
173
|
-
// Prefer the reference detector's reason — it can tell an overflow wrap from a
|
|
174
|
-
// decimal truncation — but never let it downgrade a lossy finding to reformat.
|
|
175
|
-
let reason = refReason;
|
|
176
|
-
if (reason === '' || (reason === Reason.Reformat && suppliedReason !== '')) {
|
|
177
|
-
reason = suppliedReason;
|
|
178
|
-
}
|
|
179
|
-
// An unclassified numeric/temporal leaf (no reference-ladder entry in the
|
|
180
|
-
// C layer): the precise detector never ran, so a visible change cannot be
|
|
181
|
-
// vouched non-lossy. Claim lossy rather than hide a possible loss.
|
|
182
|
-
if (c.refUnclassified && reason === Reason.Reformat) {
|
|
183
|
-
reason = Reason.ValueChanged;
|
|
184
|
-
}
|
|
185
|
-
return [transform(c.name, c.inputBytes, stored, reason)];
|
|
186
|
-
}
|
|
187
|
-
// ------------------------------------------------------ supplied vs stored
|
|
188
|
-
/** A scalar's own bytes, and whether it was a JSON string rather than a number. */
|
|
189
|
-
function scalar(v) {
|
|
190
|
-
switch (v.kind) {
|
|
191
|
-
case 'number':
|
|
192
|
-
return { bytes: v.bytes, isString: false };
|
|
193
|
-
case 'string':
|
|
194
|
-
return { bytes: v.bytes, isString: true };
|
|
195
|
-
default:
|
|
196
|
-
return { bytes: EMPTY, isString: false };
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
function scalarText(v) {
|
|
200
|
-
const s = scalar(v);
|
|
201
|
-
return { text: s.bytes.toString('utf8'), isString: s.isString };
|
|
202
|
-
}
|
|
203
|
-
function isNumericValue(v) {
|
|
204
|
-
const { text } = scalarText(v);
|
|
205
|
-
return text !== '' && isNumericText(text);
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* An object's members as a map, later keys winning — which is what a JS object,
|
|
209
|
-
* Go's `map[string]any` and the arbiter's `json.loads` all do, so the comparison
|
|
210
|
-
* here means the same thing as the harness's. The raw bytes keep the duplicates
|
|
211
|
-
* (`rawBytes`); only this comparison collapses them.
|
|
212
|
-
*
|
|
213
|
-
* Keys are mapped through latin1, the one JS encoding that round-trips arbitrary
|
|
214
|
-
* bytes, so two keys that differ only outside UTF-8 stay distinct.
|
|
215
|
-
*/
|
|
216
|
-
function membersOf(v) {
|
|
217
|
-
const out = new Map();
|
|
218
|
-
for (let i = 0; i < v.keys.length; i++) {
|
|
219
|
-
out.set(v.keys[i].toString('latin1'), v.items[i]);
|
|
220
|
-
}
|
|
221
|
-
return out;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Equal after canonicalization, where a number and its decimal string spelling
|
|
225
|
-
* are the same value (5 vs "5") but a float that has thrown away 60 digits of an
|
|
226
|
-
* Int256 is not. Mirrors the arbiter's `_same_value`.
|
|
227
|
-
*/
|
|
228
|
-
function sameValue(a, b) {
|
|
229
|
-
if (a.kind === 'array') {
|
|
230
|
-
if (b.kind !== 'array' || a.items.length !== b.items.length)
|
|
231
|
-
return false;
|
|
232
|
-
return a.items.every((x, i) => sameValue(x, b.items[i]));
|
|
233
|
-
}
|
|
234
|
-
if (a.kind === 'object') {
|
|
235
|
-
if (b.kind !== 'object')
|
|
236
|
-
return false;
|
|
237
|
-
const am = membersOf(a);
|
|
238
|
-
const bm = membersOf(b);
|
|
239
|
-
if (am.size !== bm.size)
|
|
240
|
-
return false;
|
|
241
|
-
for (const [k, av] of am) {
|
|
242
|
-
const bv = bm.get(k);
|
|
243
|
-
if (bv === undefined || !sameValue(av, bv))
|
|
244
|
-
return false;
|
|
245
|
-
}
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
if (a.kind === 'null' || b.kind === 'null')
|
|
249
|
-
return a.kind === 'null' && b.kind === 'null';
|
|
250
|
-
if (a.kind === 'bool')
|
|
251
|
-
return b.kind === 'bool' && a.raw.equals(b.raw);
|
|
252
|
-
if (b.kind === 'bool')
|
|
253
|
-
return false;
|
|
254
|
-
const x = scalar(a);
|
|
255
|
-
const y = scalar(b);
|
|
256
|
-
if (x.isString === y.isString && x.bytes.equals(y.bytes))
|
|
257
|
-
return true;
|
|
258
|
-
const xt = x.bytes.toString('utf8');
|
|
259
|
-
const yt = y.bytes.toString('utf8');
|
|
260
|
-
// Denormals: ClickHouse renders them as the strings "nan" / "inf" / "-inf".
|
|
261
|
-
if (denormal(xt) !== '' || denormal(yt) !== '') {
|
|
262
|
-
return denormal(xt) === denormal(yt);
|
|
263
|
-
}
|
|
264
|
-
const ra = parseRational(xt);
|
|
265
|
-
const rb = parseRational(yt);
|
|
266
|
-
if (ra === null || rb === null)
|
|
267
|
-
return false;
|
|
268
|
-
return ra.num * rb.den === rb.num * ra.den;
|
|
269
|
-
}
|
|
270
|
-
/** Mirrors the arbiter's `_severity`. */
|
|
271
|
-
function severity(a, b) {
|
|
272
|
-
if (isNumericValue(a) && isNumericValue(b))
|
|
273
|
-
return Reason.LossyNumeric;
|
|
274
|
-
if (a.kind === 'null' && b.kind !== 'null')
|
|
275
|
-
return Reason.NullToDefault; // the arbiter's `null_filled`
|
|
276
|
-
if (a.kind !== 'null' && b.kind === 'null')
|
|
277
|
-
return Reason.NullLoss;
|
|
278
|
-
const x = scalarText(a);
|
|
279
|
-
const y = scalarText(b);
|
|
280
|
-
if (x.isString && y.isString) {
|
|
281
|
-
if (dateish(x.text) && dateish(y.text)) {
|
|
282
|
-
return x.text.slice(0, 10) !== y.text.slice(0, 10) ? Reason.DateShift : Reason.Reformat;
|
|
283
|
-
}
|
|
284
|
-
if (x.text !== '' && y.text === '')
|
|
285
|
-
return Reason.Emptied;
|
|
286
|
-
return Reason.Reformat;
|
|
287
|
-
}
|
|
288
|
-
if (y.isString && denormal(y.text) !== '')
|
|
289
|
-
return Reason.LossyNumeric;
|
|
290
|
-
return Reason.Reformat;
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Compare JSON shape recursively. Two values can be equal by `sameValue` and
|
|
294
|
-
* still differ in type somewhere inside — `[{"a": 1}]` stored as `[{"a": "1"}]`
|
|
295
|
-
* is the same data with a different wire type, which a subscriber reading the
|
|
296
|
-
* preview would see and the table would not have.
|
|
297
|
-
*/
|
|
298
|
-
function sameKindDeep(a, b) {
|
|
299
|
-
if (a.kind !== b.kind)
|
|
300
|
-
return false;
|
|
301
|
-
// Two strings that are "equal" only after denormal folding are still a visible
|
|
302
|
-
// change: the row said "NaN" and the table holds "nan".
|
|
303
|
-
if (a.kind === 'string')
|
|
304
|
-
return a.bytes.equals(b.bytes);
|
|
305
|
-
if (a.kind === 'array') {
|
|
306
|
-
if (a.items.length !== b.items.length)
|
|
307
|
-
return false;
|
|
308
|
-
return a.items.every((x, i) => sameKindDeep(x, b.items[i]));
|
|
309
|
-
}
|
|
310
|
-
if (a.kind === 'object') {
|
|
311
|
-
const am = membersOf(a);
|
|
312
|
-
const bm = membersOf(b);
|
|
313
|
-
if (am.size !== bm.size)
|
|
314
|
-
return false;
|
|
315
|
-
for (const [k, av] of am) {
|
|
316
|
-
const bv = bm.get(k);
|
|
317
|
-
if (bv === undefined || !sameKindDeep(av, bv))
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
return true;
|
|
321
|
-
}
|
|
322
|
-
return true;
|
|
323
|
-
}
|
|
324
|
-
function dateish(s) {
|
|
325
|
-
if (s.length < 10)
|
|
326
|
-
return false;
|
|
327
|
-
for (let i = 0; i < 10; i++) {
|
|
328
|
-
const c = s[i];
|
|
329
|
-
if (i === 4 || i === 7) {
|
|
330
|
-
if (c !== '-')
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
else if (c < '0' || c > '9') {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return true;
|
|
338
|
-
}
|
|
339
|
-
// ---------------------------------------------------------- reference type
|
|
340
|
-
function reasonFor(base, stored, ref) {
|
|
341
|
-
if (base.startsWith('Enum'))
|
|
342
|
-
return Reason.EnumCoerce;
|
|
343
|
-
if (base.startsWith('Array') || base.startsWith('Tuple') || base.startsWith('Map')) {
|
|
344
|
-
return Reason.ElementChanged;
|
|
345
|
-
}
|
|
346
|
-
if (base.startsWith('Decimal')) {
|
|
347
|
-
return trimQuotes(ref).startsWith(trimQuotes(stored)) ? Reason.DecimalTruncate : Reason.OverflowWrap;
|
|
348
|
-
}
|
|
349
|
-
if (base.startsWith('DateTime'))
|
|
350
|
-
return Reason.DateTimeWrap;
|
|
351
|
-
if (base.startsWith('Date'))
|
|
352
|
-
return Reason.DateClamp;
|
|
353
|
-
// Time / Time64 (25.8+): the same truncation mechanism as DateTime64 —
|
|
354
|
-
// sub-second ticks at the declared scale, whole seconds in Time.
|
|
355
|
-
if (base.startsWith('Time'))
|
|
356
|
-
return Reason.DateTimeWrap;
|
|
357
|
-
if (base === 'UUID')
|
|
358
|
-
return Reason.UuidMangle;
|
|
359
|
-
if (base === 'IPv4' || base === 'IPv6')
|
|
360
|
-
return Reason.IpMangle;
|
|
361
|
-
if (base === 'Float32' || base === 'Float64' || base === 'BFloat16')
|
|
362
|
-
return Reason.FloatPrecision;
|
|
363
|
-
if (base.startsWith('FixedString'))
|
|
364
|
-
return Reason.FixedStringPad;
|
|
365
|
-
if (isIntFamily(base))
|
|
366
|
-
return Reason.OverflowWrap;
|
|
367
|
-
return Reason.ValueChanged;
|
|
368
|
-
}
|
|
369
|
-
function isIntFamily(base) {
|
|
370
|
-
return base.startsWith('UInt') || base.startsWith('Int') || base === 'Bool';
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Whether two ClickHouse renderings mean the same value. Only formatting
|
|
374
|
-
* differences are collapsed — anything else is a real change.
|
|
375
|
-
*
|
|
376
|
-
* Identity is decided on the bytes: a `FixedString` padded from `0xff` to
|
|
377
|
-
* `0xff 0x00 0x00` is two different values that decode to the same lossy text,
|
|
378
|
-
* and calling those equivalent would drop a real `fixedstring_pad`.
|
|
379
|
-
*/
|
|
380
|
-
function equivalent(base, storedBytes, refBytes) {
|
|
381
|
-
if (storedBytes.equals(refBytes))
|
|
382
|
-
return true;
|
|
383
|
-
const stored = storedBytes.toString('utf8');
|
|
384
|
-
const ref = refBytes.toString('utf8');
|
|
385
|
-
// Bool renders as true/false; its Int256 reference renders as 1/0.
|
|
386
|
-
if (base === 'Bool')
|
|
387
|
-
return boolNorm(stored) === boolNorm(ref);
|
|
388
|
-
// DateTime64 references widen the scale: ".123" vs ".123000000" — and so
|
|
389
|
-
// do Time64's (Time/Time64 arrived in 25.8; same rendering shape).
|
|
390
|
-
if (base.startsWith('DateTime') || base.startsWith('Time'))
|
|
391
|
-
return trimFrac(stored) === trimFrac(ref);
|
|
392
|
-
// Decimal references widen the scale: "2.50" vs "2.5000000".
|
|
393
|
-
if (base.startsWith('Decimal') || isIntFamily(base) || base === 'Float32' || base === 'Float64' || base === 'BFloat16') {
|
|
394
|
-
return numEqual(stored, ref);
|
|
395
|
-
}
|
|
396
|
-
if (base.startsWith('Array') || base.startsWith('Tuple') || base.startsWith('Map')) {
|
|
397
|
-
return compactJson(stored) === compactJson(ref) || numListEqual(stored, ref);
|
|
398
|
-
}
|
|
399
|
-
return false;
|
|
400
|
-
}
|
|
401
|
-
function boolNorm(s) {
|
|
402
|
-
switch (s.replace(/^"|"$/g, '')) {
|
|
403
|
-
case 'true':
|
|
404
|
-
case '1':
|
|
405
|
-
return '1';
|
|
406
|
-
case 'false':
|
|
407
|
-
case '0':
|
|
408
|
-
return '0';
|
|
409
|
-
default:
|
|
410
|
-
return s;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Drop trailing zeros (and a bare dot) from a datetime's fractional part so
|
|
415
|
-
* DateTime64(3) and its DateTime64(9) reference compare equal.
|
|
416
|
-
*/
|
|
417
|
-
function trimFrac(s) {
|
|
418
|
-
const i = s.lastIndexOf('.');
|
|
419
|
-
if (i < 0)
|
|
420
|
-
return s;
|
|
421
|
-
let end = s.length;
|
|
422
|
-
const quoted = end > 0 && s[end - 1] === '"';
|
|
423
|
-
if (quoted)
|
|
424
|
-
end--;
|
|
425
|
-
const frac = s.slice(i + 1, end).replace(/0+$/, '');
|
|
426
|
-
let out = s.slice(0, i);
|
|
427
|
-
if (frac !== '')
|
|
428
|
-
out += `.${frac}`;
|
|
429
|
-
if (quoted)
|
|
430
|
-
out += '"';
|
|
431
|
-
return out;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Compare two rendered containers element-wise as numbers, so [1,2] and
|
|
435
|
-
* [1.000,2.000] agree while [1,0,3] and [1,256,3] do not.
|
|
436
|
-
*/
|
|
437
|
-
function numListEqual(a, b) {
|
|
438
|
-
const ta = tokenizeNums(a);
|
|
439
|
-
const tb = tokenizeNums(b);
|
|
440
|
-
if (ta.length !== tb.length || ta.length === 0)
|
|
441
|
-
return false;
|
|
442
|
-
for (let i = 0; i < ta.length; i++) {
|
|
443
|
-
if (!numEqual(ta[i], tb[i]))
|
|
444
|
-
return false;
|
|
445
|
-
}
|
|
446
|
-
return skeleton(a) === skeleton(b);
|
|
447
|
-
}
|
|
448
|
-
/** Pull the numeric literals out of a rendered container. */
|
|
449
|
-
function tokenizeNums(s) {
|
|
450
|
-
const out = [];
|
|
451
|
-
let i = 0;
|
|
452
|
-
while (i < s.length) {
|
|
453
|
-
const c = s[i];
|
|
454
|
-
if (c === '"') {
|
|
455
|
-
i++;
|
|
456
|
-
while (i < s.length && s[i] !== '"') {
|
|
457
|
-
if (s[i] === '\\')
|
|
458
|
-
i++;
|
|
459
|
-
i++;
|
|
460
|
-
}
|
|
461
|
-
i++;
|
|
462
|
-
continue;
|
|
463
|
-
}
|
|
464
|
-
if (c === '-' || c === '+' || (c >= '0' && c <= '9')) {
|
|
465
|
-
let j = i + 1;
|
|
466
|
-
while (j < s.length) {
|
|
467
|
-
const d = s[j];
|
|
468
|
-
if (d === '.' || d === 'e' || d === 'E' || d === '-' || d === '+' || (d >= '0' && d <= '9'))
|
|
469
|
-
j++;
|
|
470
|
-
else
|
|
471
|
-
break;
|
|
472
|
-
}
|
|
473
|
-
out.push(s.slice(i, j));
|
|
474
|
-
i = j;
|
|
475
|
-
continue;
|
|
476
|
-
}
|
|
477
|
-
i++;
|
|
478
|
-
}
|
|
479
|
-
return out;
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* Keep only structural punctuation, so two renderings that agree numerically but
|
|
483
|
-
* differ in shape are still reported as different.
|
|
484
|
-
*/
|
|
485
|
-
function skeleton(s) {
|
|
486
|
-
let out = '';
|
|
487
|
-
let inString = false;
|
|
488
|
-
for (let i = 0; i < s.length; i++) {
|
|
489
|
-
const c = s[i];
|
|
490
|
-
if (inString) {
|
|
491
|
-
if (c === '\\')
|
|
492
|
-
i++;
|
|
493
|
-
else if (c === '"') {
|
|
494
|
-
inString = false;
|
|
495
|
-
out += '"';
|
|
496
|
-
}
|
|
497
|
-
continue;
|
|
498
|
-
}
|
|
499
|
-
if (c === '"') {
|
|
500
|
-
inString = true;
|
|
501
|
-
out += '"';
|
|
502
|
-
continue;
|
|
503
|
-
}
|
|
504
|
-
if ('[]{}(),:'.includes(c))
|
|
505
|
-
out += c;
|
|
506
|
-
}
|
|
507
|
-
return out;
|
|
508
|
-
}
|
|
509
|
-
function compactJson(s) {
|
|
510
|
-
let out = '';
|
|
511
|
-
let inString = false;
|
|
512
|
-
for (let i = 0; i < s.length; i++) {
|
|
513
|
-
const c = s[i];
|
|
514
|
-
if (inString) {
|
|
515
|
-
out += c;
|
|
516
|
-
if (c === '\\' && i + 1 < s.length) {
|
|
517
|
-
i++;
|
|
518
|
-
out += s[i];
|
|
519
|
-
}
|
|
520
|
-
else if (c === '"') {
|
|
521
|
-
inString = false;
|
|
522
|
-
}
|
|
523
|
-
continue;
|
|
524
|
-
}
|
|
525
|
-
if (c === ' ' || c === '\t' || c === '\n' || c === '\r')
|
|
526
|
-
continue;
|
|
527
|
-
if (c === '"')
|
|
528
|
-
inString = true;
|
|
529
|
-
out += c;
|
|
530
|
-
}
|
|
531
|
-
return out;
|
|
532
|
-
}
|
|
533
|
-
//# sourceMappingURL=transform.js.map
|
package/dist/transform.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
|