@zmdb/cockroach 1.0.0-beta.1
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/LICENSE +674 -0
- package/README.md +111 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +2 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +246 -0
- package/dist/introspect.js.map +1 -0
- package/dist/migrations.d.ts +7 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +118 -0
- package/dist/migrations.js.map +1 -0
- package/package.json +54 -0
- package/src/index.ts +146 -0
- package/src/introspect.ts +289 -0
- package/src/migrations.ts +145 -0
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# @zmdb/cockroach
|
|
2
|
+
|
|
3
|
+
The CockroachDB vertical owns the immutable `cockroach` dialect, its migration hooks and catalog introspector, and the `cockroachDriver` adapter. The shared query compiler comes from `@zmdb/sql`;
|
|
4
|
+
repository and driver contracts come from `@zmdb/orm`. `cockroachVertical` pairs this dialect with its driver factory.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
yarn add @zmdb/cockroach@1.0.0-beta.1 @zmdb/sql@1.0.0-beta.1 @zmdb/migrations@1.0.0-beta.1 pg@^8.23.0
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
For the TypeScript snippets, install the declaration inputs used by the packed consumer:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
yarn add --dev typescript@7.0.2 @types/node@26.4.1 @types/pg@8.23.1
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use Node.js 26+ and ESM. Keep the required `@zmdb/sql` and `@zmdb/orm` peers aligned with this package's version; npm resolves those peers. An application already using `zmdb` adds its selected
|
|
19
|
+
database package and client rather than replacing the product facade.
|
|
20
|
+
|
|
21
|
+
The package installs its PostgreSQL-family parent, not `pg`. Install `pg` explicitly for this recipe; no client or pool is loaded by importing the vertical.
|
|
22
|
+
|
|
23
|
+
## Configure
|
|
24
|
+
|
|
25
|
+
The snippets below are successive steps in one module.
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { Pool } from 'pg';
|
|
29
|
+
import { cockroach, cockroachDriver } from '@zmdb/cockroach';
|
|
30
|
+
|
|
31
|
+
const client = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
32
|
+
const driver = cockroachDriver(client);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The application owns the client and closes it with `await client.end()` in a `finally` block after its work. Hosted services that accept this client's protocol are connection recipes, not additional
|
|
36
|
+
official database packages or automatically qualified server variants.
|
|
37
|
+
|
|
38
|
+
## Compile
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import { createQueryCompiler } from '@zmdb/sql';
|
|
42
|
+
|
|
43
|
+
const compiler = createQueryCompiler(cockroach);
|
|
44
|
+
const query = compiler.selectFrom('users').where('id', '=', 7).compile();
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Compilation is pure: the result carries SQL text and a separate parameter array. It does not create the `users` table or open a connection.
|
|
48
|
+
|
|
49
|
+
## Migrate
|
|
50
|
+
|
|
51
|
+
Use `cockroach.migrations.emitUp(operation)` to obtain this database's DDL and `cockroach.migrations.connection(driver)` to create its migration connection. Pass reviewed migration records to `up` and
|
|
52
|
+
`down` from `@zmdb/migrations`; transactional behavior follows the capability table below. The [complete installed workflow](../../fixtures/consumer-database-publication/runtime.mjs) creates a fresh
|
|
53
|
+
table, applies and rolls back its migration, and closes the supplied client.
|
|
54
|
+
|
|
55
|
+
## Introspect
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
const snapshot = await cockroach.introspector.snapshot(driver);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The snapshot comes from the selected database's real catalog through the same driver. `cockroachIntrospector` is also exported directly. Introspection and generated DDL use this vertical's semantics.
|
|
62
|
+
|
|
63
|
+
## Execute
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const rows = await driver.execute(query);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Run this after migrating or otherwise creating the table. Use `driver.transaction(async transaction => ...)` for a pinned transactional driver; the application decides whether to retry. Query values
|
|
70
|
+
travel as parameters, not SQL string interpolation.
|
|
71
|
+
|
|
72
|
+
## Capabilities
|
|
73
|
+
|
|
74
|
+
These entries describe `cockroach.capabilities`; a true entry can still require the client support described below.
|
|
75
|
+
|
|
76
|
+
| Capability | Advertised support |
|
|
77
|
+
| ------------------------------------- | ------------------ |
|
|
78
|
+
| INSERT/upsert/UPDATE/DELETE returning | yes |
|
|
79
|
+
| Transactional DDL | no |
|
|
80
|
+
| Schemas | yes |
|
|
81
|
+
| Sequences | yes |
|
|
82
|
+
| Generated columns | yes |
|
|
83
|
+
| Partial indexes | yes |
|
|
84
|
+
| Foreign keys | yes |
|
|
85
|
+
| Row-level security | no |
|
|
86
|
+
| Streaming | yes |
|
|
87
|
+
| Server-side cancellation | no |
|
|
88
|
+
|
|
89
|
+
## Refusals and ownership
|
|
90
|
+
|
|
91
|
+
PostgreSQL extensions, explicit index methods/operator classes, full-text operators and row-level-security declarations are refused. DDL is non-transactional. `cancelVia` is refused because
|
|
92
|
+
CockroachDB does not provide PostgreSQL `pg_cancel_backend()`. A retryable `40001` can rerun the complete transaction callback; keep non-idempotent external effects outside it.
|
|
93
|
+
|
|
94
|
+
CockroachDB is a one-way child of `@zmdb/postgres`. It reuses the public PostgreSQL-family factories, then owns CockroachDB migration, type and catalog overrides. The parent never depends on its
|
|
95
|
+
child; sharing the wire client does not make PostgreSQL acceptance evidence for CockroachDB.
|
|
96
|
+
|
|
97
|
+
`serial` emits `INT8 DEFAULT unique_rowid()` and `integer` emits `INT4`. The driver preserves node-postgres INT8 values as decimal strings; keep generated IDs opaque instead of coercing them with
|
|
98
|
+
`Number`.
|
|
99
|
+
|
|
100
|
+
## Testing evidence
|
|
101
|
+
|
|
102
|
+
The [database publication qualification](../../fixtures/consumer-database-publication) builds real npm archives and installs this selected package in an independent consumer. Its public workflow
|
|
103
|
+
covers strict declarations, package/client ownership, parameterized CRUD, transaction rollback, migration application/rollback and catalog introspection. The
|
|
104
|
+
[CockroachDB consumer](../../fixtures/database-cockroach) adds the database-specific capability and refusal checks.
|
|
105
|
+
|
|
106
|
+
Issue [#676](https://github.com/ambasta/zmdb/issues/676) records the completed installed workflows. Those observations are scoped to their recorded clients and servers; they do not certify every
|
|
107
|
+
compatible hosted service. Qualification reports identify their source, archive and server inputs. See the [CockroachDB guide](../../docs-site/content/dialect-cockroach.md) for the detailed contract.
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
GNU General Public License v3.0 or later (GPL-3.0-or-later) — see [LICENSE](./LICENSE).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type DatabaseVertical, type TransactionalDriver } from '@zmdb/orm';
|
|
2
|
+
import { type PgConnection, type PgOptions, type PgQueryable } from '@zmdb/postgres';
|
|
3
|
+
import { type SqlDialect } from '@zmdb/sql';
|
|
4
|
+
import { cockroachIntrospector } from './introspect.js';
|
|
5
|
+
import { cockroachMigrations } from './migrations.js';
|
|
6
|
+
export type { PgConnection, PgOptions, PgQueryable };
|
|
7
|
+
export { cockroachIntrospector, cockroachMigrations };
|
|
8
|
+
export declare const cockroach: SqlDialect<'cockroach'>;
|
|
9
|
+
export declare function cockroachDriver(client: PgQueryable, options?: PgOptions): TransactionalDriver<'cockroach'>;
|
|
10
|
+
export declare const cockroachVertical: DatabaseVertical<'cockroach', PgQueryable, PgOptions>;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAkC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrH,OAAO,EAA6C,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAA4B,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC;AAyGtD,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,WAAW,CAgB5C,CAAC;AAEH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAS1G;AAED,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAGlF,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {} from '@zmdb/orm';
|
|
2
|
+
import { postgres, postgresFamilyDriver } from '@zmdb/postgres';
|
|
3
|
+
import { extendSqlDialect, UnsupportedFeatureError } from '@zmdb/sql';
|
|
4
|
+
import { cockroachIntrospector } from './introspect.js';
|
|
5
|
+
import { COCKROACH_TYPE_OVERRIDES, cockroachMigrations } from './migrations.js';
|
|
6
|
+
export { cockroachIntrospector, cockroachMigrations };
|
|
7
|
+
function isPoolLike(client) {
|
|
8
|
+
return (typeof client.connect === 'function' &&
|
|
9
|
+
typeof Reflect.get(client, 'totalCount') === 'number' &&
|
|
10
|
+
typeof Reflect.get(client, 'idleCount') === 'number');
|
|
11
|
+
}
|
|
12
|
+
function normalizeBackendPid(input, result) {
|
|
13
|
+
const text = typeof input === 'string' ? input : input.text;
|
|
14
|
+
if (text.trim().toLowerCase() !== 'select pg_backend_pid() as pid')
|
|
15
|
+
return result;
|
|
16
|
+
return {
|
|
17
|
+
rows: result.rows.map(row => {
|
|
18
|
+
const pid = Reflect.get(row, 'pid');
|
|
19
|
+
if (typeof pid !== 'string' || !/^\d+$/.test(pid))
|
|
20
|
+
return row;
|
|
21
|
+
const numeric = Number(pid);
|
|
22
|
+
return Number.isSafeInteger(numeric) && numeric > 0 ? { ...row, pid: numeric } : row;
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
class CockroachClient {
|
|
27
|
+
target;
|
|
28
|
+
constructor(target) {
|
|
29
|
+
this.target = target;
|
|
30
|
+
}
|
|
31
|
+
async query(input, params) {
|
|
32
|
+
const result = typeof input === 'string' ? await this.target.query(input, params) : await this.target.query(input);
|
|
33
|
+
return normalizeBackendPid(input, result);
|
|
34
|
+
}
|
|
35
|
+
release() {
|
|
36
|
+
const release = this.target.release;
|
|
37
|
+
if (release !== undefined)
|
|
38
|
+
release.call(this.target);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
class CockroachQueryable {
|
|
42
|
+
target;
|
|
43
|
+
constructor(target) {
|
|
44
|
+
this.target = target;
|
|
45
|
+
}
|
|
46
|
+
async query(input, params) {
|
|
47
|
+
const result = typeof input === 'string' ? await this.target.query(input, params) : await this.target.query(input);
|
|
48
|
+
return normalizeBackendPid(input, result);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class CockroachPool extends CockroachQueryable {
|
|
52
|
+
pool;
|
|
53
|
+
constructor(pool) {
|
|
54
|
+
super(pool);
|
|
55
|
+
this.pool = pool;
|
|
56
|
+
}
|
|
57
|
+
get totalCount() {
|
|
58
|
+
return this.pool.totalCount;
|
|
59
|
+
}
|
|
60
|
+
get idleCount() {
|
|
61
|
+
return this.pool.idleCount;
|
|
62
|
+
}
|
|
63
|
+
async connect() {
|
|
64
|
+
return new CockroachClient(await this.pool.connect());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function cockroachQueryable(client) {
|
|
68
|
+
return isPoolLike(client) ? new CockroachPool(client) : new CockroachQueryable(client);
|
|
69
|
+
}
|
|
70
|
+
export const cockroach = extendSqlDialect(postgres, {
|
|
71
|
+
name: 'cockroach',
|
|
72
|
+
traits: {
|
|
73
|
+
types: COCKROACH_TYPE_OVERRIDES,
|
|
74
|
+
fts: 'none',
|
|
75
|
+
retryableCodes: ['40001'],
|
|
76
|
+
vectorDistance: false,
|
|
77
|
+
spatialPredicates: false,
|
|
78
|
+
},
|
|
79
|
+
capabilities: {
|
|
80
|
+
transactionalDdl: false,
|
|
81
|
+
rowLevelSecurity: false,
|
|
82
|
+
cancellation: false,
|
|
83
|
+
},
|
|
84
|
+
migrations: cockroachMigrations,
|
|
85
|
+
introspector: cockroachIntrospector,
|
|
86
|
+
});
|
|
87
|
+
export function cockroachDriver(client, options) {
|
|
88
|
+
if (options?.cancelVia !== undefined) {
|
|
89
|
+
throw new UnsupportedFeatureError('server-side cancellation', 'cockroach', 'cockroach does not provide PostgreSQL pg_cancel_backend(); omit PgOptions.cancelVia');
|
|
90
|
+
}
|
|
91
|
+
return postgresFamilyDriver(cockroach, cockroachQueryable(client), options);
|
|
92
|
+
}
|
|
93
|
+
export const cockroachVertical = Object.freeze({
|
|
94
|
+
dialect: cockroach,
|
|
95
|
+
driver: cockroachDriver,
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"AA8RA,eAAO,MAAM,qBAAqB,+CAEhC,CAAC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { CatalogRowError, integerField, query, textField, } from '@zmdb/migrations/introspect/runtime';
|
|
2
|
+
import { postgresFamilyIntrospector } from '@zmdb/postgres';
|
|
3
|
+
import {} from '@zmdb/sql';
|
|
4
|
+
function quoteIdentifier(identifier) {
|
|
5
|
+
return `"${identifier.replaceAll('"', '""')}"`;
|
|
6
|
+
}
|
|
7
|
+
function selectedSchemas(options) {
|
|
8
|
+
const schemas = options?.schemas ?? ['public'];
|
|
9
|
+
return schemas.length === 0 ? ['public'] : [...new Set(schemas)].toSorted();
|
|
10
|
+
}
|
|
11
|
+
function placeholders(count) {
|
|
12
|
+
return Array.from({ length: count }, (_, index) => `$${String(index + 1)}`).join(', ');
|
|
13
|
+
}
|
|
14
|
+
function booleanField(row, field, catalog, index) {
|
|
15
|
+
const value = Reflect.get(row, field);
|
|
16
|
+
if (typeof value === 'boolean')
|
|
17
|
+
return value;
|
|
18
|
+
if (value === 't' || value === 'true' || value === 1 || value === '1')
|
|
19
|
+
return true;
|
|
20
|
+
if (value === 'f' || value === 'false' || value === 0 || value === '0')
|
|
21
|
+
return false;
|
|
22
|
+
throw new CatalogRowError(catalog, index, field, 'a boolean', value);
|
|
23
|
+
}
|
|
24
|
+
function parseIndexRow(row, index) {
|
|
25
|
+
const catalog = 'cockroach SHOW INDEXES';
|
|
26
|
+
return {
|
|
27
|
+
name: textField(row, 'index_name', catalog, index),
|
|
28
|
+
nonUnique: booleanField(row, 'non_unique', catalog, index),
|
|
29
|
+
sequence: integerField(row, 'seq_in_index', catalog, index),
|
|
30
|
+
column: textField(row, 'column_name', catalog, index),
|
|
31
|
+
definition: textField(row, 'definition', catalog, index),
|
|
32
|
+
storing: booleanField(row, 'storing', catalog, index),
|
|
33
|
+
implicit: booleanField(row, 'implicit', catalog, index),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function unquoteIdentifier(value) {
|
|
37
|
+
return value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1).replaceAll('""', '"') : value;
|
|
38
|
+
}
|
|
39
|
+
function balancedOuterParentheses(value) {
|
|
40
|
+
if (!value.startsWith('(') || !value.endsWith(')'))
|
|
41
|
+
return false;
|
|
42
|
+
let depth = 0;
|
|
43
|
+
let quoteCharacter;
|
|
44
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
45
|
+
const character = value[index];
|
|
46
|
+
if (quoteCharacter !== undefined) {
|
|
47
|
+
if (character === quoteCharacter) {
|
|
48
|
+
if (value[index + 1] === quoteCharacter)
|
|
49
|
+
index += 1;
|
|
50
|
+
else
|
|
51
|
+
quoteCharacter = undefined;
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (character === "'" || character === '"') {
|
|
56
|
+
quoteCharacter = character;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (character === '(')
|
|
60
|
+
depth += 1;
|
|
61
|
+
if (character === ')')
|
|
62
|
+
depth -= 1;
|
|
63
|
+
if (depth === 0 && index < value.length - 1)
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return depth === 0;
|
|
67
|
+
}
|
|
68
|
+
function stripOuterParentheses(value) {
|
|
69
|
+
let current = value.trim();
|
|
70
|
+
while (balancedOuterParentheses(current))
|
|
71
|
+
current = current.slice(1, -1).trim();
|
|
72
|
+
return current;
|
|
73
|
+
}
|
|
74
|
+
function indexColumn(row, tableColumns) {
|
|
75
|
+
if (!row.column.startsWith('crdb_internal_') && tableColumns.has(row.column))
|
|
76
|
+
return row.column;
|
|
77
|
+
const definition = row.definition.trim();
|
|
78
|
+
const identifier = /^("(?:[^"]|"")*"|[A-Za-z_][A-Za-z0-9_$]*)$/.exec(definition)?.[1];
|
|
79
|
+
if (identifier !== undefined) {
|
|
80
|
+
const column = unquoteIdentifier(identifier);
|
|
81
|
+
if (tableColumns.has(column))
|
|
82
|
+
return column;
|
|
83
|
+
}
|
|
84
|
+
return { expr: stripOuterParentheses(definition) };
|
|
85
|
+
}
|
|
86
|
+
function identifierAt(value, start) {
|
|
87
|
+
if (value[start] === '"') {
|
|
88
|
+
let index = start + 1;
|
|
89
|
+
let name = '';
|
|
90
|
+
while (index < value.length) {
|
|
91
|
+
const character = value[index];
|
|
92
|
+
if (character === '"') {
|
|
93
|
+
if (value[index + 1] === '"') {
|
|
94
|
+
name += '"';
|
|
95
|
+
index += 2;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
return { name, end: index + 1 };
|
|
99
|
+
}
|
|
100
|
+
if (character === undefined)
|
|
101
|
+
return undefined;
|
|
102
|
+
name += character;
|
|
103
|
+
index += 1;
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
const match = /^[A-Za-z_][A-Za-z0-9_$]*/.exec(value.slice(start));
|
|
108
|
+
const name = match?.[0];
|
|
109
|
+
return name === undefined ? undefined : { name, end: start + name.length };
|
|
110
|
+
}
|
|
111
|
+
function matchingParenthesis(value, open) {
|
|
112
|
+
let depth = 0;
|
|
113
|
+
let quoteCharacter;
|
|
114
|
+
for (let index = open; index < value.length; index += 1) {
|
|
115
|
+
const character = value[index];
|
|
116
|
+
if (quoteCharacter !== undefined) {
|
|
117
|
+
if (character === quoteCharacter) {
|
|
118
|
+
if (value[index + 1] === quoteCharacter)
|
|
119
|
+
index += 1;
|
|
120
|
+
else
|
|
121
|
+
quoteCharacter = undefined;
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (character === "'" || character === '"') {
|
|
126
|
+
quoteCharacter = character;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (character === '(')
|
|
130
|
+
depth += 1;
|
|
131
|
+
if (character === ')') {
|
|
132
|
+
depth -= 1;
|
|
133
|
+
if (depth === 0)
|
|
134
|
+
return index;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
function indexPredicates(createStatement) {
|
|
140
|
+
const predicates = new Map();
|
|
141
|
+
for (const rawLine of createStatement.split('\n')) {
|
|
142
|
+
const line = rawLine.trim().replace(/,$/, '');
|
|
143
|
+
const prefix = /^(?:UNIQUE\s+)?INDEX\s+/i.exec(line)?.[0];
|
|
144
|
+
if (prefix === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
const identifier = identifierAt(line, prefix.length);
|
|
147
|
+
if (identifier === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
const open = line.indexOf('(', identifier.end);
|
|
150
|
+
if (open === -1)
|
|
151
|
+
continue;
|
|
152
|
+
const close = matchingParenthesis(line, open);
|
|
153
|
+
if (close === undefined)
|
|
154
|
+
continue;
|
|
155
|
+
const suffix = line.slice(close + 1);
|
|
156
|
+
const where = /\sWHERE\s+(.+)$/i.exec(suffix)?.[1]?.trim();
|
|
157
|
+
if (where !== undefined && where.length > 0)
|
|
158
|
+
predicates.set(identifier.name, where);
|
|
159
|
+
}
|
|
160
|
+
return predicates;
|
|
161
|
+
}
|
|
162
|
+
function indexes(rows, primaryIndexes, tableColumns, predicates) {
|
|
163
|
+
const grouped = new Map();
|
|
164
|
+
for (const row of rows) {
|
|
165
|
+
if (primaryIndexes.has(row.name) || row.storing || row.implicit)
|
|
166
|
+
continue;
|
|
167
|
+
const values = grouped.get(row.name);
|
|
168
|
+
if (values === undefined)
|
|
169
|
+
grouped.set(row.name, [row]);
|
|
170
|
+
else
|
|
171
|
+
values.push(row);
|
|
172
|
+
}
|
|
173
|
+
return [...grouped]
|
|
174
|
+
.map(([name, values]) => {
|
|
175
|
+
const sorted = values.toSorted((left, right) => left.sequence - right.sequence);
|
|
176
|
+
const first = sorted[0];
|
|
177
|
+
if (first === undefined)
|
|
178
|
+
throw new Error(`cockroach index "${name}" has no key columns`);
|
|
179
|
+
const where = predicates.get(name);
|
|
180
|
+
return {
|
|
181
|
+
name,
|
|
182
|
+
columns: sorted.map(row => indexColumn(row, tableColumns)),
|
|
183
|
+
unique: !first.nonUnique,
|
|
184
|
+
...(where === undefined ? {} : { where }),
|
|
185
|
+
};
|
|
186
|
+
})
|
|
187
|
+
.toSorted((left, right) => left.name.localeCompare(right.name));
|
|
188
|
+
}
|
|
189
|
+
async function schemasByTable(driver, options) {
|
|
190
|
+
const schemas = selectedSchemas(options);
|
|
191
|
+
const rows = await driver.execute(query(`SELECT table_schema, table_name FROM information_schema.tables ` +
|
|
192
|
+
`WHERE table_type = 'BASE TABLE' AND table_schema IN (${placeholders(schemas.length)}) ` +
|
|
193
|
+
'ORDER BY table_schema, table_name', schemas));
|
|
194
|
+
return new Map(rows.map((row, index) => [
|
|
195
|
+
textField(row, 'table_name', 'cockroach information_schema.tables', index),
|
|
196
|
+
textField(row, 'table_schema', 'cockroach information_schema.tables', index),
|
|
197
|
+
]));
|
|
198
|
+
}
|
|
199
|
+
function cockroachColumn(column) {
|
|
200
|
+
const defaultValue = column.default?.trim().toLowerCase();
|
|
201
|
+
if (column.type !== 'bigint' ||
|
|
202
|
+
defaultValue === undefined ||
|
|
203
|
+
!/^unique_rowid\(\)(?:::[a-z0-9_ ]+)?$/.test(defaultValue)) {
|
|
204
|
+
return column;
|
|
205
|
+
}
|
|
206
|
+
const { default: ignoredDefault, ...withoutDefault } = column;
|
|
207
|
+
void ignoredDefault;
|
|
208
|
+
return { ...withoutDefault, type: 'serial' };
|
|
209
|
+
}
|
|
210
|
+
async function cockroachTable(driver, schema, table) {
|
|
211
|
+
const qualified = `${quoteIdentifier(schema)}.${quoteIdentifier(table.name)}`;
|
|
212
|
+
const [indexRows, constraintRows, createRows] = await Promise.all([
|
|
213
|
+
driver.execute(query(`SHOW INDEXES FROM ${qualified}`)),
|
|
214
|
+
driver.execute(query(`SHOW CONSTRAINTS FROM ${qualified}`)),
|
|
215
|
+
driver.execute(query(`SHOW CREATE TABLE ${qualified}`)),
|
|
216
|
+
]);
|
|
217
|
+
const primaryIndexes = new Set(constraintRows
|
|
218
|
+
.filter((row, index) => textField(row, 'constraint_type', 'cockroach SHOW CONSTRAINTS', index) === 'PRIMARY KEY')
|
|
219
|
+
.map((row, index) => textField(row, 'constraint_name', 'cockroach SHOW CONSTRAINTS', index)));
|
|
220
|
+
const createRow = createRows[0];
|
|
221
|
+
if (createRow === undefined)
|
|
222
|
+
throw new Error(`cockroach SHOW CREATE returned no row for ${qualified}`);
|
|
223
|
+
const predicates = indexPredicates(textField(createRow, 'create_statement', 'cockroach SHOW CREATE TABLE', 0));
|
|
224
|
+
const columns = table.columns.map(cockroachColumn);
|
|
225
|
+
return {
|
|
226
|
+
...table,
|
|
227
|
+
columns,
|
|
228
|
+
indexes: indexes(indexRows.map(parseIndexRow), primaryIndexes, new Set(columns.map(column => column.name)), predicates),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function cockroachSnapshot(parent, driver, options) {
|
|
232
|
+
const base = await parent(driver, options);
|
|
233
|
+
const schemaByTable = await schemasByTable(driver, options);
|
|
234
|
+
const tables = [];
|
|
235
|
+
for (const table of base.tables) {
|
|
236
|
+
const schema = schemaByTable.get(table.name);
|
|
237
|
+
if (schema === undefined)
|
|
238
|
+
throw new Error(`cockroach introspection could not resolve the schema for "${table.name}"`);
|
|
239
|
+
tables.push(await cockroachTable(driver, schema, table));
|
|
240
|
+
}
|
|
241
|
+
return { ...base, tables };
|
|
242
|
+
}
|
|
243
|
+
export const cockroachIntrospector = postgresFamilyIntrospector('cockroach', {
|
|
244
|
+
snapshot: cockroachSnapshot,
|
|
245
|
+
});
|
|
246
|
+
//# sourceMappingURL=introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type MigrationDialect } from '@zmdb/sql';
|
|
2
|
+
export declare const COCKROACH_TYPE_OVERRIDES: Readonly<{
|
|
3
|
+
serial: "INT8 DEFAULT unique_rowid()";
|
|
4
|
+
integer: "INT4";
|
|
5
|
+
}>;
|
|
6
|
+
export declare const cockroachMigrations: MigrationDialect<'cockroach'>;
|
|
7
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,gBAAgB,EAKtB,MAAM,WAAW,CAAC;AAGnB,eAAO,MAAM,wBAAwB;;;EAGnC,CAAC;AAyFH,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,CAAC,WAAW,CAuC5D,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { postgresFamilyMigrations } from '@zmdb/postgres';
|
|
2
|
+
import { UnsupportedFeatureError, } from '@zmdb/sql';
|
|
3
|
+
import {} from '@zmdb/sql/schema-objects';
|
|
4
|
+
export const COCKROACH_TYPE_OVERRIDES = Object.freeze({
|
|
5
|
+
serial: 'INT8 DEFAULT unique_rowid()',
|
|
6
|
+
integer: 'INT4',
|
|
7
|
+
});
|
|
8
|
+
const parent = postgresFamilyMigrations('cockroach', {
|
|
9
|
+
types: COCKROACH_TYPE_OVERRIDES,
|
|
10
|
+
});
|
|
11
|
+
function extensionName(type) {
|
|
12
|
+
return `${type.extension}.${type.name}`;
|
|
13
|
+
}
|
|
14
|
+
function refuseExtension(feature) {
|
|
15
|
+
throw new UnsupportedFeatureError(feature, 'cockroach', `cockroach does not expose PostgreSQL extension installation or extension-backed column types (${feature})`);
|
|
16
|
+
}
|
|
17
|
+
function validateColumn(column) {
|
|
18
|
+
if (typeof column.type !== 'string')
|
|
19
|
+
refuseExtension(`extension type ${extensionName(column.type)}`);
|
|
20
|
+
}
|
|
21
|
+
function validateSnapshot(snapshot) {
|
|
22
|
+
const extension = snapshot.extensions[0];
|
|
23
|
+
if (extension !== undefined)
|
|
24
|
+
refuseExtension(`extension "${extension.name}"`);
|
|
25
|
+
for (const table of snapshot.tables) {
|
|
26
|
+
for (const column of table.columns)
|
|
27
|
+
validateColumn(column);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function validateOperation(operation) {
|
|
31
|
+
switch (operation.kind) {
|
|
32
|
+
case 'create_extension':
|
|
33
|
+
refuseExtension(`extension "${operation.name}"`);
|
|
34
|
+
case 'create_table':
|
|
35
|
+
for (const column of operation.columns)
|
|
36
|
+
validateColumn(column);
|
|
37
|
+
return;
|
|
38
|
+
case 'add_column':
|
|
39
|
+
validateColumn(operation.column);
|
|
40
|
+
return;
|
|
41
|
+
case 'alter_column_type':
|
|
42
|
+
if (typeof operation.from !== 'string')
|
|
43
|
+
refuseExtension(`extension type ${extensionName(operation.from)}`);
|
|
44
|
+
if (typeof operation.to !== 'string')
|
|
45
|
+
refuseExtension(`extension type ${extensionName(operation.to)}`);
|
|
46
|
+
return;
|
|
47
|
+
default:
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function opclass(column) {
|
|
52
|
+
return typeof column === 'string' ? undefined : column.opclass;
|
|
53
|
+
}
|
|
54
|
+
function validateSchemaObject(operation) {
|
|
55
|
+
switch (operation.kind) {
|
|
56
|
+
case 'enable_rls':
|
|
57
|
+
case 'create_policy':
|
|
58
|
+
throw new UnsupportedFeatureError('row-level security', 'cockroach', 'cockroach row-level-security support varies by server release; @zmdb/cockroach refuses PostgreSQL policy DDL');
|
|
59
|
+
case 'create_extension':
|
|
60
|
+
refuseExtension(`extension "${operation.definition.name}"`);
|
|
61
|
+
case 'create_index': {
|
|
62
|
+
const method = operation.definition.method;
|
|
63
|
+
if (method !== undefined) {
|
|
64
|
+
throw new UnsupportedFeatureError(`index method ${method}`, 'cockroach', `cockroach indexes are emitted without a PostgreSQL USING method ("${operation.definition.name}")`);
|
|
65
|
+
}
|
|
66
|
+
const column = operation.definition.columns.find(value => opclass(value) !== undefined);
|
|
67
|
+
const selectedOpclass = column === undefined ? undefined : opclass(column);
|
|
68
|
+
if (selectedOpclass !== undefined) {
|
|
69
|
+
throw new UnsupportedFeatureError(`index operator class ${selectedOpclass}`, 'cockroach', `cockroach indexes do not accept PostgreSQL operator classes ("${operation.definition.name}")`);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
default:
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export const cockroachMigrations = Object.freeze({
|
|
78
|
+
name: 'cockroach',
|
|
79
|
+
foreignKeyMode: 'deferred',
|
|
80
|
+
embedded: false,
|
|
81
|
+
validateSnapshot(snapshot) {
|
|
82
|
+
parent.validateSnapshot(snapshot);
|
|
83
|
+
validateSnapshot(snapshot);
|
|
84
|
+
},
|
|
85
|
+
validatePlan(plan) {
|
|
86
|
+
parent.validatePlan(plan);
|
|
87
|
+
validateSnapshot(plan.before);
|
|
88
|
+
validateSnapshot(plan.after);
|
|
89
|
+
for (const operation of plan.operations)
|
|
90
|
+
validateOperation(operation);
|
|
91
|
+
},
|
|
92
|
+
ddlType(column) {
|
|
93
|
+
validateColumn(column);
|
|
94
|
+
return parent.ddlType(column);
|
|
95
|
+
},
|
|
96
|
+
emitUp(operation) {
|
|
97
|
+
validateOperation(operation);
|
|
98
|
+
return parent.emitUp(operation);
|
|
99
|
+
},
|
|
100
|
+
emitDown(operation) {
|
|
101
|
+
validateOperation(operation);
|
|
102
|
+
return parent.emitDown(operation);
|
|
103
|
+
},
|
|
104
|
+
emitSchemaObject(operation) {
|
|
105
|
+
validateSchemaObject(operation);
|
|
106
|
+
return parent.emitSchemaObject(operation);
|
|
107
|
+
},
|
|
108
|
+
connection(driver, options) {
|
|
109
|
+
const connection = parent.connection(driver, options);
|
|
110
|
+
const { transaction: ignoredTransaction, ...nonTransactional } = connection;
|
|
111
|
+
void ignoredTransaction;
|
|
112
|
+
return Object.freeze({
|
|
113
|
+
...nonTransactional,
|
|
114
|
+
transactionalDdl: false,
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|