@chkit/plugin-backfill 0.2.0-beta.11 → 0.2.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/options.d.ts CHANGED
@@ -19,7 +19,8 @@ export declare const PluginConfigSchema: z.ZodObject<{
19
19
  }, z.core.$strip>;
20
20
  export type PluginConfig = z.input<typeof PluginConfigSchema>;
21
21
  export declare const PlanSchema: z.ZodObject<{
22
- target: z.ZodString;
22
+ target: z.ZodDefault<z.ZodString>;
23
+ cutover: z.ZodOptional<z.ZodString>;
23
24
  from: z.ZodOptional<z.ZodString>;
24
25
  to: z.ZodOptional<z.ZodString>;
25
26
  maxChunkBytes: z.ZodDefault<z.ZodNumber>;
@@ -38,7 +39,8 @@ export declare const PlanSchema: z.ZodObject<{
38
39
  }, z.core.$strip>;
39
40
  export type PlanOptions = z.infer<typeof PlanSchema>;
40
41
  export declare const SubmitSchema: z.ZodObject<{
41
- target: z.ZodString;
42
+ target: z.ZodDefault<z.ZodString>;
43
+ cutover: z.ZodOptional<z.ZodString>;
42
44
  from: z.ZodOptional<z.ZodString>;
43
45
  to: z.ZodOptional<z.ZodString>;
44
46
  maxChunkBytes: z.ZodDefault<z.ZodNumber>;
@@ -54,6 +56,7 @@ export declare const SubmitSchema: z.ZodObject<{
54
56
  chunkHours: z.ZodOptional<z.ZodNumber>;
55
57
  timeColumn: z.ZodOptional<z.ZodString>;
56
58
  stateDir: z.ZodOptional<z.ZodString>;
59
+ planId: z.ZodOptional<z.ZodString>;
57
60
  title: z.ZodOptional<z.ZodString>;
58
61
  concurrency: z.ZodOptional<z.ZodNumber>;
59
62
  }, z.core.$strip>;
@@ -89,6 +92,11 @@ export declare const PLAN_FLAGS: readonly [{
89
92
  readonly type: "string";
90
93
  readonly description: "Target table (database.table)";
91
94
  readonly placeholder: "<database.table>";
95
+ }, {
96
+ readonly name: "--cutover";
97
+ readonly type: "string";
98
+ readonly description: "Copy the rows of a pending generate --cutover of this table (instead of --target)";
99
+ readonly placeholder: "<database.table>";
92
100
  }, {
93
101
  readonly name: "--from";
94
102
  readonly type: "string";
@@ -110,6 +118,11 @@ export declare const SUBMIT_FLAGS: readonly [{
110
118
  readonly type: "string";
111
119
  readonly description: "Target table (database.table)";
112
120
  readonly placeholder: "<database.table>";
121
+ }, {
122
+ readonly name: "--cutover";
123
+ readonly type: "string";
124
+ readonly description: "Copy the rows of a pending generate --cutover of this table (instead of --target)";
125
+ readonly placeholder: "<database.table>";
113
126
  }, {
114
127
  readonly name: "--from";
115
128
  readonly type: "string";
@@ -135,6 +148,11 @@ export declare const SUBMIT_FLAGS: readonly [{
135
148
  readonly type: "string";
136
149
  readonly description: "Max concurrent tasks the backend runs";
137
150
  readonly placeholder: "<n>";
151
+ }, {
152
+ readonly name: "--plan-id";
153
+ readonly type: "string";
154
+ readonly description: "Re-submit this saved plan, whose job failed or was cancelled";
155
+ readonly placeholder: "<id>";
138
156
  }];
139
157
  export declare const RUN_FLAGS: readonly [{
140
158
  readonly name: "--plan-id";
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAmC3D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAcD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;iBAe7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAI7D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;iBAiBrB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAKpD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;iBAGvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,SAAS;;;;;;iBAMpB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAElD,eAAO,MAAM,YAAY;;;;;;;iBAEvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,YAAY;;;iBAGvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,WAAW;;;iBAGtB,CAAA;AAIF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;EAKZ,CAAA;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOd,CAAA;AAEX,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;EAKX,CAAA;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;EAMd,CAAA;AAEX,eAAO,MAAM,aAAa;;;;;EAEf,CAAA;AAIX,eAAO,MAAM,aAAa,EAAE,WAK3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,WAO7B,CAAA;AAUD,eAAO,MAAM,YAAY,EAAE,WAK1B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,WAM7B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAA"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AA2C3D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAcD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;iBAe7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAI7D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;iBAmBrB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAKpD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;iBAKvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,SAAS;;;;;;iBAMpB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAElD,eAAO,MAAM,YAAY;;;;;;;iBAEvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,YAAY;;;iBAGvB,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAExD,eAAO,MAAM,WAAW;;;iBAGtB,CAAA;AAIF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;EAMZ,CAAA;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASd,CAAA;AAEX,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;EAKX,CAAA;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;EAMd,CAAA;AAEX,eAAO,MAAM,aAAa;;;;;EAEf,CAAA;AAIX,eAAO,MAAM,aAAa,EAAE,WAM3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,WAS7B,CAAA;AAUD,eAAO,MAAM,YAAY,EAAE,WAK1B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,WAM7B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAA"}
package/dist/options.js CHANGED
@@ -21,6 +21,13 @@ function normalizeTarget(raw) {
21
21
  }
22
22
  return value;
23
23
  }
24
+ function normalizeCutoverTarget(raw) {
25
+ const value = raw.trim();
26
+ if (!/^[A-Za-z0-9_]+\.[A-Za-z0-9_]+$/.test(value)) {
27
+ throw new BackfillConfigError('Invalid value for --cutover. Expected <database.table>.');
28
+ }
29
+ return value;
30
+ }
24
31
  const BYTE_SUFFIXES = {
25
32
  T: 1024 ** 4,
26
33
  G: 1024 ** 3,
@@ -68,7 +75,9 @@ export const PluginConfigSchema = z.object({
68
75
  });
69
76
  // ───── Per-command schemas ─────
70
77
  export const PlanSchema = z.object({
71
- target: z.string(),
78
+ // Empty when --cutover names the table: the plan then targets the cutover's shadow table.
79
+ target: z.string().default(''),
80
+ cutover: z.string().optional(),
72
81
  from: z.string().optional(),
73
82
  to: z.string().optional(),
74
83
  maxChunkBytes: z.number().positive().default(10 * GiB),
@@ -89,6 +98,8 @@ export const PlanSchema = z.object({
89
98
  // fields a managed job backend cares about: a human-readable title and the
90
99
  // backend-side execution concurrency.
91
100
  export const SubmitSchema = PlanSchema.extend({
101
+ // Re-submits a saved plan whose job failed or was cancelled, instead of planning.
102
+ planId: z.string().optional(),
92
103
  title: z.string().min(1).optional(),
93
104
  concurrency: z.number().int().positive().max(48).optional(),
94
105
  });
@@ -113,17 +124,20 @@ export const CheckSchema = z.object({
113
124
  // ───── CLI flag definitions ─────
114
125
  export const PLAN_FLAGS = defineFlags([
115
126
  { name: '--target', type: 'string', description: 'Target table (database.table)', placeholder: '<database.table>' },
127
+ { name: '--cutover', type: 'string', description: 'Copy the rows of a pending generate --cutover of this table (instead of --target)', placeholder: '<database.table>' },
116
128
  { name: '--from', type: 'string', description: 'Filter partitions starting from timestamp', placeholder: '<timestamp>' },
117
129
  { name: '--to', type: 'string', description: 'Filter partitions up to timestamp', placeholder: '<timestamp>' },
118
130
  { name: '--max-chunk-bytes', type: 'string', description: 'Max bytes per chunk (e.g. 10G, 500M)', placeholder: '<bytes>' },
119
131
  ]);
120
132
  export const SUBMIT_FLAGS = defineFlags([
121
133
  { name: '--target', type: 'string', description: 'Target table (database.table)', placeholder: '<database.table>' },
134
+ { name: '--cutover', type: 'string', description: 'Copy the rows of a pending generate --cutover of this table (instead of --target)', placeholder: '<database.table>' },
122
135
  { name: '--from', type: 'string', description: 'Filter partitions starting from timestamp', placeholder: '<timestamp>' },
123
136
  { name: '--to', type: 'string', description: 'Filter partitions up to timestamp', placeholder: '<timestamp>' },
124
137
  { name: '--max-chunk-bytes', type: 'string', description: 'Max bytes per chunk (e.g. 10G, 500M)', placeholder: '<bytes>' },
125
138
  { name: '--title', type: 'string', description: 'Human-readable job title', placeholder: '<title>' },
126
139
  { name: '--concurrency', type: 'string', description: 'Max concurrent tasks the backend runs', placeholder: '<n>' },
140
+ { name: '--plan-id', type: 'string', description: 'Re-submit this saved plan, whose job failed or was cancelled', placeholder: '<id>' },
127
141
  ]);
128
142
  export const RUN_FLAGS = defineFlags([
129
143
  { name: '--plan-id', type: 'string', description: 'Plan ID to execute', placeholder: '<id>' },
@@ -144,17 +158,20 @@ export const PLAN_ID_FLAGS = defineFlags([
144
158
  // ───── Flag mappings ─────
145
159
  export const PLAN_FLAG_MAP = {
146
160
  '--target': { key: 'target', coerce: normalizeTarget },
161
+ '--cutover': { key: 'cutover', coerce: normalizeCutoverTarget },
147
162
  '--from': { key: 'from', coerce: (v) => normalizeTimestamp(v, '--from') },
148
163
  '--to': { key: 'to', coerce: (v) => normalizeTimestamp(v, '--to') },
149
164
  '--max-chunk-bytes': { key: 'maxChunkBytes', coerce: parseByteSize },
150
165
  };
151
166
  export const SUBMIT_FLAG_MAP = {
152
167
  '--target': { key: 'target', coerce: normalizeTarget },
168
+ '--cutover': { key: 'cutover', coerce: normalizeCutoverTarget },
153
169
  '--from': { key: 'from', coerce: (v) => normalizeTimestamp(v, '--from') },
154
170
  '--to': { key: 'to', coerce: (v) => normalizeTimestamp(v, '--to') },
155
171
  '--max-chunk-bytes': { key: 'maxChunkBytes', coerce: parseByteSize },
156
172
  '--title': { key: 'title' },
157
173
  '--concurrency': { key: 'concurrency', coerce: (v) => coercePositiveInt(v, '--concurrency') },
174
+ '--plan-id': { key: 'planId', coerce: normalizePlanId },
158
175
  };
159
176
  function coercePositiveInt(v, flag) {
160
177
  const n = Number(v);
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
package/dist/planner.d.ts CHANGED
@@ -1,19 +1,23 @@
1
- import type { ResolvedChxConfig } from '@chkit/core';
1
+ import { type ResolvedChxConfig } from '@chkit/core';
2
2
  import type { PlanOptions } from './options.js';
3
3
  import type { BuildBackfillPlanOutput } from './types.js';
4
+ type ClickHouseQuery = <T>(sql: string, settings?: Record<string, string | number | boolean | undefined>) => Promise<T[]>;
4
5
  /**
5
6
  * Missing, unreadable or unsupported metadata must never bypass the safety gate.
6
7
  * Copy mode re-inserts `SELECT *`, which keeps stored DEFAULT values but
7
8
  * recomputes MATERIALIZED ones. Expressions are not parsed, so a copy is refused
8
9
  * whenever a MATERIALIZED column could read an EPHEMERAL input.
10
+ *
11
+ * Returns the live target's insertable columns (no MATERIALIZED, ALIAS or
12
+ * EPHEMERAL) in table order.
9
13
  */
10
14
  export declare function assertBackfillTargetSafe(input: {
11
15
  database: string;
12
16
  table: string;
13
- mode: 'copy' | 'mv_replay';
14
- query: <T>(sql: string, settings?: Record<string, string | number | boolean | undefined>) => Promise<T[]>;
17
+ mode: 'copy' | 'mv_replay' | 'cutover_copy';
18
+ query: ClickHouseQuery;
15
19
  querySettings?: Record<string, string | number | boolean | undefined>;
16
- }): Promise<void>;
20
+ }): Promise<string[]>;
17
21
  export declare function buildBackfillPlan(input: {
18
22
  opts: PlanOptions;
19
23
  configPath: string;
@@ -22,7 +26,19 @@ export declare function buildBackfillPlan(input: {
22
26
  url: string;
23
27
  database: string;
24
28
  };
25
- clickhouseQuery: <T>(sql: string, settings?: Record<string, string | number | boolean | undefined>) => Promise<T[]>;
29
+ clickhouseQuery: ClickHouseQuery;
26
30
  querySettings?: Record<string, string | number | boolean | undefined>;
27
31
  }): Promise<BuildBackfillPlanOutput>;
32
+ /**
33
+ * A plan names its replay columns at plan time. Before running it, make sure
34
+ * the live target still takes every one of them, so a target altered after
35
+ * planning fails with a clear message instead of on every chunk.
36
+ */
37
+ export declare function assertReplayColumnsStillInsertable(input: {
38
+ planId: string;
39
+ target: string;
40
+ targetColumns?: string[];
41
+ insertableColumns: string[];
42
+ }): void;
43
+ export {};
28
44
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA8B,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAOhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAQ/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAkDzD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACzG,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;CACtE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,eAAe,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACnH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;CACtE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmGnC"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+E,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAOjI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAQ/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAOzD,KAAK,eAAe,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;AA4CzH;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,cAAc,CAAA;IAC3C,KAAK,EAAE,eAAe,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;CACtE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BpB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,eAAe,EAAE,eAAe,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;CACtE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA6GnC;AA4KD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B,GAAG,IAAI,CAKP"}
package/dist/planner.js CHANGED
@@ -1,10 +1,18 @@
1
1
  import { dirname } from 'node:path';
2
+ import { parseCutoverMetadata } from '@chkit/core';
2
3
  import { loadSchemaDefinitions } from '@chkit/core/schema-loader';
3
4
  import { encodeChunkPlanForPersistence } from './chunking/boundary-codec.js';
4
5
  import { generateChunkPlan } from './chunking/planner.js';
5
6
  import { findMvsForTarget, resolveMvReplaySource } from './detect.js';
6
7
  import { BackfillConfigError } from './errors.js';
7
8
  import { backfillPaths, computeBackfillStateDir, computeEnvironmentFingerprint, nowIso, writeJson, } from './state.js';
9
+ /**
10
+ * The same pins every chunk INSERT carries (see `chunking/sql.ts`), so `*` in a
11
+ * view's query expands to the same columns at plan time as at run time, whatever
12
+ * the user's settings profile says. Inline, like the INSERT's, so no client or
13
+ * URL-level setting can override them.
14
+ */
15
+ const ASTERISK_SETTINGS = 'asterisk_include_materialized_columns=0, asterisk_include_alias_columns=0';
8
16
  /**
9
17
  * Inspect the schema to decide how the target gets populated. When one or more
10
18
  * materialized views feed it, this is an mv_replay backfill and their queries
@@ -23,15 +31,7 @@ async function detectBackfillStrategy(input) {
23
31
  if (tableDef?.kind === 'table' && tableDef.columns.some((column) => column.defaultKind === 'EPHEMERAL')) {
24
32
  throw new BackfillConfigError('Automatic backfill cannot reconstruct EPHEMERAL inputs; use an explicit INSERT with an input column mapping.');
25
33
  }
26
- return {
27
- mvs,
28
- mvReplayQueries: mvs.map((mv) => mv.as),
29
- targetColumns: tableDef?.kind === 'table'
30
- ? tableDef.columns
31
- .filter((column) => !column.defaultKind || column.defaultKind === 'DEFAULT')
32
- .map((column) => column.name)
33
- : undefined,
34
- };
34
+ return { mvs, mvReplayQueries: mvs.map((mv) => mv.as) };
35
35
  }
36
36
  catch (error) {
37
37
  if (error instanceof BackfillConfigError)
@@ -45,6 +45,9 @@ async function detectBackfillStrategy(input) {
45
45
  * Copy mode re-inserts `SELECT *`, which keeps stored DEFAULT values but
46
46
  * recomputes MATERIALIZED ones. Expressions are not parsed, so a copy is refused
47
47
  * whenever a MATERIALIZED column could read an EPHEMERAL input.
48
+ *
49
+ * Returns the live target's insertable columns (no MATERIALIZED, ALIAS or
50
+ * EPHEMERAL) in table order.
48
51
  */
49
52
  export async function assertBackfillTargetSafe(input) {
50
53
  const quote = (value) => `'${value.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
@@ -68,9 +71,12 @@ export async function assertBackfillTargetSafe(input) {
68
71
  if (ephemeral.length && materialized.length) {
69
72
  throw new BackfillConfigError(`Automatic backfill cannot reconstruct EPHEMERAL inputs; copying ${target} recomputes MATERIALIZED column(s) ${materialized.join(', ')}, which may read EPHEMERAL column(s) ${ephemeral.join(', ')}. Use an explicit INSERT with an input column mapping.`);
70
73
  }
74
+ return rows.filter((column) => ['', 'DEFAULT'].includes(column.default_kind)).map((column) => column.name);
71
75
  }
72
76
  export async function buildBackfillPlan(input) {
73
77
  const { opts } = input;
78
+ if (opts.cutover)
79
+ return buildCutoverBackfillPlan({ ...input, cutover: opts.cutover });
74
80
  const [database, table] = opts.target.split('.');
75
81
  if (!database || !table) {
76
82
  throw new BackfillConfigError('Invalid target format. Expected <database.table>.');
@@ -85,10 +91,19 @@ export async function buildBackfillPlan(input) {
85
91
  database,
86
92
  table,
87
93
  });
88
- await assertBackfillTargetSafe({
94
+ const insertableColumns = await assertBackfillTargetSafe({
89
95
  database, table, mode: strategy.mvReplayQueries ? 'mv_replay' : 'copy',
90
96
  query: input.clickhouseQuery, querySettings: input.querySettings,
91
97
  });
98
+ const targetColumns = strategy.mvReplayQueries
99
+ ? await resolveReplayColumns({
100
+ target: opts.target,
101
+ mvs: strategy.mvs,
102
+ insertableColumns,
103
+ query: input.clickhouseQuery,
104
+ querySettings: input.querySettings,
105
+ })
106
+ : undefined;
92
107
  const replaySource = strategy.mvReplayQueries ? resolveMvReplaySource(strategy.mvs) : undefined;
93
108
  const chunkSource = replaySource ?? { database, table };
94
109
  const chunkPlan = await generateChunkPlan({
@@ -109,7 +124,7 @@ export async function buildBackfillPlan(input) {
109
124
  const derivedTo = opts.to ?? chunkPlan.partitions.reduce((max, partition) => (partition.maxTime > max ? partition.maxTime : max), firstPartition.maxTime);
110
125
  const stateDir = computeBackfillStateDir(input.config, input.configPath, opts.stateDir);
111
126
  const paths = backfillPaths(stateDir, chunkPlan.planId);
112
- const { mvReplayQueries, targetColumns } = strategy;
127
+ const { mvReplayQueries } = strategy;
113
128
  const plan = {
114
129
  planId: chunkPlan.planId,
115
130
  target: opts.target,
@@ -152,4 +167,150 @@ export async function buildBackfillPlan(input) {
152
167
  planPath: paths.planPath,
153
168
  };
154
169
  }
170
+ /**
171
+ * Plans the copy step of a `chkit generate --cutover ... --cutover-copy
172
+ * backfill` migration: chunks over the frozen snapshot table the migration
173
+ * took, inserted into the shadow table. Each chunk skips the rows whose key
174
+ * the shadow already holds (mirrored rows, or rows an earlier attempt of the
175
+ * chunk wrote), so a chunk can run again without duplicating rows. The
176
+ * cutover's metadata (snapshot, shadow, key, columns) is read from the
177
+ * snapshot table's comment.
178
+ */
179
+ async function buildCutoverBackfillPlan(input) {
180
+ const { opts, cutover } = input;
181
+ if (opts.target) {
182
+ throw new BackfillConfigError('Use either --target or --cutover, not both: --cutover targets the shadow table of the cutover.');
183
+ }
184
+ const metadata = await readCutoverMetadata(cutover, input.clickhouseQuery, input.querySettings);
185
+ const target = `${metadata.database}.${metadata.shadow}`;
186
+ const insertableColumns = await assertBackfillTargetSafe({
187
+ database: metadata.database,
188
+ table: metadata.shadow,
189
+ mode: 'cutover_copy',
190
+ query: input.clickhouseQuery,
191
+ querySettings: input.querySettings,
192
+ });
193
+ assertReplayColumnsStillInsertable({ planId: 'cutover', target, targetColumns: metadata.columns, insertableColumns });
194
+ const chunkPlan = await generateChunkPlan({
195
+ database: metadata.database,
196
+ table: metadata.snapshot,
197
+ targetChunkBytes: opts.maxChunkBytes,
198
+ query: input.clickhouseQuery,
199
+ querySettings: input.querySettings,
200
+ });
201
+ const firstPartition = chunkPlan.partitions[0];
202
+ if (!firstPartition) {
203
+ throw new BackfillConfigError(`The cutover snapshot ${metadata.database}.${metadata.snapshot} has no rows, so there is nothing to copy. Run chkit migrate --apply to verify and swap.`);
204
+ }
205
+ const stateDir = computeBackfillStateDir(input.config, input.configPath, opts.stateDir);
206
+ const paths = backfillPaths(stateDir, chunkPlan.planId);
207
+ const env = computeEnvironmentFingerprint(input.clickhouse);
208
+ const plan = {
209
+ planId: chunkPlan.planId,
210
+ target,
211
+ createdAt: nowIso(),
212
+ ...(env ? { environment: env } : {}),
213
+ from: chunkPlan.partitions.reduce((min, partition) => (partition.minTime < min ? partition.minTime : min), firstPartition.minTime),
214
+ to: chunkPlan.partitions.reduce((max, partition) => (partition.maxTime > max ? partition.maxTime : max), firstPartition.maxTime),
215
+ chunkPlan,
216
+ execution: {
217
+ mode: 'cutover_copy',
218
+ sourceTarget: `${metadata.database}.${metadata.snapshot}`,
219
+ targetColumns: metadata.columns,
220
+ cutoverKey: metadata.key,
221
+ // The key-based skip makes a chunk safe to run again. A deduplication
222
+ // token would instead drop the smaller retry blocks as duplicates.
223
+ requireIdempotencyToken: false,
224
+ },
225
+ options: {
226
+ maxChunkBytes: opts.maxChunkBytes,
227
+ maxParallelChunks: opts.maxParallelChunks,
228
+ maxRetriesPerChunk: opts.maxRetriesPerChunk,
229
+ requireIdempotencyToken: false,
230
+ sortKeyColumn: chunkPlan.table.sortKeys[0]?.name,
231
+ },
232
+ policy: {
233
+ requireDryRunBeforeRun: opts.requireDryRunBeforeRun,
234
+ requireExplicitWindow: opts.requireExplicitWindow,
235
+ blockOverlappingRuns: opts.blockOverlappingRuns,
236
+ failCheckOnRequiredPendingBackfill: opts.failCheckOnRequiredPendingBackfill,
237
+ },
238
+ limits: {
239
+ maxWindowHours: opts.maxWindowHours,
240
+ minChunkMinutes: opts.minChunkMinutes,
241
+ },
242
+ };
243
+ await writeJson(paths.planPath, {
244
+ ...plan,
245
+ chunkPlan: encodeChunkPlanForPersistence(plan.chunkPlan),
246
+ });
247
+ return { plan, planPath: paths.planPath };
248
+ }
249
+ /** Finds the snapshot table of a pending cutover of `cutover` (`db.table`) and reads its metadata. */
250
+ async function readCutoverMetadata(cutover, query, querySettings) {
251
+ const [database, table] = cutover.split('.');
252
+ if (!database || !table)
253
+ throw new BackfillConfigError('Invalid value for --cutover. Expected <database.table>.');
254
+ const quote = (value) => `'${value.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
255
+ const rows = await query(`SELECT name, comment FROM system.tables WHERE database = ${quote(database)} AND startsWith(name, ${quote(`${table}__cutover_`)}) AND endsWith(name, '_snapshot') ORDER BY name`, querySettings);
256
+ const cutovers = rows.flatMap((row) => {
257
+ const metadata = parseCutoverMetadata(row.comment);
258
+ return metadata && metadata.database === database && metadata.table === table && metadata.snapshot === row.name ? [metadata] : [];
259
+ });
260
+ if (cutovers.length === 0) {
261
+ throw new BackfillConfigError(`No pending cutover of ${cutover} was found: its snapshot table (${table}__cutover_<stamp>_snapshot) does not exist. Generate the cutover with chkit generate --cutover ${cutover}=<key> --cutover-copy backfill and run chkit migrate --apply first; it stops before the copy.`);
262
+ }
263
+ if (cutovers.length > 1) {
264
+ throw new BackfillConfigError(`Several pending cutovers of ${cutover} exist (${cutovers.map((metadata) => metadata.snapshot).join(', ')}). Drop the objects of the abandoned ones first.`);
265
+ }
266
+ return cutovers[0];
267
+ }
268
+ /**
269
+ * Name the columns an mv_replay INSERT writes, the way ClickHouse does when a
270
+ * materialized view inserts into its `TO` table: each view's output column goes
271
+ * to the target column of the same name, whatever the order, and target columns
272
+ * the view does not output get their DEFAULT. Chunk SQL renders this list on
273
+ * both sides of `INSERT … SELECT`, so a `SELECT *` view never lines up by
274
+ * position. The list is persisted in the plan, so `run` does not depend on
275
+ * what the target looks like later.
276
+ *
277
+ * Fails when a view outputs a column the target cannot take (missing,
278
+ * MATERIALIZED or ALIAS), which ClickHouse also refuses when the view is
279
+ * created, and when views feeding one target output different column sets:
280
+ * one INSERT cannot leave a column to its DEFAULT for some rows only.
281
+ */
282
+ async function resolveReplayColumns(input) {
283
+ const outputs = await Promise.all(input.mvs.map(async (mv) => {
284
+ const rows = await input.query(`DESCRIBE TABLE (\n${mv.as}\n) SETTINGS ${ASTERISK_SETTINGS}`, input.querySettings);
285
+ const names = rows.map((row) => row.name);
286
+ if (!names.length) {
287
+ throw new BackfillConfigError(`Cannot read the output columns of materialized view ${mv.database}.${mv.name}; automatic backfill is blocked.`);
288
+ }
289
+ const rejected = names.filter((name) => !input.insertableColumns.includes(name));
290
+ if (rejected.length) {
291
+ throw new BackfillConfigError(`Materialized view ${mv.database}.${mv.name} outputs column(s) ${rejected.join(', ')}, which ${input.target} cannot take (missing, MATERIALIZED or ALIAS). ClickHouse matches view output to target columns by name and refuses such a view by default; align the view's SELECT with the target (use AS to rename) before backfilling.`);
292
+ }
293
+ return { mv, names: new Set(names) };
294
+ }));
295
+ const [first, ...rest] = outputs;
296
+ if (!first)
297
+ return [];
298
+ const mismatch = rest.find(({ names }) => names.size !== first.names.size || [...names].some((name) => !first.names.has(name)));
299
+ if (mismatch) {
300
+ const describe = ({ mv, names }) => `${mv.database}.${mv.name} (${[...names].join(', ')})`;
301
+ throw new BackfillConfigError(`Materialized views feeding ${input.target} output different columns: ${describe(first)} vs ${describe(mismatch)}. Backfill replays them in one INSERT, which cannot leave a column to its DEFAULT for only some views' rows.`);
302
+ }
303
+ return input.insertableColumns.filter((name) => first.names.has(name));
304
+ }
305
+ /**
306
+ * A plan names its replay columns at plan time. Before running it, make sure
307
+ * the live target still takes every one of them, so a target altered after
308
+ * planning fails with a clear message instead of on every chunk.
309
+ */
310
+ export function assertReplayColumnsStillInsertable(input) {
311
+ const missing = (input.targetColumns ?? []).filter((name) => !input.insertableColumns.includes(name));
312
+ if (missing.length) {
313
+ throw new BackfillConfigError(`Target ${input.target} changed since plan ${input.planId} was created: column(s) ${missing.join(', ')} are gone or no longer insertable. Create a new plan with backfill plan.`);
314
+ }
315
+ }
155
316
  //# sourceMappingURL=planner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,oBAAoB,EAAiF,MAAM,aAAa,CAAA;AACjI,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,6BAA6B,EAC7B,MAAM,EACN,SAAS,GACV,MAAM,YAAY,CAAA;AAUnB;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,2EAA2E,CAAA;AAErG;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CAAC,KAKrC;IACC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;QACvF,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACtE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;QAExC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAC/B,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,IAAI,KAAK,OAAO;YAC3B,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YACtC,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAClC,CAAA;QACD,IAAI,QAAQ,EAAE,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,CAAC;YACxG,MAAM,IAAI,mBAAmB,CAAC,8GAA8G,CAAC,CAAA;QAC/I,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,mBAAmB;YAAE,MAAM,KAAK,CAAA;QACrD,gDAAgD;QAChD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAM9C;IACC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAA;IAC7F,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAA;IACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAC5B,kEAAkE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAC7I,KAAK,CAAC,aAAa,CACpB,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAC9B,mDAAmD,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAC3G,KAAK,CAAC,aAAa,CACpB,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,MAAM,yIAAyI,CAAC,CAAA;QACnM,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QAChJ,MAAM,IAAI,mBAAmB,CAAC,oIAAoI,CAAC,CAAA;IACrK,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACpH,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC5C,IAAI,SAAS,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACnD,MAAM,IAAI,mBAAmB,CAAC,8GAA8G,CAAC,CAAA;IAC/I,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,mBAAmB,CAAC,mEAAmE,MAAM,sCAAsC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IAC3R,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAC5G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAOvC;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IACtB,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,wBAAwB,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACtF,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChD,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,mBAAmB,CAAC,mDAAmD,CAAC,CAAA;IACpF,CAAC;IAED,6EAA6E;IAC7E,yEAAyE;IACzE,0EAA0E;IAC1E,kIAAkI;IAClI,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC;QAC5C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC3B,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QACpC,QAAQ;QACR,KAAK;KACN,CAAC,CAAA;IACF,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,CAAC;QACvD,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;QACtE,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa;KACjE,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe;QAC5C,CAAC,CAAC,MAAM,oBAAoB,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,iBAAiB;YACjB,KAAK,EAAE,KAAK,CAAC,eAAe;YAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;SACnC,CAAC;QACF,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/F,MAAM,WAAW,GAAG,YAAY,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAEvD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC;QACxC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,gBAAgB,EAAE,IAAI,CAAC,aAAa;QACpC,KAAK,EAAE,KAAK,CAAC,eAAe;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC,CAAA;IAEF,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,mBAAmB,CAC3B,2BAA2B,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,2BAA2B,CACjK,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACvE,cAAc,CAAC,OAAO,CACvB,CAAA;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CACtD,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACvE,cAAc,CAAC,OAAO,CACvB,CAAA;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvD,MAAM,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAA;IAEpC,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,MAAM,EAAE;QACnB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,SAAS;QACb,SAAS;QACT,SAAS,EAAE;YACT,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,WAAoB,CAAC,CAAC,CAAC,MAAe;YAC9D,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;SACtD;QACD,OAAO,EAAE;YACP,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI;SACjD;QACD,MAAM,EAAE;YACN,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,kCAAkC,EAAE,IAAI,CAAC,kCAAkC;SAC5E;QACD,MAAM,EAAE;YACN,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC;KACF,CAAA;IAED,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC9B,GAAG,IAAI;QACP,SAAS,EAAE,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;IAEF,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,wBAAwB,CAAC,KAQvC;IACC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAAC,gGAAgG,CAAC,CAAA;IACjI,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAC/F,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAA;IACxD,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,CAAC;QACvD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,KAAK,CAAC,eAAe;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC,CAAA;IACF,kCAAkC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;IAErH,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC;QACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,QAAQ,CAAC,QAAQ;QACxB,gBAAgB,EAAE,IAAI,CAAC,aAAa;QACpC,KAAK,EAAE,KAAK,CAAC,eAAe;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,0FAA0F,CACzJ,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM;QACN,SAAS,EAAE,MAAM,EAAE;QACnB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC;QAClI,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC;QAChI,SAAS;QACT,SAAS,EAAE;YACT,IAAI,EAAE,cAAuB;YAC7B,YAAY,EAAE,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACzD,aAAa,EAAE,QAAQ,CAAC,OAAO;YAC/B,UAAU,EAAE,QAAQ,CAAC,GAAG;YACxB,sEAAsE;YACtE,mEAAmE;YACnE,uBAAuB,EAAE,KAAK;SAC/B;QACD,OAAO,EAAE;YACP,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,uBAAuB,EAAE,KAAK;YAC9B,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI;SACjD;QACD,MAAM,EAAE;YACN,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,kCAAkC,EAAE,IAAI,CAAC,kCAAkC;SAC5E;QACD,MAAM,EAAE;YACN,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC;KACF,CAAA;IAED,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC9B,GAAG,IAAI;QACP,SAAS,EAAE,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAA;AAC3C,CAAC;AAED,sGAAsG;AACtG,KAAK,UAAU,mBAAmB,CAChC,OAAe,EACf,KAAsB,EACtB,aAAgF;IAEhF,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,mBAAmB,CAAC,yDAAyD,CAAC,CAAA;IACjH,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAA;IAC7F,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,4DAA4D,KAAK,CAAC,QAAQ,CAAC,yBAAyB,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,iDAAiD,EAChL,aAAa,CACd,CAAA;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnI,CAAC,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,OAAO,mCAAmC,KAAK,kGAAkG,OAAO,+FAA+F,CACjR,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,OAAO,WAAW,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAC5J,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAoB,CAAA;AACvC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,oBAAoB,CAAC,KAMnC;IACC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAC5B,qBAAqB,EAAE,CAAC,EAAE,gBAAgB,iBAAiB,EAAE,EAC7D,KAAK,CAAC,aAAa,CACpB,CAAA;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAmB,CAAC,uDAAuD,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,kCAAkC,CAAC,CAAA;QAChJ,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAChF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,4NAA4N,CAAC,CAAA;QACxW,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAA;IACtC,CAAC,CAAC,CAAC,CAAA;IAEH,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAA;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/H,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;QACxG,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,KAAK,CAAC,MAAM,8BAA8B,QAAQ,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,8GAA8G,CAAC,CAAA;IAC/P,CAAC;IACD,OAAO,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAAC,KAKlD;IACC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACrG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,UAAU,KAAK,CAAC,MAAM,uBAAuB,KAAK,CAAC,MAAM,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;IACjN,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAOA,OAAO,EAmBL,KAAK,YAAY,EAIlB,MAAM,cAAc,CAAA;AAcrB,OAAO,KAAK,EACV,cAAc,EAEd,0BAA0B,EAE3B,MAAM,YAAY,CAAA;AAyJnB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,YAAiB,GAAG,cAAc,CAkT/E;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,0BAA0B,CAO/E"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAOA,OAAO,EAmBL,KAAK,YAAY,EAIlB,MAAM,cAAc,CAAA;AAcrB,OAAO,KAAK,EACV,cAAc,EAEd,0BAA0B,EAE3B,MAAM,YAAY,CAAA;AAiKnB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,YAAiB,GAAG,cAAc,CAuU/E;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,0BAA0B,CAO/E"}
package/dist/plugin.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createClickHouseExecutor } from '@chkit/clickhouse';
1
+ import { createClickHouseExecutor, createStatelessClickHouseExecutor } from '@chkit/clickhouse';
2
2
  import { createPluginRunner, withFactoryDefaults } from '@chkit/core';
3
3
  import { executeBackfill } from './async-backfill.js';
4
4
  import { buildChunkExecutionSql } from './chunking/sql.js';
@@ -6,7 +6,7 @@ import { generateIdempotencyToken } from './chunking/utils/ids.js';
6
6
  import { BackfillConfigError } from './errors.js';
7
7
  import { CheckSchema, PLAN_FLAGS, PLAN_FLAG_MAP, PLAN_ID_FLAGS, PLAN_ID_FLAG_MAP, PlanSchema, PluginConfigSchema, RESUME_FLAGS, RESUME_FLAG_MAP, ResumeSchema, RUN_FLAGS, RUN_FLAG_MAP, RunSchema, StatusSchema, SUBMIT_FLAGS, SUBMIT_FLAG_MAP, SubmitSchema, } from './options.js';
8
8
  import { planPayload, statusPayload, cancelPayload, doctorPayload } from './payload.js';
9
- import { assertBackfillTargetSafe, buildBackfillPlan } from './planner.js';
9
+ import { assertBackfillTargetSafe, assertReplayColumnsStillInsertable, buildBackfillPlan } from './planner.js';
10
10
  import { evaluateBackfillCheck } from './check.js';
11
11
  import { cancelBackfillRun, getBackfillDoctorReport, getBackfillStatus } from './queries.js';
12
12
  import { backfillPaths, ensureEnvironmentMatch, nowIso, readPlan, readRun, summarizeRunStatus, writeJson, } from './state.js';
@@ -57,7 +57,13 @@ async function runBackfill(input) {
57
57
  const [database, table] = plan.target.split('.');
58
58
  if (!database || !table)
59
59
  throw new BackfillConfigError('Invalid backfill target.');
60
- await assertBackfillTargetSafe({ database, table, mode: plan.execution.mode, query: (sql, settings) => db.query(sql, settings) });
60
+ const insertableColumns = await assertBackfillTargetSafe({ database, table, mode: plan.execution.mode, query: (sql, settings) => db.query(sql, settings) });
61
+ assertReplayColumnsStillInsertable({
62
+ planId: plan.planId,
63
+ target: plan.target,
64
+ targetColumns: plan.execution.targetColumns,
65
+ insertableColumns,
66
+ });
61
67
  const runState = {
62
68
  planId: plan.planId,
63
69
  target: plan.target,
@@ -69,6 +75,7 @@ async function runBackfill(input) {
69
75
  await writeJson(paths.runPath, runState);
70
76
  const result = await executeBackfill({
71
77
  executor: db,
78
+ cluster: input.clickhouse.cluster,
72
79
  planId: plan.planId,
73
80
  chunks: plan.chunkPlan.chunks.map((chunk) => ({ id: chunk.id })),
74
81
  buildQuery: (chunk) => {
@@ -83,6 +90,7 @@ async function runBackfill(input) {
83
90
  table: plan.chunkPlan.table,
84
91
  mvReplayQueries: plan.execution.mvReplayQueries,
85
92
  targetColumns: plan.execution.targetColumns,
93
+ cutoverKey: plan.execution.cutoverKey,
86
94
  idempotencyToken: plan.execution.requireIdempotencyToken
87
95
  ? generateIdempotencyToken(plan.planId, planChunk.id)
88
96
  : '',
@@ -162,7 +170,10 @@ export function createBackfillPlugin(options = {}) {
162
170
  if (!context.config.clickhouse) {
163
171
  throw new BackfillConfigError('ClickHouse connection is required for backfill planning. Configure clickhouse in your clickhouse.config.ts.');
164
172
  }
165
- const db = createClickHouseExecutor(context.config.clickhouse);
173
+ // Planning only reads, and chunk refinement reads several slices
174
+ // at once, which a session-bound executor rejects ("Session is
175
+ // locked by a concurrent client").
176
+ const db = createStatelessClickHouseExecutor(context.config.clickhouse);
166
177
  try {
167
178
  const output = await buildBackfillPlan({
168
179
  opts,
@@ -392,6 +403,22 @@ export function createBackfillPlugin(options = {}) {
392
403
  },
393
404
  }),
394
405
  },
406
+ {
407
+ name: 'list',
408
+ description: 'List the backfill jobs of a managed job backend service (e.g. ObsessionDB)',
409
+ run: runCommand({
410
+ command: 'list',
411
+ label: 'Backfill list',
412
+ fn: async () => {
413
+ // Reaching this handler means no managed backend intercepted the
414
+ // command. The ObsessionDB plugin lists a service's jobs via its
415
+ // onBeforePluginCommand hook; local runs have no job list.
416
+ throw new BackfillConfigError('backfill list shows the jobs of a managed job backend. Register the ObsessionDB plugin, log in and select a service ' +
417
+ '(`chkit obsessiondb login`, then `chkit obsessiondb service select`). ' +
418
+ 'Inspect a local run with `chkit plugin backfill status --plan-id <id>`.');
419
+ },
420
+ }),
421
+ },
395
422
  ],
396
423
  hooks: {
397
424
  onConfigLoaded() {