@typed-sql/compiler 1.0.0 → 2.0.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/CHANGELOG.md +87 -0
- package/README.md +28 -5
- package/dist/packages/compiler/src/compatibility.d.ts +66 -0
- package/dist/packages/compiler/src/compatibility.d.ts.map +1 -0
- package/dist/packages/compiler/src/compatibility.js +786 -0
- package/dist/packages/compiler/src/compatibility.js.map +1 -0
- package/dist/packages/compiler/src/compiler.d.ts +16 -1
- package/dist/packages/compiler/src/compiler.d.ts.map +1 -1
- package/dist/packages/compiler/src/compiler.js +67 -4
- package/dist/packages/compiler/src/compiler.js.map +1 -1
- package/dist/packages/compiler/src/index.d.ts +13 -3
- package/dist/packages/compiler/src/index.d.ts.map +1 -1
- package/dist/packages/compiler/src/index.js +6 -1
- package/dist/packages/compiler/src/index.js.map +1 -1
- package/dist/packages/compiler/src/manifest.d.ts +505 -0
- package/dist/packages/compiler/src/manifest.d.ts.map +1 -0
- package/dist/packages/compiler/src/manifest.js +628 -0
- package/dist/packages/compiler/src/manifest.js.map +1 -0
- package/dist/packages/compiler/src/plans.d.ts +88 -0
- package/dist/packages/compiler/src/plans.d.ts.map +1 -0
- package/dist/packages/compiler/src/plans.js +459 -0
- package/dist/packages/compiler/src/plans.js.map +1 -0
- package/dist/packages/compiler/src/project.d.ts +8 -0
- package/dist/packages/compiler/src/project.d.ts.map +1 -0
- package/dist/packages/compiler/src/project.js +62 -0
- package/dist/packages/compiler/src/project.js.map +1 -0
- package/dist/packages/compiler/src/scanner.d.ts +6 -0
- package/dist/packages/compiler/src/scanner.d.ts.map +1 -1
- package/dist/packages/compiler/src/scanner.js +46 -0
- package/dist/packages/compiler/src/scanner.js.map +1 -1
- package/dist/packages/compiler/src/verification.d.ts +106 -0
- package/dist/packages/compiler/src/verification.d.ts.map +1 -0
- package/dist/packages/compiler/src/verification.js +516 -0
- package/dist/packages/compiler/src/verification.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../src/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { QueryPlanBudgetPolicy, QueryPlanEnvironment, QueryPlanEvidence, QueryPlanInspector, QueryPlanSampleProvider } from "@typed-sql/core";
|
|
2
|
+
import { type QueryManifest, type QueryManifestLocation } from "./manifest.js";
|
|
3
|
+
import type { QueryVerificationCandidate } from "./verification.js";
|
|
4
|
+
export declare const QUERY_PLAN_FORMAT_VERSION: 1;
|
|
5
|
+
export declare const QUERY_PLAN_CAPTURE_VERSION: "typed-sql-v1";
|
|
6
|
+
export declare const QUERY_PLAN_REVIEW_FORMAT_VERSION: 1;
|
|
7
|
+
interface QueryPlanEntryBase {
|
|
8
|
+
readonly queryId: string;
|
|
9
|
+
readonly variantFingerprint?: string;
|
|
10
|
+
readonly source: QueryManifestLocation;
|
|
11
|
+
}
|
|
12
|
+
export interface CapturedQueryPlanEntry extends QueryPlanEntryBase {
|
|
13
|
+
readonly variantFingerprint: string;
|
|
14
|
+
readonly status: "captured";
|
|
15
|
+
readonly sampleFingerprint?: string;
|
|
16
|
+
readonly evidence: QueryPlanEvidence;
|
|
17
|
+
}
|
|
18
|
+
export interface SkippedQueryPlanEntry extends QueryPlanEntryBase {
|
|
19
|
+
readonly status: "skipped";
|
|
20
|
+
readonly reason: "manifest-unresolved" | "candidate-missing" | "unsafe-operation" | "parameters-required" | "sample-count-mismatch";
|
|
21
|
+
}
|
|
22
|
+
export interface FailedQueryPlanEntry extends QueryPlanEntryBase {
|
|
23
|
+
readonly variantFingerprint: string;
|
|
24
|
+
readonly status: "error";
|
|
25
|
+
readonly reason: "plan-capture-failed" | "sample-provider-failed";
|
|
26
|
+
}
|
|
27
|
+
export type QueryPlanEntry = CapturedQueryPlanEntry | SkippedQueryPlanEntry | FailedQueryPlanEntry;
|
|
28
|
+
export interface QueryPlanArtifact {
|
|
29
|
+
readonly formatVersion: typeof QUERY_PLAN_FORMAT_VERSION;
|
|
30
|
+
readonly captureVersion: typeof QUERY_PLAN_CAPTURE_VERSION;
|
|
31
|
+
readonly adapterVersion: string;
|
|
32
|
+
readonly parameterMode: QueryPlanInspector["parameterMode"];
|
|
33
|
+
readonly dialect: string;
|
|
34
|
+
readonly manifestHash: string;
|
|
35
|
+
readonly schemaHash: string;
|
|
36
|
+
readonly captureKey: string;
|
|
37
|
+
readonly environment: QueryPlanEnvironment;
|
|
38
|
+
readonly entries: readonly QueryPlanEntry[];
|
|
39
|
+
}
|
|
40
|
+
export interface CaptureQueryPlansOptions {
|
|
41
|
+
readonly manifest: QueryManifest;
|
|
42
|
+
readonly candidates: readonly QueryVerificationCandidate[];
|
|
43
|
+
readonly inspector: QueryPlanInspector;
|
|
44
|
+
readonly sampleValues?: QueryPlanSampleProvider;
|
|
45
|
+
readonly concurrency?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface CaptureQueryPlansResult {
|
|
48
|
+
readonly artifact: QueryPlanArtifact;
|
|
49
|
+
readonly captured: number;
|
|
50
|
+
readonly skipped: number;
|
|
51
|
+
readonly failed: number;
|
|
52
|
+
}
|
|
53
|
+
export type QueryPlanComparisonReason = "dialect-changed" | "server-version-changed" | "schema-changed" | "settings-changed" | "statistics-changed" | "sample-changed" | "baseline-query-missing" | "baseline-query-unavailable";
|
|
54
|
+
export type QueryPlanViolationKind = "total-cost" | "estimated-rows" | "total-cost-increase" | "estimated-rows-increase" | "required-node-missing" | "forbidden-node-present";
|
|
55
|
+
export interface QueryPlanViolation {
|
|
56
|
+
readonly kind: QueryPlanViolationKind;
|
|
57
|
+
readonly expected: string;
|
|
58
|
+
readonly actual: string;
|
|
59
|
+
}
|
|
60
|
+
export interface QueryPlanReviewEntry {
|
|
61
|
+
readonly queryId: string;
|
|
62
|
+
readonly variantFingerprint?: string;
|
|
63
|
+
readonly source: QueryManifestLocation;
|
|
64
|
+
readonly status: "pass" | "violation" | "incomparable" | "unavailable" | "unbudgeted";
|
|
65
|
+
readonly reasons: readonly QueryPlanComparisonReason[];
|
|
66
|
+
readonly violations: readonly QueryPlanViolation[];
|
|
67
|
+
}
|
|
68
|
+
export interface QueryPlanReviewReport {
|
|
69
|
+
readonly formatVersion: typeof QUERY_PLAN_REVIEW_FORMAT_VERSION;
|
|
70
|
+
readonly captureKey: string;
|
|
71
|
+
readonly baselineCaptureKey?: string;
|
|
72
|
+
readonly environmentReasons: readonly QueryPlanComparisonReason[];
|
|
73
|
+
readonly entries: readonly QueryPlanReviewEntry[];
|
|
74
|
+
readonly summary: Readonly<Record<QueryPlanReviewEntry["status"], number>>;
|
|
75
|
+
}
|
|
76
|
+
export interface ReviewQueryPlansOptions {
|
|
77
|
+
readonly current: QueryPlanArtifact;
|
|
78
|
+
readonly baseline?: QueryPlanArtifact;
|
|
79
|
+
readonly budgets?: QueryPlanBudgetPolicy;
|
|
80
|
+
}
|
|
81
|
+
export declare function captureQueryPlans(options: CaptureQueryPlansOptions): Promise<CaptureQueryPlansResult>;
|
|
82
|
+
export declare function reviewQueryPlans(options: ReviewQueryPlansOptions): QueryPlanReviewReport;
|
|
83
|
+
export declare function serializeQueryPlanArtifact(artifact: QueryPlanArtifact): string;
|
|
84
|
+
export declare function serializeQueryPlanReviewReport(report: QueryPlanReviewReport): string;
|
|
85
|
+
export declare function parseQueryPlanArtifact(value: unknown): QueryPlanArtifact;
|
|
86
|
+
export declare function parseQueryPlanReviewReport(value: unknown): QueryPlanReviewReport;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=plans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../../../src/plans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { parseQueryManifest, serializeQueryManifest, } from "./manifest.js";
|
|
3
|
+
export const QUERY_PLAN_FORMAT_VERSION = 1;
|
|
4
|
+
export const QUERY_PLAN_CAPTURE_VERSION = "typed-sql-v1";
|
|
5
|
+
export const QUERY_PLAN_REVIEW_FORMAT_VERSION = 1;
|
|
6
|
+
const queryPlanComparisonReasons = new Set([
|
|
7
|
+
"dialect-changed",
|
|
8
|
+
"server-version-changed",
|
|
9
|
+
"schema-changed",
|
|
10
|
+
"settings-changed",
|
|
11
|
+
"statistics-changed",
|
|
12
|
+
"sample-changed",
|
|
13
|
+
"baseline-query-missing",
|
|
14
|
+
"baseline-query-unavailable",
|
|
15
|
+
]);
|
|
16
|
+
const queryPlanViolationKinds = new Set([
|
|
17
|
+
"total-cost",
|
|
18
|
+
"estimated-rows",
|
|
19
|
+
"total-cost-increase",
|
|
20
|
+
"estimated-rows-increase",
|
|
21
|
+
"required-node-missing",
|
|
22
|
+
"forbidden-node-present",
|
|
23
|
+
]);
|
|
24
|
+
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
25
|
+
const compareText = (left, right) => (left < right ? -1 : left > right ? 1 : 0);
|
|
26
|
+
function canonicalize(value) {
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return value.map(canonicalize);
|
|
29
|
+
if (typeof value !== "object" || value === null)
|
|
30
|
+
return value;
|
|
31
|
+
return Object.fromEntries(Object.entries(value)
|
|
32
|
+
.sort(([left], [right]) => compareText(left, right))
|
|
33
|
+
.map(([key, item]) => [key, canonicalize(item)]));
|
|
34
|
+
}
|
|
35
|
+
function manifestHash(manifest) {
|
|
36
|
+
return `sha256:${sha256(serializeQueryManifest(manifest))}`;
|
|
37
|
+
}
|
|
38
|
+
function normalizedEnvironment(value) {
|
|
39
|
+
if (typeof value.version !== "string" || value.version.length === 0) {
|
|
40
|
+
throw new TypeError("Plan environment version must be a non-empty string");
|
|
41
|
+
}
|
|
42
|
+
if (!/^sha256:[a-f\d]{64}$/u.test(value.statisticsFingerprint)) {
|
|
43
|
+
throw new TypeError("Plan environment statisticsFingerprint must be a SHA-256 fingerprint");
|
|
44
|
+
}
|
|
45
|
+
const settings = Object.fromEntries(Object.entries(value.settings)
|
|
46
|
+
.map(([name, setting]) => {
|
|
47
|
+
if (name.length === 0 || typeof setting !== "string") {
|
|
48
|
+
throw new TypeError("Plan environment settings must contain string names and values");
|
|
49
|
+
}
|
|
50
|
+
return [name, setting];
|
|
51
|
+
})
|
|
52
|
+
.sort(([left], [right]) => compareText(left, right)));
|
|
53
|
+
return { version: value.version, settings, statisticsFingerprint: value.statisticsFingerprint };
|
|
54
|
+
}
|
|
55
|
+
function normalizedEvidence(value) {
|
|
56
|
+
const metric = (input, description) => {
|
|
57
|
+
if (input !== undefined && (!Number.isFinite(input) || input < 0)) {
|
|
58
|
+
throw new TypeError(`${description} must be a non-negative finite number`);
|
|
59
|
+
}
|
|
60
|
+
return input;
|
|
61
|
+
};
|
|
62
|
+
if (!Array.isArray(value.nodes))
|
|
63
|
+
throw new TypeError("Plan evidence nodes must be an array");
|
|
64
|
+
const nodes = value.nodes.map((node, index) => {
|
|
65
|
+
if (typeof node.kind !== "string" || node.kind.length === 0) {
|
|
66
|
+
throw new TypeError(`Plan node ${index}.kind must be a non-empty string`);
|
|
67
|
+
}
|
|
68
|
+
for (const property of ["relation", "index"]) {
|
|
69
|
+
if (node[property] !== undefined && (typeof node[property] !== "string" || node[property].length === 0)) {
|
|
70
|
+
throw new TypeError(`Plan node ${index}.${property} must be a non-empty string`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
kind: node.kind,
|
|
75
|
+
...(node.relation === undefined ? {} : { relation: node.relation }),
|
|
76
|
+
...(node.index === undefined ? {} : { index: node.index }),
|
|
77
|
+
...(metric(node.estimatedRows, `Plan node ${index}.estimatedRows`) === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { estimatedRows: node.estimatedRows }),
|
|
80
|
+
...(metric(node.estimatedCost, `Plan node ${index}.estimatedCost`) === undefined
|
|
81
|
+
? {}
|
|
82
|
+
: { estimatedCost: node.estimatedCost }),
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
...(metric(value.totalCost, "Plan totalCost") === undefined ? {} : { totalCost: value.totalCost }),
|
|
87
|
+
...(metric(value.estimatedRows, "Plan estimatedRows") === undefined ? {} : { estimatedRows: value.estimatedRows }),
|
|
88
|
+
nodes,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function boundedMap(values, concurrency, visit) {
|
|
92
|
+
const output = new Array(values.length);
|
|
93
|
+
let cursor = 0;
|
|
94
|
+
const worker = async () => {
|
|
95
|
+
while (cursor < values.length) {
|
|
96
|
+
const index = cursor++;
|
|
97
|
+
output[index] = await visit(values[index]);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
await Promise.all(Array.from({ length: Math.min(values.length, concurrency) }, worker));
|
|
101
|
+
return output;
|
|
102
|
+
}
|
|
103
|
+
function captureKey(value) {
|
|
104
|
+
return `sha256:${sha256(JSON.stringify(canonicalize(value)))}`;
|
|
105
|
+
}
|
|
106
|
+
export async function captureQueryPlans(options) {
|
|
107
|
+
parseQueryManifest(options.manifest);
|
|
108
|
+
if (options.inspector.dialect !== options.manifest.dialect.id) {
|
|
109
|
+
throw new TypeError(`Plan inspector dialect ${options.inspector.dialect} does not match the manifest`);
|
|
110
|
+
}
|
|
111
|
+
if (typeof options.inspector.adapterVersion !== "string" || options.inspector.adapterVersion.length === 0) {
|
|
112
|
+
throw new TypeError("Plan inspector adapterVersion must be a non-empty string");
|
|
113
|
+
}
|
|
114
|
+
if (!(options.inspector.parameterMode === "value-free" || options.inspector.parameterMode === "samples-required")) {
|
|
115
|
+
throw new TypeError("Plan inspector parameterMode is unsupported");
|
|
116
|
+
}
|
|
117
|
+
const concurrency = options.concurrency ?? 4;
|
|
118
|
+
if (!Number.isSafeInteger(concurrency) || concurrency < 1) {
|
|
119
|
+
throw new TypeError("Plan capture concurrency must be a positive safe integer");
|
|
120
|
+
}
|
|
121
|
+
const candidates = new Map(options.candidates.map((candidate) => [`${candidate.queryId}\0${candidate.variantFingerprint}`, candidate]));
|
|
122
|
+
const pending = [];
|
|
123
|
+
for (const entry of options.manifest.queries) {
|
|
124
|
+
if (entry.status === "unresolved")
|
|
125
|
+
pending.push({ entry });
|
|
126
|
+
else
|
|
127
|
+
for (const variant of entry.variants)
|
|
128
|
+
pending.push({ entry, variant });
|
|
129
|
+
}
|
|
130
|
+
const entries = [
|
|
131
|
+
...(await boundedMap(pending, concurrency, async (item) => {
|
|
132
|
+
if (item.entry.status === "unresolved") {
|
|
133
|
+
return { queryId: item.entry.id, source: item.entry.source, status: "skipped", reason: "manifest-unresolved" };
|
|
134
|
+
}
|
|
135
|
+
const variant = item.variant;
|
|
136
|
+
if (variant === undefined)
|
|
137
|
+
throw new TypeError("Resolved manifest entry is missing a plan variant");
|
|
138
|
+
const variantFingerprint = variant.fingerprint;
|
|
139
|
+
const base = { queryId: item.entry.id, variantFingerprint, source: item.entry.source };
|
|
140
|
+
const candidate = candidates.get(`${item.entry.id}\0${variantFingerprint}`);
|
|
141
|
+
if (candidate === undefined)
|
|
142
|
+
return { ...base, status: "skipped", reason: "candidate-missing" };
|
|
143
|
+
if (!(candidate.operation === "read" || candidate.operation === "write")) {
|
|
144
|
+
return { ...base, status: "skipped", reason: "unsafe-operation" };
|
|
145
|
+
}
|
|
146
|
+
let sample;
|
|
147
|
+
try {
|
|
148
|
+
sample = await options.sampleValues?.({
|
|
149
|
+
queryId: candidate.queryId,
|
|
150
|
+
variantFingerprint,
|
|
151
|
+
source: candidate.source,
|
|
152
|
+
parameters: candidate.parameters,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return { ...base, status: "error", reason: "sample-provider-failed" };
|
|
157
|
+
}
|
|
158
|
+
if (sample !== undefined && (typeof sample.identity !== "string" || sample.identity.length === 0)) {
|
|
159
|
+
throw new TypeError("Plan sample identity must be a non-empty string");
|
|
160
|
+
}
|
|
161
|
+
if (sample !== undefined && sample.values.length !== candidate.parameters.length) {
|
|
162
|
+
return { ...base, status: "skipped", reason: "sample-count-mismatch" };
|
|
163
|
+
}
|
|
164
|
+
if (candidate.parameters.length > 0 &&
|
|
165
|
+
sample === undefined &&
|
|
166
|
+
options.inspector.parameterMode === "samples-required") {
|
|
167
|
+
return { ...base, status: "skipped", reason: "parameters-required" };
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const evidence = normalizedEvidence(await options.inspector.capture({
|
|
171
|
+
fingerprint: variantFingerprint,
|
|
172
|
+
sql: candidate.sql,
|
|
173
|
+
operation: candidate.operation,
|
|
174
|
+
parameterCount: candidate.parameters.length,
|
|
175
|
+
...(sample === undefined ? {} : { values: sample.values }),
|
|
176
|
+
}));
|
|
177
|
+
return {
|
|
178
|
+
...base,
|
|
179
|
+
status: "captured",
|
|
180
|
+
...(sample === undefined ? {} : { sampleFingerprint: `sha256:${sha256(sample.identity)}` }),
|
|
181
|
+
evidence,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return { ...base, status: "error", reason: "plan-capture-failed" };
|
|
186
|
+
}
|
|
187
|
+
})),
|
|
188
|
+
];
|
|
189
|
+
entries.sort((left, right) => compareText(left.source.file, right.source.file) ||
|
|
190
|
+
left.source.range.start - right.source.range.start ||
|
|
191
|
+
compareText(left.variantFingerprint ?? "", right.variantFingerprint ?? ""));
|
|
192
|
+
const withoutKey = {
|
|
193
|
+
formatVersion: QUERY_PLAN_FORMAT_VERSION,
|
|
194
|
+
captureVersion: QUERY_PLAN_CAPTURE_VERSION,
|
|
195
|
+
adapterVersion: options.inspector.adapterVersion,
|
|
196
|
+
parameterMode: options.inspector.parameterMode,
|
|
197
|
+
dialect: options.inspector.dialect,
|
|
198
|
+
manifestHash: manifestHash(options.manifest),
|
|
199
|
+
schemaHash: options.manifest.schemaHash,
|
|
200
|
+
environment: normalizedEnvironment(await options.inspector.environment()),
|
|
201
|
+
entries,
|
|
202
|
+
};
|
|
203
|
+
const artifact = { ...withoutKey, captureKey: captureKey(withoutKey) };
|
|
204
|
+
return {
|
|
205
|
+
artifact,
|
|
206
|
+
captured: entries.filter((entry) => entry.status === "captured").length,
|
|
207
|
+
skipped: entries.filter((entry) => entry.status === "skipped").length,
|
|
208
|
+
failed: entries.filter((entry) => entry.status === "error").length,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function mergeBudget(defaults, specific) {
|
|
212
|
+
return defaults === undefined && specific === undefined ? undefined : { ...defaults, ...specific };
|
|
213
|
+
}
|
|
214
|
+
function compareEnvironment(current, baseline) {
|
|
215
|
+
const reasons = [];
|
|
216
|
+
if (current.dialect !== baseline.dialect)
|
|
217
|
+
reasons.push("dialect-changed");
|
|
218
|
+
if (current.environment.version !== baseline.environment.version)
|
|
219
|
+
reasons.push("server-version-changed");
|
|
220
|
+
if (current.schemaHash !== baseline.schemaHash)
|
|
221
|
+
reasons.push("schema-changed");
|
|
222
|
+
if (JSON.stringify(current.environment.settings) !== JSON.stringify(baseline.environment.settings)) {
|
|
223
|
+
reasons.push("settings-changed");
|
|
224
|
+
}
|
|
225
|
+
if (current.environment.statisticsFingerprint !== baseline.environment.statisticsFingerprint) {
|
|
226
|
+
reasons.push("statistics-changed");
|
|
227
|
+
}
|
|
228
|
+
return reasons;
|
|
229
|
+
}
|
|
230
|
+
function violations(current, baseline, budget, comparable) {
|
|
231
|
+
const values = [];
|
|
232
|
+
const maximum = (kind, actual, expected) => {
|
|
233
|
+
if (actual !== undefined && expected !== undefined && actual > expected) {
|
|
234
|
+
values.push({ kind, expected: `<= ${expected}`, actual: String(actual) });
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
maximum("total-cost", current.evidence.totalCost, budget.maximumTotalCost);
|
|
238
|
+
maximum("estimated-rows", current.evidence.estimatedRows, budget.maximumEstimatedRows);
|
|
239
|
+
const ratio = (kind, actual, previous, expected) => {
|
|
240
|
+
if (comparable && actual !== undefined && previous !== undefined && previous > 0 && expected !== undefined) {
|
|
241
|
+
const value = actual / previous;
|
|
242
|
+
if (value > expected)
|
|
243
|
+
values.push({ kind, expected: `<= ${expected}`, actual: String(value) });
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
ratio("total-cost-increase", current.evidence.totalCost, baseline?.evidence.totalCost, budget.maximumTotalCostIncreaseRatio);
|
|
247
|
+
ratio("estimated-rows-increase", current.evidence.estimatedRows, baseline?.evidence.estimatedRows, budget.maximumEstimatedRowsIncreaseRatio);
|
|
248
|
+
const nodeKinds = new Set(current.evidence.nodes.map((node) => node.kind));
|
|
249
|
+
for (const kind of budget.requiredNodeKinds ?? []) {
|
|
250
|
+
if (!nodeKinds.has(kind))
|
|
251
|
+
values.push({ kind: "required-node-missing", expected: kind, actual: "missing" });
|
|
252
|
+
}
|
|
253
|
+
for (const kind of budget.forbiddenNodeKinds ?? []) {
|
|
254
|
+
if (nodeKinds.has(kind))
|
|
255
|
+
values.push({ kind: "forbidden-node-present", expected: "absent", actual: kind });
|
|
256
|
+
}
|
|
257
|
+
return values;
|
|
258
|
+
}
|
|
259
|
+
export function reviewQueryPlans(options) {
|
|
260
|
+
const environmentReasons = options.baseline === undefined ? [] : compareEnvironment(options.current, options.baseline);
|
|
261
|
+
const baselineEntries = new Map((options.baseline?.entries ?? [])
|
|
262
|
+
.filter((entry) => entry.variantFingerprint !== undefined)
|
|
263
|
+
.map((entry) => [entry.variantFingerprint, entry]));
|
|
264
|
+
const entries = options.current.entries.map((entry) => {
|
|
265
|
+
const budget = entry.variantFingerprint === undefined
|
|
266
|
+
? options.budgets?.defaults
|
|
267
|
+
: mergeBudget(options.budgets?.defaults, options.budgets?.queries?.[entry.variantFingerprint]);
|
|
268
|
+
if (entry.status !== "captured") {
|
|
269
|
+
return { ...entry, status: "unavailable", reasons: [], violations: [] };
|
|
270
|
+
}
|
|
271
|
+
if (budget === undefined)
|
|
272
|
+
return { ...entry, status: "unbudgeted", reasons: [], violations: [] };
|
|
273
|
+
const baselineEntry = baselineEntries.get(entry.variantFingerprint);
|
|
274
|
+
const baseline = baselineEntry?.status === "captured" ? baselineEntry : undefined;
|
|
275
|
+
const reasons = [...environmentReasons];
|
|
276
|
+
if (options.baseline !== undefined && baselineEntry === undefined)
|
|
277
|
+
reasons.push("baseline-query-missing");
|
|
278
|
+
else if (baselineEntry !== undefined && baseline === undefined)
|
|
279
|
+
reasons.push("baseline-query-unavailable");
|
|
280
|
+
else if (baseline !== undefined && baseline.sampleFingerprint !== entry.sampleFingerprint) {
|
|
281
|
+
reasons.push("sample-changed");
|
|
282
|
+
}
|
|
283
|
+
const needsBaseline = budget.maximumTotalCostIncreaseRatio !== undefined || budget.maximumEstimatedRowsIncreaseRatio !== undefined;
|
|
284
|
+
if (needsBaseline && options.baseline === undefined)
|
|
285
|
+
reasons.push("baseline-query-missing");
|
|
286
|
+
const comparable = reasons.length === 0 && baseline !== undefined;
|
|
287
|
+
const failures = violations(entry, baseline, budget, comparable);
|
|
288
|
+
return {
|
|
289
|
+
queryId: entry.queryId,
|
|
290
|
+
variantFingerprint: entry.variantFingerprint,
|
|
291
|
+
source: entry.source,
|
|
292
|
+
status: failures.length > 0 ? "violation" : needsBaseline && !comparable ? "incomparable" : "pass",
|
|
293
|
+
reasons,
|
|
294
|
+
violations: failures,
|
|
295
|
+
};
|
|
296
|
+
});
|
|
297
|
+
const summary = {
|
|
298
|
+
pass: entries.filter((entry) => entry.status === "pass").length,
|
|
299
|
+
violation: entries.filter((entry) => entry.status === "violation").length,
|
|
300
|
+
incomparable: entries.filter((entry) => entry.status === "incomparable").length,
|
|
301
|
+
unavailable: entries.filter((entry) => entry.status === "unavailable").length,
|
|
302
|
+
unbudgeted: entries.filter((entry) => entry.status === "unbudgeted").length,
|
|
303
|
+
};
|
|
304
|
+
return {
|
|
305
|
+
formatVersion: QUERY_PLAN_REVIEW_FORMAT_VERSION,
|
|
306
|
+
captureKey: options.current.captureKey,
|
|
307
|
+
...(options.baseline === undefined ? {} : { baselineCaptureKey: options.baseline.captureKey }),
|
|
308
|
+
environmentReasons,
|
|
309
|
+
entries,
|
|
310
|
+
summary,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
export function serializeQueryPlanArtifact(artifact) {
|
|
314
|
+
return `${JSON.stringify(canonicalize(artifact), null, 2)}\n`;
|
|
315
|
+
}
|
|
316
|
+
export function serializeQueryPlanReviewReport(report) {
|
|
317
|
+
return `${JSON.stringify(canonicalize(report), null, 2)}\n`;
|
|
318
|
+
}
|
|
319
|
+
function record(value) {
|
|
320
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
321
|
+
}
|
|
322
|
+
function fingerprint(value, description, prefixed = true) {
|
|
323
|
+
const expression = prefixed ? /^sha256:[a-f\d]{64}$/u : /^[a-f\d]{64}$/u;
|
|
324
|
+
if (typeof value !== "string" || !expression.test(value)) {
|
|
325
|
+
throw new TypeError(`${description} must be a SHA-256 fingerprint`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function location(value, description) {
|
|
329
|
+
if (!record(value) || typeof value.file !== "string" || value.file.length === 0 || !record(value.range)) {
|
|
330
|
+
throw new TypeError(`${description} must contain a relative file and range`);
|
|
331
|
+
}
|
|
332
|
+
if (value.file.startsWith("/") || value.file.startsWith("\\") || /^[A-Za-z]:[\\/]/u.test(value.file)) {
|
|
333
|
+
throw new TypeError(`${description}.file must be relative`);
|
|
334
|
+
}
|
|
335
|
+
for (const property of ["start", "end", "line", "column"]) {
|
|
336
|
+
if (!Number.isSafeInteger(value.range[property]) || value.range[property] < 0) {
|
|
337
|
+
throw new TypeError(`${description}.range.${property} must be a non-negative safe integer`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
export function parseQueryPlanArtifact(value) {
|
|
342
|
+
if (!record(value))
|
|
343
|
+
throw new TypeError("Query plan artifact must be an object");
|
|
344
|
+
const artifact = value;
|
|
345
|
+
if (artifact.formatVersion !== QUERY_PLAN_FORMAT_VERSION) {
|
|
346
|
+
throw new TypeError(`Unsupported query plan artifact format ${String(artifact.formatVersion)}`);
|
|
347
|
+
}
|
|
348
|
+
if (artifact.captureVersion !== QUERY_PLAN_CAPTURE_VERSION) {
|
|
349
|
+
throw new TypeError(`Unsupported query plan capture version ${String(artifact.captureVersion)}`);
|
|
350
|
+
}
|
|
351
|
+
for (const property of ["adapterVersion", "dialect"]) {
|
|
352
|
+
if (typeof artifact[property] !== "string" || artifact[property].length === 0) {
|
|
353
|
+
throw new TypeError(`Query plan artifact ${property} must be a non-empty string`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (!(artifact.parameterMode === "value-free" || artifact.parameterMode === "samples-required")) {
|
|
357
|
+
throw new TypeError("Query plan artifact parameterMode is unsupported");
|
|
358
|
+
}
|
|
359
|
+
fingerprint(artifact.manifestHash, "Query plan artifact manifestHash");
|
|
360
|
+
fingerprint(artifact.schemaHash, "Query plan artifact schemaHash", false);
|
|
361
|
+
fingerprint(artifact.captureKey, "Query plan artifact captureKey");
|
|
362
|
+
if (!record(artifact.environment))
|
|
363
|
+
throw new TypeError("Query plan artifact environment must be an object");
|
|
364
|
+
normalizedEnvironment(artifact.environment);
|
|
365
|
+
if (!Array.isArray(artifact.entries))
|
|
366
|
+
throw new TypeError("Query plan artifact entries must be an array");
|
|
367
|
+
const skippedReasons = new Set([
|
|
368
|
+
"manifest-unresolved",
|
|
369
|
+
"candidate-missing",
|
|
370
|
+
"unsafe-operation",
|
|
371
|
+
"parameters-required",
|
|
372
|
+
"sample-count-mismatch",
|
|
373
|
+
]);
|
|
374
|
+
for (const [index, entry] of artifact.entries.entries()) {
|
|
375
|
+
if (!record(entry))
|
|
376
|
+
throw new TypeError(`Query plan artifact entry ${index} must be an object`);
|
|
377
|
+
fingerprint(entry.queryId, `Query plan artifact entry ${index}.queryId`);
|
|
378
|
+
location(entry.source, `Query plan artifact entry ${index}.source`);
|
|
379
|
+
if (entry.variantFingerprint !== undefined) {
|
|
380
|
+
fingerprint(entry.variantFingerprint, `Query plan artifact entry ${index}.variantFingerprint`);
|
|
381
|
+
}
|
|
382
|
+
if (entry.status === "captured") {
|
|
383
|
+
fingerprint(entry.variantFingerprint, `Captured query plan entry ${index}.variantFingerprint`);
|
|
384
|
+
if (entry.sampleFingerprint !== undefined) {
|
|
385
|
+
fingerprint(entry.sampleFingerprint, `Captured query plan entry ${index}.sampleFingerprint`);
|
|
386
|
+
}
|
|
387
|
+
if (!record(entry.evidence))
|
|
388
|
+
throw new TypeError(`Captured query plan entry ${index}.evidence is invalid`);
|
|
389
|
+
normalizedEvidence(entry.evidence);
|
|
390
|
+
}
|
|
391
|
+
else if (entry.status === "skipped") {
|
|
392
|
+
if (!skippedReasons.has(entry.reason)) {
|
|
393
|
+
throw new TypeError(`Skipped query plan entry ${index}.reason is unsupported`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else if (entry.status === "error") {
|
|
397
|
+
fingerprint(entry.variantFingerprint, `Failed query plan entry ${index}.variantFingerprint`);
|
|
398
|
+
if (!(entry.reason === "plan-capture-failed" || entry.reason === "sample-provider-failed")) {
|
|
399
|
+
throw new TypeError(`Failed query plan entry ${index}.reason is unsupported`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else
|
|
403
|
+
throw new TypeError(`Query plan artifact entry ${index}.status is unsupported`);
|
|
404
|
+
}
|
|
405
|
+
const { captureKey: actual, ...withoutKey } = artifact;
|
|
406
|
+
if (actual !== captureKey(withoutKey)) {
|
|
407
|
+
throw new TypeError("Query plan artifact captureKey does not match its canonical evidence");
|
|
408
|
+
}
|
|
409
|
+
return value;
|
|
410
|
+
}
|
|
411
|
+
export function parseQueryPlanReviewReport(value) {
|
|
412
|
+
if (!record(value))
|
|
413
|
+
throw new TypeError("Query plan review report must be an object");
|
|
414
|
+
if (value.formatVersion !== QUERY_PLAN_REVIEW_FORMAT_VERSION) {
|
|
415
|
+
throw new TypeError(`Unsupported query plan review format ${String(value.formatVersion)}`);
|
|
416
|
+
}
|
|
417
|
+
fingerprint(value.captureKey, "Query plan review captureKey");
|
|
418
|
+
if (value.baselineCaptureKey !== undefined)
|
|
419
|
+
fingerprint(value.baselineCaptureKey, "Query plan review baselineCaptureKey");
|
|
420
|
+
if (!Array.isArray(value.environmentReasons) || !Array.isArray(value.entries) || !record(value.summary)) {
|
|
421
|
+
throw new TypeError("Query plan review environmentReasons, entries, or summary are invalid");
|
|
422
|
+
}
|
|
423
|
+
if (value.environmentReasons.some((reason) => !queryPlanComparisonReasons.has(reason))) {
|
|
424
|
+
throw new TypeError("Query plan review environmentReasons contain an unsupported reason");
|
|
425
|
+
}
|
|
426
|
+
const statuses = ["pass", "violation", "incomparable", "unavailable", "unbudgeted"];
|
|
427
|
+
const counts = Object.fromEntries(statuses.map((status) => [status, 0]));
|
|
428
|
+
for (const [index, entry] of value.entries.entries()) {
|
|
429
|
+
if (!record(entry) || !statuses.includes(entry.status)) {
|
|
430
|
+
throw new TypeError(`Query plan review entry ${index} is invalid`);
|
|
431
|
+
}
|
|
432
|
+
fingerprint(entry.queryId, `Query plan review entry ${index}.queryId`);
|
|
433
|
+
if (entry.variantFingerprint !== undefined) {
|
|
434
|
+
fingerprint(entry.variantFingerprint, `Query plan review entry ${index}.variantFingerprint`);
|
|
435
|
+
}
|
|
436
|
+
location(entry.source, `Query plan review entry ${index}.source`);
|
|
437
|
+
if (!Array.isArray(entry.reasons) || !Array.isArray(entry.violations)) {
|
|
438
|
+
throw new TypeError(`Query plan review entry ${index} reasons and violations must be arrays`);
|
|
439
|
+
}
|
|
440
|
+
if (entry.reasons.some((reason) => !queryPlanComparisonReasons.has(reason))) {
|
|
441
|
+
throw new TypeError(`Query plan review entry ${index} contains an unsupported reason`);
|
|
442
|
+
}
|
|
443
|
+
for (const violation of entry.violations) {
|
|
444
|
+
if (!record(violation) ||
|
|
445
|
+
!queryPlanViolationKinds.has(violation.kind) ||
|
|
446
|
+
typeof violation.expected !== "string" ||
|
|
447
|
+
typeof violation.actual !== "string") {
|
|
448
|
+
throw new TypeError(`Query plan review entry ${index} contains an invalid violation`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
counts[entry.status] += 1;
|
|
452
|
+
}
|
|
453
|
+
for (const status of statuses) {
|
|
454
|
+
if (value.summary[status] !== counts[status])
|
|
455
|
+
throw new TypeError(`Query plan review summary.${status} is invalid`);
|
|
456
|
+
}
|
|
457
|
+
return value;
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=plans.js.map
|