@query-doctor/core 0.0.3

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.
@@ -0,0 +1,82 @@
1
+ import type { NullTestType } from "@pgsql/types";
2
+ import type { SortContext } from "../sql/analyzer.ts";
3
+ import { PostgresQueryBuilder } from "../sql/builder.js";
4
+ import type { Postgres, PostgresTransaction } from "../sql/database.ts";
5
+ import type { IndexedTable, Statistics } from "./statistics.ts";
6
+ export type IndexIdentifier = string;
7
+ export type IndexRecommendation = PermutedIndexCandidate & {
8
+ definition: IndexIdentifier;
9
+ };
10
+ export declare class IndexOptimizer {
11
+ private readonly db;
12
+ private readonly statistics;
13
+ private existingIndexes;
14
+ private readonly config;
15
+ static prefix: string;
16
+ constructor(db: Postgres, statistics: Statistics, existingIndexes: IndexedTable[], config?: {
17
+ debug?: boolean;
18
+ });
19
+ run(builder: PostgresQueryBuilder, indexes: RootIndexCandidate[]): Promise<OptimizeResult>;
20
+ runWithoutIndexes(builder: PostgresQueryBuilder): Promise<{
21
+ Plan: any;
22
+ }>;
23
+ /**
24
+ * Postgres has a limit of 63 characters for index names.
25
+ * So we use this to make sure we don't derive it from a list of columns that can
26
+ * overflow that limit.
27
+ */
28
+ private indexName;
29
+ private indexAlreadyExists;
30
+ private toDefinition;
31
+ /**
32
+ * Drop indexes that can be dropped (non-primary keys)
33
+ */
34
+ private dropExistingIndexes;
35
+ private whereClause;
36
+ private nullsOrder;
37
+ private sortDirection;
38
+ testQueryWithStats(builder: PostgresQueryBuilder, f?: (tx: PostgresTransaction) => Promise<void>, options?: {
39
+ params?: unknown[];
40
+ genericPlan?: boolean;
41
+ }): Promise<{
42
+ Plan: any;
43
+ }>;
44
+ private tableColumnIndexCandidates;
45
+ private findUsedIndexes;
46
+ }
47
+ export type OptimizeResult = {
48
+ kind: "ok";
49
+ baseExplainPlan: object;
50
+ baseCost: number;
51
+ finalCost: number;
52
+ newIndexes: Set<string>;
53
+ existingIndexes: Set<string>;
54
+ triedIndexes: Map<string, IndexRecommendation>;
55
+ explainPlan: object;
56
+ } | {
57
+ kind: "zero_cost_plan";
58
+ explainPlan: object;
59
+ };
60
+ export type RootIndexCandidate = {
61
+ schema: string;
62
+ table: string;
63
+ column: string;
64
+ sort?: SortContext;
65
+ where?: {
66
+ nulltest?: NullTestType;
67
+ };
68
+ };
69
+ export type PermutedIndexCandidate = {
70
+ schema: string;
71
+ table: string;
72
+ columns: RootIndexCandidate[];
73
+ where?: string;
74
+ };
75
+ export declare const PROCEED: unique symbol;
76
+ export declare const SKIP: unique symbol;
77
+ /**
78
+ * Allows permuting over an array of items.
79
+ * The generator allows the caller to prematurely stop the permutation chain.
80
+ */
81
+ export declare function permuteWithFeedback<T>(arr: T[]): Generator<T[], void, typeof PROCEED | typeof SKIP>;
82
+ //# sourceMappingURL=genalgo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genalgo.d.ts","sourceRoot":"","sources":["../../src/optimizer/genalgo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,373 @@
1
+ import { z } from "zod";
2
+ import type { Postgres, PostgresTransaction, PostgresVersion } from "../sql/database.ts";
3
+ export type Path = string;
4
+ export declare const StatisticsSource: z.ZodUnion<readonly [z.ZodObject<{
5
+ kind: z.ZodLiteral<"path">;
6
+ path: z.ZodString;
7
+ }, z.core.$strip>, z.ZodObject<{
8
+ kind: z.ZodLiteral<"inline">;
9
+ }, z.core.$strip>]>;
10
+ export declare const ExportedStatsStatistics: z.ZodObject<{
11
+ stawidth: z.ZodNumber;
12
+ stainherit: z.ZodDefault<z.ZodBoolean>;
13
+ stadistinct: z.ZodNumber;
14
+ stanullfrac: z.ZodNumber;
15
+ stakind1: z.ZodNumber;
16
+ stakind2: z.ZodNumber;
17
+ stakind3: z.ZodNumber;
18
+ stakind4: z.ZodNumber;
19
+ stakind5: z.ZodNumber;
20
+ staop1: z.ZodString;
21
+ staop2: z.ZodString;
22
+ staop3: z.ZodString;
23
+ staop4: z.ZodString;
24
+ staop5: z.ZodString;
25
+ stacoll1: z.ZodString;
26
+ stacoll2: z.ZodString;
27
+ stacoll3: z.ZodString;
28
+ stacoll4: z.ZodString;
29
+ stacoll5: z.ZodString;
30
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
31
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
32
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
33
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
34
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
35
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
36
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
37
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
38
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
39
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
40
+ }, z.core.$strip>;
41
+ export declare const ExportedStatsColumns: z.ZodObject<{
42
+ columnName: z.ZodString;
43
+ stats: z.ZodNullable<z.ZodObject<{
44
+ stawidth: z.ZodNumber;
45
+ stainherit: z.ZodDefault<z.ZodBoolean>;
46
+ stadistinct: z.ZodNumber;
47
+ stanullfrac: z.ZodNumber;
48
+ stakind1: z.ZodNumber;
49
+ stakind2: z.ZodNumber;
50
+ stakind3: z.ZodNumber;
51
+ stakind4: z.ZodNumber;
52
+ stakind5: z.ZodNumber;
53
+ staop1: z.ZodString;
54
+ staop2: z.ZodString;
55
+ staop3: z.ZodString;
56
+ staop4: z.ZodString;
57
+ staop5: z.ZodString;
58
+ stacoll1: z.ZodString;
59
+ stacoll2: z.ZodString;
60
+ stacoll3: z.ZodString;
61
+ stacoll4: z.ZodString;
62
+ stacoll5: z.ZodString;
63
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
64
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
65
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
66
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
67
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
68
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
69
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
70
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
71
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
72
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
73
+ }, z.core.$strip>>;
74
+ dataType: z.ZodString;
75
+ isNullable: z.ZodBoolean;
76
+ numericScale: z.ZodNullable<z.ZodNumber>;
77
+ columnDefault: z.ZodNullable<z.ZodString>;
78
+ numericPrecision: z.ZodNullable<z.ZodNumber>;
79
+ characterMaximumLength: z.ZodNullable<z.ZodNumber>;
80
+ }, z.core.$strip>;
81
+ export declare const ExportedStatsIndex: z.ZodObject<{
82
+ indexName: z.ZodString;
83
+ relpages: z.ZodNumber;
84
+ reltuples: z.ZodNumber;
85
+ relallvisible: z.ZodNumber;
86
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
87
+ }, z.core.$strip>;
88
+ export declare const ExportedStatsV1: z.ZodObject<{
89
+ tableName: z.ZodString;
90
+ schemaName: z.ZodString;
91
+ relpages: z.ZodNumber;
92
+ reltuples: z.ZodNumber;
93
+ relallvisible: z.ZodNumber;
94
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
95
+ columns: z.ZodNullable<z.ZodArray<z.ZodObject<{
96
+ columnName: z.ZodString;
97
+ stats: z.ZodNullable<z.ZodObject<{
98
+ stawidth: z.ZodNumber;
99
+ stainherit: z.ZodDefault<z.ZodBoolean>;
100
+ stadistinct: z.ZodNumber;
101
+ stanullfrac: z.ZodNumber;
102
+ stakind1: z.ZodNumber;
103
+ stakind2: z.ZodNumber;
104
+ stakind3: z.ZodNumber;
105
+ stakind4: z.ZodNumber;
106
+ stakind5: z.ZodNumber;
107
+ staop1: z.ZodString;
108
+ staop2: z.ZodString;
109
+ staop3: z.ZodString;
110
+ staop4: z.ZodString;
111
+ staop5: z.ZodString;
112
+ stacoll1: z.ZodString;
113
+ stacoll2: z.ZodString;
114
+ stacoll3: z.ZodString;
115
+ stacoll4: z.ZodString;
116
+ stacoll5: z.ZodString;
117
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
118
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
119
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
120
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
121
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
122
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
123
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
124
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
125
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
126
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
127
+ }, z.core.$strip>>;
128
+ dataType: z.ZodString;
129
+ isNullable: z.ZodBoolean;
130
+ numericScale: z.ZodNullable<z.ZodNumber>;
131
+ columnDefault: z.ZodNullable<z.ZodString>;
132
+ numericPrecision: z.ZodNullable<z.ZodNumber>;
133
+ characterMaximumLength: z.ZodNullable<z.ZodNumber>;
134
+ }, z.core.$strip>>>;
135
+ indexes: z.ZodArray<z.ZodObject<{
136
+ indexName: z.ZodString;
137
+ relpages: z.ZodNumber;
138
+ reltuples: z.ZodNumber;
139
+ relallvisible: z.ZodNumber;
140
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
141
+ }, z.core.$strip>>;
142
+ }, z.core.$strip>;
143
+ export declare const ExportedStats: z.ZodUnion<readonly [z.ZodObject<{
144
+ tableName: z.ZodString;
145
+ schemaName: z.ZodString;
146
+ relpages: z.ZodNumber;
147
+ reltuples: z.ZodNumber;
148
+ relallvisible: z.ZodNumber;
149
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
150
+ columns: z.ZodNullable<z.ZodArray<z.ZodObject<{
151
+ columnName: z.ZodString;
152
+ stats: z.ZodNullable<z.ZodObject<{
153
+ stawidth: z.ZodNumber;
154
+ stainherit: z.ZodDefault<z.ZodBoolean>;
155
+ stadistinct: z.ZodNumber;
156
+ stanullfrac: z.ZodNumber;
157
+ stakind1: z.ZodNumber;
158
+ stakind2: z.ZodNumber;
159
+ stakind3: z.ZodNumber;
160
+ stakind4: z.ZodNumber;
161
+ stakind5: z.ZodNumber;
162
+ staop1: z.ZodString;
163
+ staop2: z.ZodString;
164
+ staop3: z.ZodString;
165
+ staop4: z.ZodString;
166
+ staop5: z.ZodString;
167
+ stacoll1: z.ZodString;
168
+ stacoll2: z.ZodString;
169
+ stacoll3: z.ZodString;
170
+ stacoll4: z.ZodString;
171
+ stacoll5: z.ZodString;
172
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
173
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
174
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
175
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
176
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
177
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
178
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
179
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
180
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
181
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
182
+ }, z.core.$strip>>;
183
+ dataType: z.ZodString;
184
+ isNullable: z.ZodBoolean;
185
+ numericScale: z.ZodNullable<z.ZodNumber>;
186
+ columnDefault: z.ZodNullable<z.ZodString>;
187
+ numericPrecision: z.ZodNullable<z.ZodNumber>;
188
+ characterMaximumLength: z.ZodNullable<z.ZodNumber>;
189
+ }, z.core.$strip>>>;
190
+ indexes: z.ZodArray<z.ZodObject<{
191
+ indexName: z.ZodString;
192
+ relpages: z.ZodNumber;
193
+ reltuples: z.ZodNumber;
194
+ relallvisible: z.ZodNumber;
195
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
196
+ }, z.core.$strip>>;
197
+ }, z.core.$strip>]>;
198
+ export type ExportedStats = z.infer<typeof ExportedStats>;
199
+ export declare const StatisticsMode: z.ZodDiscriminatedUnion<[z.ZodObject<{
200
+ kind: z.ZodLiteral<"fromAssumption">;
201
+ reltuples: z.ZodNumber;
202
+ relpages: z.ZodNumber;
203
+ }, z.core.$strip>, z.ZodObject<{
204
+ kind: z.ZodLiteral<"fromStatisticsExport">;
205
+ stats: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
206
+ tableName: z.ZodString;
207
+ schemaName: z.ZodString;
208
+ relpages: z.ZodNumber;
209
+ reltuples: z.ZodNumber;
210
+ relallvisible: z.ZodNumber;
211
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
212
+ columns: z.ZodNullable<z.ZodArray<z.ZodObject<{
213
+ columnName: z.ZodString;
214
+ stats: z.ZodNullable<z.ZodObject<{
215
+ stawidth: z.ZodNumber;
216
+ stainherit: z.ZodDefault<z.ZodBoolean>;
217
+ stadistinct: z.ZodNumber;
218
+ stanullfrac: z.ZodNumber;
219
+ stakind1: z.ZodNumber;
220
+ stakind2: z.ZodNumber;
221
+ stakind3: z.ZodNumber;
222
+ stakind4: z.ZodNumber;
223
+ stakind5: z.ZodNumber;
224
+ staop1: z.ZodString;
225
+ staop2: z.ZodString;
226
+ staop3: z.ZodString;
227
+ staop4: z.ZodString;
228
+ staop5: z.ZodString;
229
+ stacoll1: z.ZodString;
230
+ stacoll2: z.ZodString;
231
+ stacoll3: z.ZodString;
232
+ stacoll4: z.ZodString;
233
+ stacoll5: z.ZodString;
234
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
235
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
236
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
237
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
238
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
239
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
240
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
241
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
242
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
243
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
244
+ }, z.core.$strip>>;
245
+ dataType: z.ZodString;
246
+ isNullable: z.ZodBoolean;
247
+ numericScale: z.ZodNullable<z.ZodNumber>;
248
+ columnDefault: z.ZodNullable<z.ZodString>;
249
+ numericPrecision: z.ZodNullable<z.ZodNumber>;
250
+ characterMaximumLength: z.ZodNullable<z.ZodNumber>;
251
+ }, z.core.$strip>>>;
252
+ indexes: z.ZodArray<z.ZodObject<{
253
+ indexName: z.ZodString;
254
+ relpages: z.ZodNumber;
255
+ reltuples: z.ZodNumber;
256
+ relallvisible: z.ZodNumber;
257
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
258
+ }, z.core.$strip>>;
259
+ }, z.core.$strip>]>>;
260
+ source: z.ZodUnion<readonly [z.ZodObject<{
261
+ kind: z.ZodLiteral<"path">;
262
+ path: z.ZodString;
263
+ }, z.core.$strip>, z.ZodObject<{
264
+ kind: z.ZodLiteral<"inline">;
265
+ }, z.core.$strip>]>;
266
+ }, z.core.$strip>], "kind">;
267
+ export type StatisticsMode = z.infer<typeof StatisticsMode>;
268
+ export declare class Statistics {
269
+ private readonly db;
270
+ readonly postgresVersion: PostgresVersion;
271
+ readonly ownMetadata: ExportedStats[];
272
+ readonly mode: StatisticsMode;
273
+ private readonly exportedMetadata;
274
+ static readonly defaultStatsMode: StatisticsMode;
275
+ constructor(db: Postgres, postgresVersion: PostgresVersion, ownMetadata: ExportedStats[], statsMode: StatisticsMode);
276
+ static statsModeFromAssumption({ reltuples, relpages, }: {
277
+ reltuples: number;
278
+ relpages: number;
279
+ }): StatisticsMode;
280
+ /**
281
+ * Create a statistic mode from stats exported from another database
282
+ **/
283
+ static statsModeFromExport(stats: ExportedStats[]): StatisticsMode;
284
+ static fromPostgres(db: Postgres, statsMode: StatisticsMode): Promise<Statistics>;
285
+ restoreStats(tx: PostgresTransaction): Promise<{
286
+ tablesNotInExports: string[];
287
+ tablesNotInTest: string[];
288
+ tableNotAnalyzed: string[];
289
+ statsMissing: {
290
+ statistic: string;
291
+ table: string;
292
+ schema: string;
293
+ column: string;
294
+ }[];
295
+ }>;
296
+ /**
297
+ * We have to cast stavaluesN to the correct type
298
+ * This derives that type for us so it can be used in `array_in`
299
+ */
300
+ private stavalueKind;
301
+ private restoreStats17;
302
+ static dumpStats(db: PostgresTransaction, postgresVersion: PostgresVersion, kind: "anonymous" | "full"): Promise<ExportedStats[]>;
303
+ /**
304
+ * Returns all indexes in the database.
305
+ * ONLY handles regular btree indexes
306
+ */
307
+ getExistingIndexes(): Promise<IndexedTable[]>;
308
+ }
309
+ export type ColumnMetadata = {
310
+ columnName: string;
311
+ dataType: string;
312
+ isNullable: boolean;
313
+ stats: ColumnStats | null;
314
+ };
315
+ type ColumnStats = {
316
+ stainherit: boolean;
317
+ stanullfrac: number;
318
+ stawidth: number;
319
+ stadistinct: number;
320
+ stakind1: number;
321
+ stakind2: number;
322
+ stakind3: number;
323
+ stakind4: number;
324
+ stakind5: number;
325
+ staop1: number;
326
+ staop2: number;
327
+ staop3: number;
328
+ staop4: number;
329
+ staop5: number;
330
+ stacoll1: number;
331
+ stacoll2: number;
332
+ stacoll3: number;
333
+ stacoll4: number;
334
+ stacoll5: number;
335
+ stanumbers1: number;
336
+ stanumbers2: number;
337
+ stanumbers3: number;
338
+ stanumbers4: number;
339
+ stanumbers5: number;
340
+ };
341
+ export type TableMetadata = {
342
+ tableName: string;
343
+ schemaName: string;
344
+ reltuples: number;
345
+ relpages: number;
346
+ relallvisible: number;
347
+ relallfrozen?: number;
348
+ columns: ColumnMetadata[];
349
+ };
350
+ type TableName = string;
351
+ export type TableStats = {
352
+ tupleEstimate: bigint;
353
+ pageCount: number;
354
+ };
355
+ export type SerializeResult = {
356
+ schema: TableMetadata[];
357
+ serialized: string;
358
+ sampledRecords: Record<TableName, number>;
359
+ };
360
+ export type IndexOrder = "ASC" | "DESC";
361
+ export type IndexedTable = {
362
+ index_columns: Array<{
363
+ name: string;
364
+ order: IndexOrder;
365
+ }>;
366
+ is_primary: boolean;
367
+ index_name: string;
368
+ index_type: "btree" | "gin" | (string & {});
369
+ schema_name: string;
370
+ table_name: string;
371
+ };
372
+ export {};
373
+ //# sourceMappingURL=statistics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../src/optimizer/statistics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { NullTestType, SortByDir, SortByNulls } from "@pgsql/types";
2
+ import type { RootIndexCandidate } from "../optimizer/genalgo.ts";
3
+ import type { ExportedStats } from "../optimizer/statistics.ts";
4
+ import type { Nudge } from "./nudges.ts";
5
+ import { ColumnReferencePart } from "./walker.js";
6
+ export interface DatabaseDriver {
7
+ query(query: string, params: unknown[]): Promise<unknown[]>;
8
+ }
9
+ export declare const ignoredIdentifier = "__qd_placeholder";
10
+ export interface SQLCommenterTag {
11
+ key: string;
12
+ value: string;
13
+ }
14
+ export type SortContext = {
15
+ dir: SortByDir;
16
+ nulls: SortByNulls;
17
+ };
18
+ export type DiscoveredColumnReference = {
19
+ /** How often the column reference appears in the query. */
20
+ frequency: number;
21
+ /**
22
+ * Representation of the column reference exactly
23
+ * as it appears in the query.
24
+ */
25
+ representation: string;
26
+ /**
27
+ * Parts of the column reference separated by dots in the query.
28
+ * The table reference (if it exists) is resolved if the query
29
+ * uses an alias.
30
+ *
31
+ * Has 3 different potential configurations (in theory)
32
+ * `a.b.c` - a column reference with a table and a schema reference
33
+ * `a.b` - a column reference with a table reference but no schema
34
+ * `a` - a column reference with no table reference.
35
+ *
36
+ * We use a simple array here to allow parsing of any syntactically correct
37
+ * but logically incorrect query. The checks happen later when we're deriving
38
+ * potential indexes from parts of a column reference in `deriveIndexes`
39
+ */
40
+ parts: ColumnReferencePart[];
41
+ /**
42
+ * Whether the column reference is invalid. This
43
+ */
44
+ ignored: boolean;
45
+ /** The position of the column reference in the query. */
46
+ position: {
47
+ start: number;
48
+ end: number;
49
+ };
50
+ /**
51
+ * A sort direction associated by the column reference.
52
+ * Only relevant to references from sorts
53
+ */
54
+ sort?: SortContext;
55
+ where?: {
56
+ nulltest?: NullTestType;
57
+ };
58
+ };
59
+ /** A function defined by @pgsql/parser */
60
+ export type Parser = (query: string) => Promise<unknown>;
61
+ export type AnalysisResult = {
62
+ indexesToCheck: DiscoveredColumnReference[];
63
+ ansiHighlightedQuery: string;
64
+ referencedTables: string[];
65
+ shadowedAliases: ColumnReferencePart[];
66
+ tags: SQLCommenterTag[];
67
+ queryWithoutTags: string;
68
+ formattedQueryWithoutTags?: string;
69
+ nudges: Nudge[];
70
+ };
71
+ export type SQLCommenterExtraction = {
72
+ tags: SQLCommenterTag[];
73
+ queryWithoutTags: string;
74
+ };
75
+ /**
76
+ * Analyzes a query and returns a list of column references that
77
+ * should be indexed.
78
+ *
79
+ * This should be instantiated once per analyzed query.
80
+ */
81
+ export declare class Analyzer {
82
+ private readonly parser;
83
+ constructor(parser: Parser);
84
+ analyze(query: string, formattedQuery?: string): Promise<AnalysisResult>;
85
+ deriveIndexes(tables: ExportedStats[], discovered: DiscoveredColumnReference[]): RootIndexCandidate[];
86
+ private colorizeKeywords;
87
+ /**
88
+ * Resolves aliases such as `a.b` to `x.b` if `a` is a known
89
+ * alias to a table called x.
90
+ *
91
+ * Ignores all other combination of parts such as `a.b.c`
92
+ */
93
+ private resolveTableAliases;
94
+ private normalize;
95
+ private extractSqlcommenter;
96
+ }
97
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/sql/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEZ,SAAS,EACT,WAAW,EACZ,MAAM,cAAc,CAAC;AAQtB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAyB,MAAM,aAAa,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CACrC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,yBAAyB,EAAE,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IACrC,OAAO,CACX,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC;IA6F1B,aAAa,CACX,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,yBAAyB,EAAE,GACtC,kBAAkB,EAAE;IA+GvB,OAAO,CAAC,gBAAgB;IAgBxB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,mBAAmB;CAuC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyzer_test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer_test.d.ts","sourceRoot":"","sources":["../../src/sql/analyzer_test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ export type PostgresQueryBuilderCommand = "bitmapscan" | "indexscan" | "seqscan";
2
+ export declare class PostgresQueryBuilder {
3
+ private query;
4
+ private readonly commands;
5
+ private isIntrospection;
6
+ private explainFlags;
7
+ private _preamble;
8
+ constructor(query: string);
9
+ get preamble(): number;
10
+ static createIndex(definition: string, name?: string): PostgresQueryBuilder;
11
+ enable(command: PostgresQueryBuilderCommand, value?: boolean): this;
12
+ withQuery(query: string): this;
13
+ introspect(): this;
14
+ explain(flags: string[]): this;
15
+ build(): string;
16
+ /** Return the "set a=b" parts of the command in the query separate from the explain select ... part */
17
+ buildParts(): {
18
+ commands: string;
19
+ query: string;
20
+ };
21
+ private generateSetCommands;
22
+ private generateExplain;
23
+ }
24
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/sql/builder.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GACnC,YAAY,GACZ,WAAW,GACX,SAAS,CAAC;AAEd,qBAAa,oBAAoB;IAMnB,OAAO,CAAC,KAAK;IALzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAK;gBAEF,KAAK,EAAE,MAAM;IAEjC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IASpD,MAAM,CAAC,OAAO,EAAE,2BAA2B,EAAE,KAAK,GAAE,OAAc,GAAG,IAAI;IAUzE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,UAAU,IAAI,IAAI;IAKlB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAK9B,KAAK,IAAI,MAAM;IASf,uGAAuG;IACvG,UAAU;;;;IAUV,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,eAAe;CAWxB"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const PostgresVersion: z.core.$ZodBranded<z.ZodString, "PostgresVersion">;
3
+ export type PostgresVersion = z.infer<typeof PostgresVersion>;
4
+ export interface PostgresTransaction {
5
+ /**
6
+ * Exec a query and return the result as an array of objects.
7
+ */
8
+ exec<T>(query: string, params?: unknown[]): Promise<T[]>;
9
+ }
10
+ /**
11
+ * A shared interface for all postgres connections.
12
+ * This is required to allow interop between pglite and regular postgres drivers
13
+ */
14
+ export interface Postgres extends PostgresTransaction {
15
+ transaction<T>(callback: (tx: PostgresTransaction) => Promise<T>): Promise<T>;
16
+ cursor?<T>(query: string, params?: unknown[], options?: {
17
+ size?: number;
18
+ }): AsyncGenerator<T, void, unknown>;
19
+ serverNum(): Promise<PostgresVersion>;
20
+ }
21
+ export type PostgresConnectionInput = {
22
+ url: string;
23
+ };
24
+ export type PostgresFactory = (input: PostgresConnectionInput) => Postgres;
25
+ export type PostgresExplainPlan = any;
26
+ export type PostgresExplainResult = {
27
+ "QUERY PLAN": {
28
+ Plan: PostgresExplainPlan[];
29
+ }[];
30
+ };
31
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/sql/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,oDAAsC,CAAC;AACnE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC1D;AAED;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,mBAAmB;IACnD,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,CAAC,CAAC,EACP,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1B,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEpC,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,QAAQ,CAAC;AAG3E,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEtC,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE;QACZ,IAAI,EAAE,mBAAmB,EAAE,CAAC;KAC7B,EAAE,CAAC;CACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Node } from "@pgsql/types";
2
+ type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS";
3
+ export type Nudge = {
4
+ kind: NudgeKind;
5
+ severity: "CRITICAL" | "WARNING" | "INFO";
6
+ message: string;
7
+ };
8
+ type KeysOfUnion<T> = T extends T ? keyof T : never;
9
+ /**
10
+ * Detect nudges for a single node during AST traversal.
11
+ * Returns an array of nudges found for this node.
12
+ */
13
+ export declare function parseNudges(node: Node, stack: (KeysOfUnion<Node> | string)[]): Nudge[];
14
+ export {};
15
+ //# sourceMappingURL=nudges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudges.d.ts","sourceRoot":"","sources":["../../src/sql/nudges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,KAAK,SAAS,GACV,yBAAyB,GACzB,yBAAyB,GACzB,mBAAmB,GACnB,qCAAqC,GACrC,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,GACxB,+BAA+B,GAC/B,wBAAwB,GACxB,6BAA6B,GAC7B,iCAAiC,CAAC;AAEtC,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;AAiBpD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,GACpC,KAAK,EAAE,CAsKT"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permutations_test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permutations_test.d.ts","sourceRoot":"","sources":["../../src/sql/permutations_test.ts"],"names":[],"mappings":""}