@chkit/core 0.1.2-beta.5 → 0.2.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -6
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +63 -7
- package/dist/canonical.js.map +1 -1
- package/dist/column-default.d.ts +62 -0
- package/dist/column-default.d.ts.map +1 -0
- package/dist/column-default.js +212 -0
- package/dist/column-default.js.map +1 -0
- package/dist/conflict-markers.d.ts +3 -0
- package/dist/conflict-markers.d.ts.map +1 -0
- package/dist/conflict-markers.js +9 -0
- package/dist/conflict-markers.js.map +1 -0
- package/dist/identifier.d.ts +22 -0
- package/dist/identifier.d.ts.map +1 -0
- package/dist/identifier.js +69 -0
- package/dist/identifier.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/insert-columns.d.ts +13 -0
- package/dist/insert-columns.d.ts.map +1 -0
- package/dist/insert-columns.js +36 -0
- package/dist/insert-columns.js.map +1 -0
- package/dist/kafka.d.ts +9 -0
- package/dist/kafka.d.ts.map +1 -0
- package/dist/kafka.js +64 -0
- package/dist/kafka.js.map +1 -0
- package/dist/key-clause.d.ts +6 -1
- package/dist/key-clause.d.ts.map +1 -1
- package/dist/key-clause.js +12 -13
- package/dist/key-clause.js.map +1 -1
- package/dist/model-types.d.ts +123 -7
- package/dist/model-types.d.ts.map +1 -1
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +13 -3
- package/dist/model.js.map +1 -1
- package/dist/object-dependencies.d.ts +18 -0
- package/dist/object-dependencies.d.ts.map +1 -0
- package/dist/object-dependencies.js +351 -0
- package/dist/object-dependencies.js.map +1 -0
- package/dist/on-cluster.d.ts.map +1 -1
- package/dist/on-cluster.js +18 -9
- package/dist/on-cluster.js.map +1 -1
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +144 -81
- package/dist/planner.js.map +1 -1
- package/dist/projection.d.ts.map +1 -1
- package/dist/projection.js +5 -40
- package/dist/projection.js.map +1 -1
- package/dist/schema-loader.d.ts +2 -0
- package/dist/schema-loader.d.ts.map +1 -1
- package/dist/schema-loader.js +72 -5
- package/dist/schema-loader.js.map +1 -1
- package/dist/sql-lexer.d.ts +29 -0
- package/dist/sql-lexer.d.ts.map +1 -0
- package/dist/sql-lexer.js +220 -0
- package/dist/sql-lexer.js.map +1 -0
- package/dist/sql-normalizer.d.ts +48 -0
- package/dist/sql-normalizer.d.ts.map +1 -1
- package/dist/sql-normalizer.js +118 -1
- package/dist/sql-normalizer.js.map +1 -1
- package/dist/sql-scan.d.ts +20 -0
- package/dist/sql-scan.d.ts.map +1 -0
- package/dist/sql-scan.js +82 -0
- package/dist/sql-scan.js.map +1 -0
- package/dist/sql-splitter.d.ts.map +1 -1
- package/dist/sql-splitter.js +52 -5
- package/dist/sql-splitter.js.map +1 -1
- package/dist/sql.d.ts +9 -1
- package/dist/sql.d.ts.map +1 -1
- package/dist/sql.js +95 -36
- package/dist/sql.js.map +1 -1
- package/dist/text-index-sql.d.ts +6 -0
- package/dist/text-index-sql.d.ts.map +1 -0
- package/dist/text-index-sql.js +200 -0
- package/dist/text-index-sql.js.map +1 -0
- package/dist/text-index.d.ts +10 -0
- package/dist/text-index.d.ts.map +1 -0
- package/dist/text-index.js +121 -0
- package/dist/text-index.js.map +1 -0
- package/dist/ts-import.d.ts.map +1 -1
- package/dist/ts-import.js +23 -3
- package/dist/ts-import.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +350 -3
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils.d.ts +0 -2
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -2
- package/dist/utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# @chkit/core
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
TypeScript schema DSL, configuration, and diff engine for ClickHouse schema management.
|
|
4
4
|
|
|
5
5
|
Part of the [chkit](https://github.com/obsessiondb/chkit) monorepo. This package is typically used together with the [`chkit`](https://www.npmjs.com/package/chkit) CLI.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
-
```
|
|
10
|
-
bun add @chkit/core
|
|
9
|
+
```sh
|
|
10
|
+
bun add -d chkit @chkit/core
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Usage
|
|
@@ -15,7 +15,8 @@ bun add @chkit/core
|
|
|
15
15
|
Define your ClickHouse schema in TypeScript:
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
-
|
|
18
|
+
// src/db/schema/events.ts
|
|
19
|
+
import { schema, table } from '@chkit/core'
|
|
19
20
|
|
|
20
21
|
const events = table({
|
|
21
22
|
database: 'default',
|
|
@@ -24,10 +25,11 @@ const events = table({
|
|
|
24
25
|
columns: [
|
|
25
26
|
{ name: 'id', type: 'UInt64' },
|
|
26
27
|
{ name: 'source', type: 'String' },
|
|
27
|
-
{ name: '
|
|
28
|
+
{ name: 'occurred_at', type: 'DateTime64(3)', default: { expression: 'now64(3)' } },
|
|
28
29
|
],
|
|
29
30
|
primaryKey: ['id'],
|
|
30
31
|
orderBy: ['id'],
|
|
32
|
+
partitionBy: 'toYYYYMM(occurred_at)',
|
|
31
33
|
})
|
|
32
34
|
|
|
33
35
|
export default schema(events)
|
|
@@ -44,13 +46,31 @@ export default defineConfig({
|
|
|
44
46
|
outDir: './chkit',
|
|
45
47
|
clickhouse: {
|
|
46
48
|
url: process.env.CLICKHOUSE_URL ?? 'http://localhost:8123',
|
|
49
|
+
username: process.env.CLICKHOUSE_USER ?? 'default',
|
|
50
|
+
password: process.env.CLICKHOUSE_PASSWORD ?? '',
|
|
51
|
+
database: 'default',
|
|
47
52
|
},
|
|
48
53
|
})
|
|
49
54
|
```
|
|
50
55
|
|
|
56
|
+
Set the connection environment variables for a development database, then generate, review, and apply a migration:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
bunx chkit generate --name create-events
|
|
60
|
+
# Review the SQL in chkit/migrations/ and preview the plan:
|
|
61
|
+
bunx chkit migrate --json
|
|
62
|
+
bunx chkit migrate --apply
|
|
63
|
+
bunx chkit check
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Commit schema definitions, migration files, and `chkit/meta/` together. Change a definition and repeat the workflow to evolve the database.
|
|
67
|
+
|
|
51
68
|
## Documentation
|
|
52
69
|
|
|
53
|
-
|
|
70
|
+
- [First-schema tutorial](https://chkit.obsessiondb.com/tutorials/first-schema/) — a complete migration workflow.
|
|
71
|
+
- [Schema DSL reference](https://chkit.obsessiondb.com/schema/dsl-reference/) — tables, views, materialized views, dictionaries, and schema options.
|
|
72
|
+
- [Configuration](https://chkit.obsessiondb.com/configuration/overview/) — config files, connections, and plugins.
|
|
73
|
+
- [Python overview (alpha)](https://chkit.obsessiondb.com/python/overview/) — the equivalent schema workflow with `chkit-py`.
|
|
54
74
|
|
|
55
75
|
## License
|
|
56
76
|
|
package/dist/canonical.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AAqNnB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAK9E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAE3D;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAc3F;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAAE,CAiB7F"}
|
package/dist/canonical.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { normalizeKeyColumns } from './key-clause.js';
|
|
2
2
|
import { isSchemaDefinition } from './model.js';
|
|
3
3
|
import { canonicalizeCodec } from './codec.js';
|
|
4
|
+
import { canonicalizeColumnDefault } from './column-default.js';
|
|
4
5
|
import { canonicalizeProjection } from './projection.js';
|
|
6
|
+
import { canonicalizeTextIndex } from './text-index.js';
|
|
5
7
|
import { normalizeEngine, normalizeSQLFragment } from './sql-normalizer.js';
|
|
6
8
|
function sortByName(items) {
|
|
7
9
|
return [...items].sort((a, b) => a.name.localeCompare(b.name));
|
|
@@ -11,24 +13,42 @@ function sortKind(kind) {
|
|
|
11
13
|
return 0;
|
|
12
14
|
if (kind === 'view')
|
|
13
15
|
return 1;
|
|
14
|
-
|
|
16
|
+
if (kind === 'materialized_view')
|
|
17
|
+
return 2;
|
|
18
|
+
return 3;
|
|
15
19
|
}
|
|
16
20
|
function canonicalizeColumn(column) {
|
|
21
|
+
const { defaultKind, ...rest } = column;
|
|
17
22
|
return {
|
|
18
|
-
...
|
|
23
|
+
...rest,
|
|
24
|
+
defaultKind: defaultKind === 'DEFAULT' ? undefined : defaultKind,
|
|
19
25
|
name: column.name.trim(),
|
|
20
26
|
renamedFrom: column.renamedFrom?.trim(),
|
|
21
27
|
type: typeof column.type === 'string' ? column.type.trim() : column.type,
|
|
22
28
|
comment: column.comment?.trim(),
|
|
23
29
|
codec: column.codec ? canonicalizeCodec(column.codec) : undefined,
|
|
30
|
+
// `{ expression }` becomes the legacy `fn:` string, so snapshots, plans,
|
|
31
|
+
// drift and chkit-py share one representation (#234). A column without a
|
|
32
|
+
// default gains no key, and an overwritten key keeps the position the
|
|
33
|
+
// spread gave it, so JSON-based column comparisons are unchanged.
|
|
34
|
+
...(column.default !== undefined ? { default: canonicalizeColumnDefault(column.default) } : {}),
|
|
24
35
|
};
|
|
25
36
|
}
|
|
26
37
|
function canonicalizeIndex(index) {
|
|
38
|
+
if (index.type === 'text')
|
|
39
|
+
return canonicalizeTextIndex(index);
|
|
27
40
|
return {
|
|
28
41
|
...index,
|
|
29
42
|
expression: normalizeSQLFragment(index.expression),
|
|
30
43
|
};
|
|
31
44
|
}
|
|
45
|
+
// A clause that is only comments is no clause: `ttl: '-- ts + INTERVAL 1 DAY'`
|
|
46
|
+
// must render `REMOVE TTL`, not `MODIFY TTL ;`.
|
|
47
|
+
function normalizeOptionalClause(value) {
|
|
48
|
+
if (!value)
|
|
49
|
+
return undefined;
|
|
50
|
+
return normalizeSQLFragment(value) || undefined;
|
|
51
|
+
}
|
|
32
52
|
function canonicalizeTable(def) {
|
|
33
53
|
const settings = def.settings
|
|
34
54
|
? Object.fromEntries(Object.entries(def.settings).sort(([a], [b]) => a.localeCompare(b)))
|
|
@@ -37,11 +57,12 @@ function canonicalizeTable(def) {
|
|
|
37
57
|
const projections = def.projections
|
|
38
58
|
? sortByName(def.projections).map(canonicalizeProjection)
|
|
39
59
|
: undefined;
|
|
40
|
-
const
|
|
60
|
+
const columnNames = new Set(def.columns.map((column) => column.name.trim()));
|
|
61
|
+
const orderBy = normalizeKeyColumns(def.orderBy, columnNames);
|
|
41
62
|
// ClickHouse derives the primary key from ORDER BY when PRIMARY KEY is
|
|
42
63
|
// omitted. Mirror that so a table with `orderBy` but no `primaryKey` is
|
|
43
64
|
// valid instead of crashing on `undefined.flatMap`.
|
|
44
|
-
const primaryKey = normalizeKeyColumns(def.primaryKey);
|
|
65
|
+
const primaryKey = normalizeKeyColumns(def.primaryKey, columnNames);
|
|
45
66
|
return {
|
|
46
67
|
...def,
|
|
47
68
|
database: def.database.trim(),
|
|
@@ -56,9 +77,9 @@ function canonicalizeTable(def) {
|
|
|
56
77
|
columns: def.columns.map(canonicalizeColumn),
|
|
57
78
|
primaryKey: primaryKey.length > 0 ? primaryKey : orderBy,
|
|
58
79
|
orderBy,
|
|
59
|
-
uniqueKey: def.uniqueKey ? normalizeKeyColumns(def.uniqueKey) : undefined,
|
|
60
|
-
partitionBy:
|
|
61
|
-
ttl:
|
|
80
|
+
uniqueKey: def.uniqueKey ? normalizeKeyColumns(def.uniqueKey, columnNames) : undefined,
|
|
81
|
+
partitionBy: normalizeOptionalClause(def.partitionBy),
|
|
82
|
+
ttl: normalizeOptionalClause(def.ttl),
|
|
62
83
|
settings,
|
|
63
84
|
indexes,
|
|
64
85
|
projections,
|
|
@@ -142,11 +163,46 @@ function canonicalizeMaterializedView(def) {
|
|
|
142
163
|
}
|
|
143
164
|
return canonical;
|
|
144
165
|
}
|
|
166
|
+
function canonicalizeDictionaryAttribute(attribute) {
|
|
167
|
+
return {
|
|
168
|
+
...attribute,
|
|
169
|
+
name: attribute.name.trim(),
|
|
170
|
+
type: typeof attribute.type === 'string' ? attribute.type.trim() : attribute.type,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function canonicalizeDictionary(def) {
|
|
174
|
+
const settings = def.settings
|
|
175
|
+
? Object.fromEntries(Object.entries(def.settings).sort(([a], [b]) => a.localeCompare(b)))
|
|
176
|
+
: undefined;
|
|
177
|
+
return {
|
|
178
|
+
...def,
|
|
179
|
+
database: def.database.trim(),
|
|
180
|
+
name: def.name.trim(),
|
|
181
|
+
renamedFrom: def.renamedFrom
|
|
182
|
+
? {
|
|
183
|
+
database: def.renamedFrom.database?.trim(),
|
|
184
|
+
name: def.renamedFrom.name.trim(),
|
|
185
|
+
}
|
|
186
|
+
: undefined,
|
|
187
|
+
attributes: def.attributes.map(canonicalizeDictionaryAttribute),
|
|
188
|
+
primaryKey: normalizeKeyColumns(def.primaryKey, new Set(def.attributes.map((attribute) => attribute.name.trim()))),
|
|
189
|
+
source: normalizeSQLFragment(def.source),
|
|
190
|
+
layout: normalizeSQLFragment(def.layout),
|
|
191
|
+
lifetime: normalizeSQLFragment(def.lifetime),
|
|
192
|
+
range: def.range
|
|
193
|
+
? { min: def.range.min.trim(), max: def.range.max.trim() }
|
|
194
|
+
: undefined,
|
|
195
|
+
settings: settings && Object.keys(settings).length > 0 ? settings : undefined,
|
|
196
|
+
comment: def.comment?.trim(),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
145
199
|
export function canonicalizeDefinition(def) {
|
|
146
200
|
if (def.kind === 'table')
|
|
147
201
|
return canonicalizeTable(def);
|
|
148
202
|
if (def.kind === 'view')
|
|
149
203
|
return canonicalizeView(def);
|
|
204
|
+
if (def.kind === 'dictionary')
|
|
205
|
+
return canonicalizeDictionary(def);
|
|
150
206
|
return canonicalizeMaterializedView(def);
|
|
151
207
|
}
|
|
152
208
|
export function definitionKey(def) {
|
package/dist/canonical.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ColumnDefaultValue, SQLExpression } from './model.js';
|
|
2
|
+
/** Legacy spelling of an expression default: `'fn:now()'` ≡ `{ expression: 'now()' }`. */
|
|
3
|
+
export declare const LEGACY_EXPRESSION_PREFIX = "fn:";
|
|
4
|
+
export type ParsedColumnDefault = {
|
|
5
|
+
kind: 'expression';
|
|
6
|
+
sql: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'literal';
|
|
9
|
+
value: string | number | boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Classifies a column default. `{ expression }` and a legacy `'fn:'` string
|
|
13
|
+
* are SQL expressions, trimmed with their comments kept (an empty `# ` comment
|
|
14
|
+
* at the end is trimmed like whitespace); every other value is a literal.
|
|
15
|
+
* Canonical definitions, which snapshots and plugin hooks see, always use the
|
|
16
|
+
* `fn:` spelling, so read defaults through this function rather than
|
|
17
|
+
* inspecting the raw value.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseColumnDefault(value: ColumnDefaultValue): ParsedColumnDefault;
|
|
20
|
+
/**
|
|
21
|
+
* Snapshot form of a default: an expression in either spelling becomes the
|
|
22
|
+
* trimmed `fn:` string (`{ expression: ' now() ' }` and `'fn: now()'` both give
|
|
23
|
+
* `'fn:now()'`), so switching spellings plans nothing. Literals are unchanged.
|
|
24
|
+
*/
|
|
25
|
+
export declare function canonicalizeColumnDefault(value: ColumnDefaultValue): string | number | boolean;
|
|
26
|
+
/**
|
|
27
|
+
* SQL for a column default, whatever its `defaultKind`. An expression is its
|
|
28
|
+
* SQL without comments: chkit renders it on the column's line, where a `--`
|
|
29
|
+
* comment would swallow the `,`, COMMENT, CODEC or `;` that follows (#234). A
|
|
30
|
+
* string is a quoted literal with quotes and backslashes escaped; numbers and
|
|
31
|
+
* booleans render as written.
|
|
32
|
+
*/
|
|
33
|
+
export declare function renderDefault(value: ColumnDefaultValue): string;
|
|
34
|
+
export declare function isSQLExpression(value: unknown): value is SQLExpression;
|
|
35
|
+
/** Whether a quoted string literal is a valid value of `type`, whatever its Nullable or LowCardinality wrappers. */
|
|
36
|
+
export declare function columnTypeAcceptsStringLiteral(type: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether ClickHouse accepts any quoted string as a default of the rendered
|
|
39
|
+
* column type `type` and stores NULL when the text does not parse: a Nullable
|
|
40
|
+
* number, decimal, date, time, UUID or IP address. SimpleAggregateFunction
|
|
41
|
+
* defers to its value type, as ClickHouse does.
|
|
42
|
+
*/
|
|
43
|
+
export declare function storesUnparsableLiteralAsNull(type: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* storesUnparsableLiteralAsNull for an EPHEMERAL default, which ClickHouse
|
|
46
|
+
* reads but never stores, so it skips the checks for stored column types.
|
|
47
|
+
* LowCardinality around a Nullable number, date, time, UUID or IP address
|
|
48
|
+
* then reads NULL too, where a DEFAULT column of that type is refused; a type
|
|
49
|
+
* that LowCardinality rejects (decimals, DateTime64, Time64) still fails.
|
|
50
|
+
* Verified on ClickHouse 26.3 (#234).
|
|
51
|
+
*/
|
|
52
|
+
export declare function readsUnparsableEphemeralLiteralAsNull(type: string): boolean;
|
|
53
|
+
/** Text that starts with a function call, e.g. `now()` or `toDate(ts) + 1`. */
|
|
54
|
+
export declare function startsWithFunctionCall(value: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Trims an expression. ClickHouse reads `#` as a comment only before a space
|
|
57
|
+
* or `!`, so trimming the space of an empty `# ` comment at the end would
|
|
58
|
+
* leave a bare `#`, a syntax error. That comment is trimmed with the
|
|
59
|
+
* whitespace instead.
|
|
60
|
+
*/
|
|
61
|
+
export declare function trimExpression(sql: string): string;
|
|
62
|
+
//# sourceMappingURL=column-default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-default.d.ts","sourceRoot":"","sources":["../src/column-default.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAInE,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,QAAQ,CAAA;AA6D7C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAEzD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAMjF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAG9F;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAK/D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,oHAAoH;AACpH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQpE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAc3E;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { splitTopLevelComma } from './key-clause.js';
|
|
2
|
+
import { tokenizeSQL } from './sql-lexer.js';
|
|
3
|
+
import { stripSQLComments } from './sql-normalizer.js';
|
|
4
|
+
/** Legacy spelling of an expression default: `'fn:now()'` ≡ `{ expression: 'now()' }`. */
|
|
5
|
+
export const LEGACY_EXPRESSION_PREFIX = 'fn:';
|
|
6
|
+
/**
|
|
7
|
+
* Type families (upper-cased) whose columns a quoted string literal can
|
|
8
|
+
* populate: String and FixedString with their SQL aliases (case-insensitive in
|
|
9
|
+
* ClickHouse), Enum labels, and Dynamic. Verified on ClickHouse 26.3 by
|
|
10
|
+
* creating `c <type> DEFAULT 'now()'` for every family in
|
|
11
|
+
* system.data_type_families (#234). Nullable and LowCardinality wrappers,
|
|
12
|
+
* Variant and SimpleAggregateFunction are resolved structurally.
|
|
13
|
+
*/
|
|
14
|
+
const STRING_LITERAL_TYPE_FAMILIES = new Set([
|
|
15
|
+
'STRING', 'FIXEDSTRING', 'ENUM', 'ENUM8', 'ENUM16', 'DYNAMIC',
|
|
16
|
+
// FixedString alias
|
|
17
|
+
'BINARY',
|
|
18
|
+
// String aliases
|
|
19
|
+
'BINARY LARGE OBJECT', 'BINARY VARYING', 'BLOB', 'BYTEA', 'CHAR', 'CHAR LARGE OBJECT',
|
|
20
|
+
'CHAR VARYING', 'CHARACTER', 'CHARACTER LARGE OBJECT', 'CHARACTER VARYING', 'CLOB',
|
|
21
|
+
'LONGBLOB', 'LONGTEXT', 'MEDIUMBLOB', 'MEDIUMTEXT', 'NATIONAL CHAR', 'NATIONAL CHAR VARYING',
|
|
22
|
+
'NATIONAL CHARACTER', 'NATIONAL CHARACTER LARGE OBJECT', 'NATIONAL CHARACTER VARYING',
|
|
23
|
+
'NCHAR', 'NCHAR LARGE OBJECT', 'NCHAR VARYING', 'NVARCHAR', 'TEXT', 'TINYBLOB', 'TINYTEXT',
|
|
24
|
+
'VARBINARY', 'VARCHAR', 'VARCHAR2',
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Type families (upper-cased, with their SQL aliases) for which a Nullable
|
|
28
|
+
* column accepts any quoted string default and stores NULL when the text does
|
|
29
|
+
* not parse: numbers, decimals, dates and times, UUID and IP addresses. Bool
|
|
30
|
+
* rejects the text even inside Nullable. Verified on ClickHouse 26.3 by
|
|
31
|
+
* inserting a row into `c Nullable(<type>) DEFAULT 'now()'` for each (#234).
|
|
32
|
+
*/
|
|
33
|
+
const NULL_ON_UNPARSABLE_LITERAL_FAMILIES = new Set([
|
|
34
|
+
'INT8', 'INT16', 'INT32', 'INT64', 'INT128', 'INT256',
|
|
35
|
+
'UINT8', 'UINT16', 'UINT32', 'UINT64', 'UINT128', 'UINT256',
|
|
36
|
+
'BFLOAT16', 'FLOAT32', 'FLOAT64',
|
|
37
|
+
'DECIMAL', 'DECIMAL32', 'DECIMAL64', 'DECIMAL128', 'DECIMAL256',
|
|
38
|
+
'DATE', 'DATE32', 'DATETIME', 'DATETIME32', 'DATETIME64', 'TIME', 'TIME64',
|
|
39
|
+
'UUID', 'IPV4', 'IPV6',
|
|
40
|
+
// Integer aliases
|
|
41
|
+
'BIGINT', 'BIGINT SIGNED', 'BIGINT UNSIGNED', 'BIT', 'BYTE', 'INT', 'INT SIGNED', 'INT UNSIGNED',
|
|
42
|
+
'INT1', 'INT1 SIGNED', 'INT1 UNSIGNED', 'INTEGER', 'INTEGER SIGNED', 'INTEGER UNSIGNED',
|
|
43
|
+
'MEDIUMINT', 'MEDIUMINT SIGNED', 'MEDIUMINT UNSIGNED', 'SET', 'SIGNED', 'SMALLINT',
|
|
44
|
+
'SMALLINT SIGNED', 'SMALLINT UNSIGNED', 'TINYINT', 'TINYINT SIGNED', 'TINYINT UNSIGNED',
|
|
45
|
+
'UNSIGNED', 'YEAR',
|
|
46
|
+
// Float, Decimal, DateTime and IP aliases
|
|
47
|
+
'DOUBLE', 'DOUBLE PRECISION', 'FLOAT', 'REAL', 'SINGLE', 'DEC', 'FIXED', 'NUMERIC',
|
|
48
|
+
'TIMESTAMP', 'INET4', 'INET6',
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* Families of NULL_ON_UNPARSABLE_LITERAL_FAMILIES that ClickHouse refuses
|
|
52
|
+
* inside LowCardinality: decimals, DateTime64 and Time64. Verified on
|
|
53
|
+
* ClickHouse 26.3 by creating `c LowCardinality(Nullable(<type>)) EPHEMERAL 'now()'`
|
|
54
|
+
* for each (#234).
|
|
55
|
+
*/
|
|
56
|
+
const LOW_CARDINALITY_REJECTED_FAMILIES = new Set([
|
|
57
|
+
'DECIMAL', 'DECIMAL32', 'DECIMAL64', 'DECIMAL128', 'DECIMAL256', 'DEC', 'FIXED', 'NUMERIC',
|
|
58
|
+
'DATETIME64', 'TIME64',
|
|
59
|
+
]);
|
|
60
|
+
const FUNCTION_CALL_START = /^[A-Za-z_][A-Za-z0-9_]*\s*\(/;
|
|
61
|
+
/**
|
|
62
|
+
* Classifies a column default. `{ expression }` and a legacy `'fn:'` string
|
|
63
|
+
* are SQL expressions, trimmed with their comments kept (an empty `# ` comment
|
|
64
|
+
* at the end is trimmed like whitespace); every other value is a literal.
|
|
65
|
+
* Canonical definitions, which snapshots and plugin hooks see, always use the
|
|
66
|
+
* `fn:` spelling, so read defaults through this function rather than
|
|
67
|
+
* inspecting the raw value.
|
|
68
|
+
*/
|
|
69
|
+
export function parseColumnDefault(value) {
|
|
70
|
+
if (isSQLExpression(value))
|
|
71
|
+
return { kind: 'expression', sql: trimExpression(value.expression) };
|
|
72
|
+
if (typeof value === 'string' && value.startsWith(LEGACY_EXPRESSION_PREFIX)) {
|
|
73
|
+
return { kind: 'expression', sql: trimExpression(value.slice(LEGACY_EXPRESSION_PREFIX.length)) };
|
|
74
|
+
}
|
|
75
|
+
return { kind: 'literal', value };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Snapshot form of a default: an expression in either spelling becomes the
|
|
79
|
+
* trimmed `fn:` string (`{ expression: ' now() ' }` and `'fn: now()'` both give
|
|
80
|
+
* `'fn:now()'`), so switching spellings plans nothing. Literals are unchanged.
|
|
81
|
+
*/
|
|
82
|
+
export function canonicalizeColumnDefault(value) {
|
|
83
|
+
const parsed = parseColumnDefault(value);
|
|
84
|
+
return parsed.kind === 'expression' ? `${LEGACY_EXPRESSION_PREFIX}${parsed.sql}` : parsed.value;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* SQL for a column default, whatever its `defaultKind`. An expression is its
|
|
88
|
+
* SQL without comments: chkit renders it on the column's line, where a `--`
|
|
89
|
+
* comment would swallow the `,`, COMMENT, CODEC or `;` that follows (#234). A
|
|
90
|
+
* string is a quoted literal with quotes and backslashes escaped; numbers and
|
|
91
|
+
* booleans render as written.
|
|
92
|
+
*/
|
|
93
|
+
export function renderDefault(value) {
|
|
94
|
+
const parsed = parseColumnDefault(value);
|
|
95
|
+
if (parsed.kind === 'expression')
|
|
96
|
+
return stripSQLComments(parsed.sql);
|
|
97
|
+
if (typeof parsed.value === 'string')
|
|
98
|
+
return `'${parsed.value.replace(/\\/g, '\\\\').replace(/'/g, "''")}'`;
|
|
99
|
+
return String(parsed.value);
|
|
100
|
+
}
|
|
101
|
+
export function isSQLExpression(value) {
|
|
102
|
+
return typeof value === 'object' && value !== null && 'expression' in value && typeof value.expression === 'string';
|
|
103
|
+
}
|
|
104
|
+
/** Whether a quoted string literal is a valid value of `type`, whatever its Nullable or LowCardinality wrappers. */
|
|
105
|
+
export function columnTypeAcceptsStringLiteral(type) {
|
|
106
|
+
const { family, args } = parseTypeFamily(unwrapColumnType(type));
|
|
107
|
+
if (family === 'SIMPLEAGGREGATEFUNCTION') {
|
|
108
|
+
const valueType = args.at(-1);
|
|
109
|
+
return args.length >= 2 && valueType !== undefined && columnTypeAcceptsStringLiteral(valueType);
|
|
110
|
+
}
|
|
111
|
+
if (family === 'VARIANT')
|
|
112
|
+
return args.some((member) => columnTypeAcceptsStringLiteral(member));
|
|
113
|
+
return STRING_LITERAL_TYPE_FAMILIES.has(family);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether ClickHouse accepts any quoted string as a default of the rendered
|
|
117
|
+
* column type `type` and stores NULL when the text does not parse: a Nullable
|
|
118
|
+
* number, decimal, date, time, UUID or IP address. SimpleAggregateFunction
|
|
119
|
+
* defers to its value type, as ClickHouse does.
|
|
120
|
+
*/
|
|
121
|
+
export function storesUnparsableLiteralAsNull(type) {
|
|
122
|
+
return literalFallsBackToNull(type, false);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* storesUnparsableLiteralAsNull for an EPHEMERAL default, which ClickHouse
|
|
126
|
+
* reads but never stores, so it skips the checks for stored column types.
|
|
127
|
+
* LowCardinality around a Nullable number, date, time, UUID or IP address
|
|
128
|
+
* then reads NULL too, where a DEFAULT column of that type is refused; a type
|
|
129
|
+
* that LowCardinality rejects (decimals, DateTime64, Time64) still fails.
|
|
130
|
+
* Verified on ClickHouse 26.3 (#234).
|
|
131
|
+
*/
|
|
132
|
+
export function readsUnparsableEphemeralLiteralAsNull(type) {
|
|
133
|
+
const { family, args } = parseTypeFamily(type);
|
|
134
|
+
const [inner] = args;
|
|
135
|
+
if (family !== 'LOWCARDINALITY' || args.length !== 1 || inner === undefined) {
|
|
136
|
+
return storesUnparsableLiteralAsNull(type);
|
|
137
|
+
}
|
|
138
|
+
const nullable = parseTypeFamily(inner);
|
|
139
|
+
const [base] = nullable.args;
|
|
140
|
+
return (nullable.family === 'NULLABLE' &&
|
|
141
|
+
base !== undefined &&
|
|
142
|
+
!LOW_CARDINALITY_REJECTED_FAMILIES.has(parseTypeFamily(base).family) &&
|
|
143
|
+
storesUnparsableLiteralAsNull(inner));
|
|
144
|
+
}
|
|
145
|
+
/** Text that starts with a function call, e.g. `now()` or `toDate(ts) + 1`. */
|
|
146
|
+
export function startsWithFunctionCall(value) {
|
|
147
|
+
return FUNCTION_CALL_START.test(value.trim());
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Trims an expression. ClickHouse reads `#` as a comment only before a space
|
|
151
|
+
* or `!`, so trimming the space of an empty `# ` comment at the end would
|
|
152
|
+
* leave a bare `#`, a syntax error. That comment is trimmed with the
|
|
153
|
+
* whitespace instead.
|
|
154
|
+
*/
|
|
155
|
+
export function trimExpression(sql) {
|
|
156
|
+
let end = sql.length;
|
|
157
|
+
for (const token of tokenizeSQL(sql).reverse()) {
|
|
158
|
+
if (!isBlankAtEnd(token))
|
|
159
|
+
break;
|
|
160
|
+
end = token.start;
|
|
161
|
+
}
|
|
162
|
+
return sql.slice(0, end).trim();
|
|
163
|
+
}
|
|
164
|
+
// Whitespace, including the Unicode whitespace that trim() drops and the lexer
|
|
165
|
+
// reads as punctuation, and a `#` comment without text.
|
|
166
|
+
function isBlankAtEnd(token) {
|
|
167
|
+
if (token.kind === 'whitespace')
|
|
168
|
+
return true;
|
|
169
|
+
if (token.kind === 'punctuation')
|
|
170
|
+
return /^\s$/.test(token.text);
|
|
171
|
+
return token.kind === 'line_comment' && /^#\s*$/.test(token.text);
|
|
172
|
+
}
|
|
173
|
+
function literalFallsBackToNull(type, insideNullable) {
|
|
174
|
+
const { family, args } = parseTypeFamily(type);
|
|
175
|
+
if (family === 'SIMPLEAGGREGATEFUNCTION') {
|
|
176
|
+
const valueType = args.at(-1);
|
|
177
|
+
return args.length >= 2 && valueType !== undefined && literalFallsBackToNull(valueType, insideNullable);
|
|
178
|
+
}
|
|
179
|
+
// Nullable(Nullable(...)) and Nullable(LowCardinality(...)) are rejected.
|
|
180
|
+
if (family === 'NULLABLE') {
|
|
181
|
+
const [inner] = args;
|
|
182
|
+
return !insideNullable && args.length === 1 && inner !== undefined && literalFallsBackToNull(inner, true);
|
|
183
|
+
}
|
|
184
|
+
return insideNullable && NULL_ON_UNPARSABLE_LITERAL_FAMILIES.has(family);
|
|
185
|
+
}
|
|
186
|
+
/** Strips outer `Nullable(…)` and `LowCardinality(…)` layers. */
|
|
187
|
+
function unwrapColumnType(type) {
|
|
188
|
+
let base = type.trim();
|
|
189
|
+
for (;;) {
|
|
190
|
+
const { family, args } = parseTypeFamily(base);
|
|
191
|
+
const [inner] = args;
|
|
192
|
+
if (args.length !== 1 || inner === undefined || (family !== 'NULLABLE' && family !== 'LOWCARDINALITY')) {
|
|
193
|
+
return base;
|
|
194
|
+
}
|
|
195
|
+
base = inner;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** `DateTime64(3, 'UTC')` → `{ family: 'DATETIME64', args: ['3', "'UTC'"] }`. The family is upper-cased with whitespace collapsed. */
|
|
199
|
+
function parseTypeFamily(type) {
|
|
200
|
+
const trimmed = type.trim();
|
|
201
|
+
const open = trimmed.indexOf('(');
|
|
202
|
+
if (open === -1 || !trimmed.endsWith(')'))
|
|
203
|
+
return { family: normalizeTypeFamily(trimmed), args: [] };
|
|
204
|
+
return {
|
|
205
|
+
family: normalizeTypeFamily(trimmed.slice(0, open)),
|
|
206
|
+
args: splitTopLevelComma(trimmed.slice(open + 1, -1)),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function normalizeTypeFamily(name) {
|
|
210
|
+
return name.trim().replace(/\s+/g, ' ').toUpperCase();
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=column-default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-default.js","sourceRoot":"","sources":["../src/column-default.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-markers.d.ts","sourceRoot":"","sources":["../src/conflict-markers.ts"],"names":[],"mappings":"AAKA,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Git writes conflict markers at the start of a line: `<<<<<<< ours`, `=======`,
|
|
2
|
+
// `>>>>>>> theirs`, and `||||||| base` with diff3/zdiff3. `conflict-marker-size`
|
|
3
|
+
// can make them longer than 7 characters.
|
|
4
|
+
const CONFLICT_MARKER_LINE = /^(?:<{7,}|>{7,}|\|{7,})(?:[ \t].*)?$|^={7,}[ \t]*$/;
|
|
5
|
+
/** Whether `text` has a line that git writes for an unresolved merge conflict. */
|
|
6
|
+
export function hasConflictMarkers(text) {
|
|
7
|
+
return text.split(/\r?\n/).some((line) => CONFLICT_MARKER_LINE.test(line));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=conflict-markers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-markers.js","sourceRoot":"","sources":["../src/conflict-markers.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,0CAA0C;AAC1C,MAAM,oBAAoB,GAAG,oDAAoD,CAAA;AAEjF,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a name in backticks, escaping backslashes and backticks so the name can
|
|
3
|
+
* never terminate the quoted identifier early. Matches ClickHouse's own
|
|
4
|
+
* formatting of quoted identifiers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function quoteIdentifier(name: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Renders a database or object name. Plain identifiers stay bare so generated
|
|
9
|
+
* SQL is unchanged for existing schemas; anything else is quoted and escaped.
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderIdentifier(name: string): string;
|
|
12
|
+
export declare function renderQualifiedName(database: string, name: string): string;
|
|
13
|
+
/** Returns why a name cannot be used as a ClickHouse identifier, if it can't. */
|
|
14
|
+
export declare function describeInvalidIdentifier(name: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Replaces every backtick-quoted identifier in a SQL fragment with its raw,
|
|
17
|
+
* unescaped name, leaving string literals untouched. Used to compare clauses
|
|
18
|
+
* that ClickHouse re-renders with its own quoting (e.g. key clauses in drift).
|
|
19
|
+
*/
|
|
20
|
+
export declare function unquoteIdentifiers(sql: string): string;
|
|
21
|
+
export declare function unescapeQuoted(body: string, quote?: string): string;
|
|
22
|
+
//# sourceMappingURL=identifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../src/identifier.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,CAEhE"}
|