orez 0.2.26 → 0.2.29
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/cf-do/worker.d.ts.map +1 -1
- package/dist/cf-do/worker.js +9 -1
- package/dist/cf-do/worker.js.map +1 -1
- package/dist/pg-proxy-do-backend.d.ts +2 -0
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +49 -7
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/pg-sqlite-compiler/catalog/seed.d.ts +67 -0
- package/dist/pg-sqlite-compiler/catalog/seed.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/catalog/seed.js +436 -0
- package/dist/pg-sqlite-compiler/catalog/seed.js.map +1 -0
- package/dist/pg-sqlite-compiler/index.d.ts +12 -0
- package/dist/pg-sqlite-compiler/index.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/index.js +59 -0
- package/dist/pg-sqlite-compiler/index.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/ast-utils.d.ts +48 -0
- package/dist/pg-sqlite-compiler/passes/ast-utils.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/ast-utils.js +93 -0
- package/dist/pg-sqlite-compiler/passes/ast-utils.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/catalog.d.ts +34 -0
- package/dist/pg-sqlite-compiler/passes/catalog.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/catalog.js +30 -0
- package/dist/pg-sqlite-compiler/passes/catalog.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/datetime.d.ts +21 -0
- package/dist/pg-sqlite-compiler/passes/datetime.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/datetime.js +53 -0
- package/dist/pg-sqlite-compiler/passes/datetime.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/index.d.ts +21 -0
- package/dist/pg-sqlite-compiler/passes/index.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/index.js +39 -0
- package/dist/pg-sqlite-compiler/passes/index.js.map +1 -0
- package/dist/pg-sqlite-compiler/passes/types.d.ts +41 -0
- package/dist/pg-sqlite-compiler/passes/types.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/passes/types.js +103 -0
- package/dist/pg-sqlite-compiler/passes/types.js.map +1 -0
- package/dist/pg-sqlite-compiler/test/oracle.d.ts +34 -0
- package/dist/pg-sqlite-compiler/test/oracle.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/test/oracle.js +204 -0
- package/dist/pg-sqlite-compiler/test/oracle.js.map +1 -0
- package/dist/pg-sqlite-compiler/types.d.ts +55 -0
- package/dist/pg-sqlite-compiler/types.d.ts.map +1 -0
- package/dist/pg-sqlite-compiler/types.js +2 -0
- package/dist/pg-sqlite-compiler/types.js.map +1 -0
- package/package.json +8 -4
- package/src/admin/admin-data.test.ts +0 -348
- package/src/admin/http-proxy.ts +0 -252
- package/src/admin/log-store.ts +0 -192
- package/src/admin/server.ts +0 -471
- package/src/admin/ui.ts +0 -1322
- package/src/bench/proxy-throughput.bench.ts +0 -343
- package/src/bench/serial-mutations.bench.ts +0 -270
- package/src/browser.ts +0 -203
- package/src/cf-do/.wrangler/cache/cf.json +0 -1
- package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-shm +0 -0
- package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-wal +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/0f0f3bdf0abda097eb6f1246db4657d9fc622081362d894d82c1a1ce067b05b6.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/1ddd3a4a48a11b51658444f5458a1fb175194b1d5b6a5bda20ef3fe3205b900c.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/204a39120310d37e972c5914cfd71ad55c151bdb9e8ed289a5f8c5b052dd60e4.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/3835f242df9728adba3d127a238793fd054ed3e51df3f60749ee744c469bf2a2.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/4aa9c80eb716cf55b8995ccf7afab0b36c683e6da07d7c37a3f9c570136036df.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/533e2fd1d6ea46e7a9a0017916ef341802d438d72583462755f2c1f8225e9bf2.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/5ffa1aced1225ecaeac6366f7586aa3de92761cdff8711d81fbd81f248076abd.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/686c3a9f0d7e59ed2ab607efd4b76d779c97cafeb3818380033bf7c7eb86c819.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/6e8214e8dcfadd0deb52d64e5e9ca85c6b329ace11193909845995396914c473.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/78d9ec9ff873d3fe3507ff53c2a6f6dfc408b4268eb0db3f2a146c0678965366.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/7eff9f0ed7e27ad0d3f9d923de0682fab1928591172c1ba336c5f79a134a5d85.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/836cda5b995b25867d722ed4f4c2292167e80351a3c6038db626648eb247dd8b.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/91ef63b112209ab30172763acd8a0935106c248f7f1bcae5545ce37a9f201551.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/a66ea4293a5f5938bc6d116edfa2522bb85bc37aea3541fbc09c3b613b9b32c0.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/ceb2ab26b80590840b65651deb6e948d3bf81565c6751f3a58752cf4bf4aecae.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-shm +0 -0
- package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-wal +0 -0
- package/src/cf-do/ARCHITECTURE.md +0 -83
- package/src/cf-do/watermark.test.ts +0 -103
- package/src/cf-do/watermark.ts +0 -118
- package/src/cf-do/worker.ts +0 -1033
- package/src/cf-do/wrangler.toml +0 -11
- package/src/cf-pglite/README.md +0 -19
- package/src/change-tracking.ts +0 -25
- package/src/child-process.test.ts +0 -147
- package/src/child-process.ts +0 -90
- package/src/cli-entry.ts +0 -72
- package/src/cli.test.ts +0 -38
- package/src/cli.ts +0 -1214
- package/src/config.ts +0 -150
- package/src/do-sql-tracking.test.ts +0 -19
- package/src/do-sql-tracking.ts +0 -19
- package/src/index.ts +0 -1215
- package/src/integration/integration.test.ts +0 -517
- package/src/integration/native-binary.guard.test.ts +0 -13
- package/src/integration/native-startup.test.ts +0 -44
- package/src/integration/replication-latency.test.ts +0 -428
- package/src/integration/restore-live-stress.test.ts +0 -433
- package/src/integration/restore-reset.test.ts +0 -400
- package/src/integration/restore.test.ts +0 -274
- package/src/integration/test-permissions.ts +0 -147
- package/src/load-config.ts +0 -46
- package/src/log.ts +0 -96
- package/src/mutex.ts +0 -47
- package/src/pg-proxy-browser.singledb.test.ts +0 -233
- package/src/pg-proxy-browser.ts +0 -2022
- package/src/pg-proxy-do-backend.test.ts +0 -3890
- package/src/pg-proxy-do-backend.ts +0 -7157
- package/src/pg-proxy.ts +0 -1087
- package/src/pglite-ipc.test.ts +0 -116
- package/src/pglite-ipc.ts +0 -266
- package/src/pglite-manager.ts +0 -557
- package/src/pglite-web-proxy.test.ts +0 -57
- package/src/pglite-web-proxy.ts +0 -221
- package/src/pglite-web-worker.ts +0 -152
- package/src/pglite-worker-thread.ts +0 -253
- package/src/port.ts +0 -25
- package/src/process-title.ts +0 -9
- package/src/recovery.ts +0 -155
- package/src/replication/change-tracker.test.ts +0 -357
- package/src/replication/change-tracker.ts +0 -279
- package/src/replication/handler.test.ts +0 -511
- package/src/replication/handler.ts +0 -1190
- package/src/replication/pgoutput-encoder.test.ts +0 -697
- package/src/replication/pgoutput-encoder.ts +0 -373
- package/src/replication/tcp-replication.test.ts +0 -876
- package/src/replication/zero-compat.test.ts +0 -1150
- package/src/restore-stress.test.ts +0 -188
- package/src/s3-local.ts +0 -203
- package/src/shim/hooks.mjs +0 -120
- package/src/shim/register.mjs +0 -4
- package/src/sqlite-mode/apply-mode.ts +0 -224
- package/src/sqlite-mode/index.ts +0 -15
- package/src/sqlite-mode/native-binary.ts +0 -89
- package/src/sqlite-mode/package-resolve.ts +0 -17
- package/src/sqlite-mode/resolve-mode.ts +0 -80
- package/src/sqlite-mode/shim-template.ts +0 -159
- package/src/sqlite-mode/sqlite-mode.test.ts +0 -427
- package/src/sqlite-mode/types.ts +0 -30
- package/src/vite-plugin.ts +0 -67
- package/src/wasm-sqlite.test.ts +0 -537
- package/src/worker/browser-admin.ts +0 -52
- package/src/worker/browser-build-config.test.ts +0 -71
- package/src/worker/browser-build-config.ts +0 -109
- package/src/worker/browser-embed-admin.test.ts +0 -75
- package/src/worker/browser-embed.ts +0 -345
- package/src/worker/cf-patches.ts +0 -384
- package/src/worker/embed-integration.test.ts +0 -321
- package/src/worker/index.ts +0 -138
- package/src/worker/shims/fastify.test.ts +0 -255
- package/src/worker/shims/fastify.ts +0 -306
- package/src/worker/shims/http-service.test.ts +0 -355
- package/src/worker/shims/http-service.ts +0 -293
- package/src/worker/shims/node-stub.ts +0 -290
- package/src/worker/shims/oxfmt.ts +0 -3
- package/src/worker/shims/postgres-browser.ts +0 -59
- package/src/worker/shims/postgres-socket.test.ts +0 -576
- package/src/worker/shims/postgres-socket.ts +0 -310
- package/src/worker/shims/postgres.test.ts +0 -364
- package/src/worker/shims/postgres.ts +0 -1454
- package/src/worker/shims/sqlite-browser.test.ts +0 -233
- package/src/worker/shims/sqlite-browser.ts +0 -175
- package/src/worker/shims/sqlite.test.ts +0 -786
- package/src/worker/shims/sqlite.ts +0 -978
- package/src/worker/shims/stream-browser.ts +0 -15
- package/src/worker/shims/ws-browser.test.ts +0 -205
- package/src/worker/shims/ws-browser.ts +0 -248
- package/src/worker/shims/ws.test.ts +0 -288
- package/src/worker/shims/ws.ts +0 -467
- package/src/worker/shims/zero-process-env.ts +0 -11
- package/src/worker/types.ts +0 -75
- package/src/worker/worker-integration.test.ts +0 -223
- package/src/worker/worker.test.ts +0 -136
- package/src/worker/zero-cache-embed-cf.ts +0 -463
- package/src/worker/zero-cache-embed.ts +0 -277
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog seed — populates `_orez_catalog__*` tables in a DO SQLite database.
|
|
3
|
+
*
|
|
4
|
+
* The catalog pass rewrites `pg_catalog.pg_class`, `information_schema.columns`,
|
|
5
|
+
* etc. references to point at flat `_orez_catalog__*` table names. Here we
|
|
6
|
+
* create those tables and fill them with rows synthesized from SQLite's
|
|
7
|
+
* introspection (`sqlite_master`, `PRAGMA table_info(...)`).
|
|
8
|
+
*
|
|
9
|
+
* Tables seeded (every entry in the catalog pass's recognized-name set —
|
|
10
|
+
* keeping them in sync ensures "no such table" errors don't surface a
|
|
11
|
+
* confusing `_orez_catalog__pg_index`-style internal name):
|
|
12
|
+
*
|
|
13
|
+
* pg_namespace public + pg_catalog + information_schema
|
|
14
|
+
* pg_type ~20 built-in OIDs
|
|
15
|
+
* pg_class one row per user table
|
|
16
|
+
* pg_attribute one row per column
|
|
17
|
+
* pg_attrdef per-column defaults
|
|
18
|
+
* pg_constraint empty stub (queryable, no rows)
|
|
19
|
+
* pg_index empty stub (sqlite_master indexes could be
|
|
20
|
+
* synthesized here in a follow-up)
|
|
21
|
+
* pg_proc empty stub
|
|
22
|
+
* pg_trigger empty stub
|
|
23
|
+
* pg_inherits empty stub
|
|
24
|
+
* pg_depend, pg_description,
|
|
25
|
+
* pg_enum, pg_roles, pg_user,
|
|
26
|
+
* pg_settings empty stubs (queryable)
|
|
27
|
+
* pg_publication one row per supplied publication name
|
|
28
|
+
* pg_publication_tables cross-product when publications set
|
|
29
|
+
* pg_publication_rel empty stub
|
|
30
|
+
* pg_replication_slots empty (orez has its own change tracker)
|
|
31
|
+
* pg_stat_replication empty stub
|
|
32
|
+
* pg_subscription empty stub
|
|
33
|
+
* pg_extension empty stub
|
|
34
|
+
* pg_sequence empty stub
|
|
35
|
+
* pg_views empty stub
|
|
36
|
+
* pg_tables one row per user table
|
|
37
|
+
* pg_collation, pg_am,
|
|
38
|
+
* pg_operator, pg_cast,
|
|
39
|
+
* pg_language, pg_statistic,
|
|
40
|
+
* pg_locks empty stubs
|
|
41
|
+
* information_schema_columns one row per column
|
|
42
|
+
* information_schema_tables one row per user table
|
|
43
|
+
*
|
|
44
|
+
* Idempotent and transactional — wrapped in BEGIN/COMMIT so readers never
|
|
45
|
+
* observe a half-built catalog mid-rebuild. Safe to call on every DO init.
|
|
46
|
+
*
|
|
47
|
+
* Used in tests via `buildCatalogTables(db, opts?)`. In the DO runtime, the
|
|
48
|
+
* same function runs against `ctx.storage.sql` (better-sqlite3-compatible).
|
|
49
|
+
*/
|
|
50
|
+
export interface SqliteLike {
|
|
51
|
+
exec(sql: string): unknown;
|
|
52
|
+
prepare(sql: string): {
|
|
53
|
+
all(...args: unknown[]): unknown[];
|
|
54
|
+
run(...args: unknown[]): unknown;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface SeedOptions {
|
|
58
|
+
/** publication names to expose in pg_publication. */
|
|
59
|
+
publications?: readonly string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Seed catalog tables. Wrapped in a transaction so readers never observe a
|
|
63
|
+
* partial rebuild. Tables created as `_orez_catalog__pg_class` etc. The
|
|
64
|
+
* catalog pass rewrites `pg_catalog.pg_class` → `_orez_catalog__pg_class`.
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildCatalogTables(db: SqliteLike, opts?: SeedOptions): void;
|
|
67
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/catalog/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QACpB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAA;QAClC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACjC;AAgED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,GAAE,WAAgB,GAAG,IAAI,CAqB/E"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog seed — populates `_orez_catalog__*` tables in a DO SQLite database.
|
|
3
|
+
*
|
|
4
|
+
* The catalog pass rewrites `pg_catalog.pg_class`, `information_schema.columns`,
|
|
5
|
+
* etc. references to point at flat `_orez_catalog__*` table names. Here we
|
|
6
|
+
* create those tables and fill them with rows synthesized from SQLite's
|
|
7
|
+
* introspection (`sqlite_master`, `PRAGMA table_info(...)`).
|
|
8
|
+
*
|
|
9
|
+
* Tables seeded (every entry in the catalog pass's recognized-name set —
|
|
10
|
+
* keeping them in sync ensures "no such table" errors don't surface a
|
|
11
|
+
* confusing `_orez_catalog__pg_index`-style internal name):
|
|
12
|
+
*
|
|
13
|
+
* pg_namespace public + pg_catalog + information_schema
|
|
14
|
+
* pg_type ~20 built-in OIDs
|
|
15
|
+
* pg_class one row per user table
|
|
16
|
+
* pg_attribute one row per column
|
|
17
|
+
* pg_attrdef per-column defaults
|
|
18
|
+
* pg_constraint empty stub (queryable, no rows)
|
|
19
|
+
* pg_index empty stub (sqlite_master indexes could be
|
|
20
|
+
* synthesized here in a follow-up)
|
|
21
|
+
* pg_proc empty stub
|
|
22
|
+
* pg_trigger empty stub
|
|
23
|
+
* pg_inherits empty stub
|
|
24
|
+
* pg_depend, pg_description,
|
|
25
|
+
* pg_enum, pg_roles, pg_user,
|
|
26
|
+
* pg_settings empty stubs (queryable)
|
|
27
|
+
* pg_publication one row per supplied publication name
|
|
28
|
+
* pg_publication_tables cross-product when publications set
|
|
29
|
+
* pg_publication_rel empty stub
|
|
30
|
+
* pg_replication_slots empty (orez has its own change tracker)
|
|
31
|
+
* pg_stat_replication empty stub
|
|
32
|
+
* pg_subscription empty stub
|
|
33
|
+
* pg_extension empty stub
|
|
34
|
+
* pg_sequence empty stub
|
|
35
|
+
* pg_views empty stub
|
|
36
|
+
* pg_tables one row per user table
|
|
37
|
+
* pg_collation, pg_am,
|
|
38
|
+
* pg_operator, pg_cast,
|
|
39
|
+
* pg_language, pg_statistic,
|
|
40
|
+
* pg_locks empty stubs
|
|
41
|
+
* information_schema_columns one row per column
|
|
42
|
+
* information_schema_tables one row per user table
|
|
43
|
+
*
|
|
44
|
+
* Idempotent and transactional — wrapped in BEGIN/COMMIT so readers never
|
|
45
|
+
* observe a half-built catalog mid-rebuild. Safe to call on every DO init.
|
|
46
|
+
*
|
|
47
|
+
* Used in tests via `buildCatalogTables(db, opts?)`. In the DO runtime, the
|
|
48
|
+
* same function runs against `ctx.storage.sql` (better-sqlite3-compatible).
|
|
49
|
+
*/
|
|
50
|
+
const NAMESPACE_OID_PUBLIC = 2200;
|
|
51
|
+
const NAMESPACE_OID_PG_CATALOG = 11;
|
|
52
|
+
const NAMESPACE_OID_INFO_SCHEMA = 99;
|
|
53
|
+
const TABLE_OID_BASE = 50_000;
|
|
54
|
+
function hashName(name, base) {
|
|
55
|
+
let h = 0;
|
|
56
|
+
for (let i = 0; i < name.length; i++) {
|
|
57
|
+
h = ((h * 33) ^ name.charCodeAt(i)) >>> 0;
|
|
58
|
+
}
|
|
59
|
+
return base + (h % 1_000_000);
|
|
60
|
+
}
|
|
61
|
+
/** PG type OID lookup for the small set of types we expose. */
|
|
62
|
+
const PG_TYPE_OIDS = {
|
|
63
|
+
bool: 16,
|
|
64
|
+
bytea: 17,
|
|
65
|
+
int8: 20,
|
|
66
|
+
int2: 21,
|
|
67
|
+
int4: 23,
|
|
68
|
+
text: 25,
|
|
69
|
+
oid: 26,
|
|
70
|
+
name: 19,
|
|
71
|
+
float4: 700,
|
|
72
|
+
float8: 701,
|
|
73
|
+
varchar: 1043,
|
|
74
|
+
date: 1082,
|
|
75
|
+
time: 1083,
|
|
76
|
+
timestamp: 1114,
|
|
77
|
+
timestamptz: 1184,
|
|
78
|
+
interval: 1186,
|
|
79
|
+
numeric: 1700,
|
|
80
|
+
json: 114,
|
|
81
|
+
jsonb: 3802,
|
|
82
|
+
uuid: 2950,
|
|
83
|
+
regclass: 2205,
|
|
84
|
+
regtype: 2206,
|
|
85
|
+
regproc: 24,
|
|
86
|
+
};
|
|
87
|
+
/** Map SQLite affinity → PG type name we'll report (best-effort). */
|
|
88
|
+
function sqliteToPgType(decltype) {
|
|
89
|
+
if (!decltype)
|
|
90
|
+
return 'text';
|
|
91
|
+
const lower = decltype.toLowerCase();
|
|
92
|
+
if (lower.includes('int'))
|
|
93
|
+
return 'int4';
|
|
94
|
+
if (lower.includes('char') || lower.includes('clob') || lower === 'text')
|
|
95
|
+
return 'text';
|
|
96
|
+
if (lower.includes('real') || lower.includes('floa') || lower.includes('doub'))
|
|
97
|
+
return 'float8';
|
|
98
|
+
if (lower.includes('blob'))
|
|
99
|
+
return 'bytea';
|
|
100
|
+
if (lower === 'numeric' || lower.includes('dec'))
|
|
101
|
+
return 'numeric';
|
|
102
|
+
return 'text';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Seed catalog tables. Wrapped in a transaction so readers never observe a
|
|
106
|
+
* partial rebuild. Tables created as `_orez_catalog__pg_class` etc. The
|
|
107
|
+
* catalog pass rewrites `pg_catalog.pg_class` → `_orez_catalog__pg_class`.
|
|
108
|
+
*/
|
|
109
|
+
export function buildCatalogTables(db, opts = {}) {
|
|
110
|
+
// De-dupe publication names so we don't violate the UNIQUE constraint
|
|
111
|
+
const publications = [...new Set(opts.publications ?? [])];
|
|
112
|
+
db.exec('BEGIN IMMEDIATE;');
|
|
113
|
+
try {
|
|
114
|
+
seedPgNamespace(db);
|
|
115
|
+
seedPgType(db);
|
|
116
|
+
const tables = readUserTables(db);
|
|
117
|
+
seedPgClass(db, tables);
|
|
118
|
+
seedPgAttributeAndDefaults(db, tables);
|
|
119
|
+
seedPgPublication(db, publications, tables);
|
|
120
|
+
seedSimpleStubs(db);
|
|
121
|
+
seedInformationSchema(db, tables);
|
|
122
|
+
db.exec('COMMIT;');
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
try {
|
|
126
|
+
db.exec('ROLLBACK;');
|
|
127
|
+
}
|
|
128
|
+
catch { }
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function readUserTables(db) {
|
|
133
|
+
return db
|
|
134
|
+
.prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_orez_catalog__%'")
|
|
135
|
+
.all();
|
|
136
|
+
}
|
|
137
|
+
function quoteIdent(name) {
|
|
138
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
139
|
+
}
|
|
140
|
+
function readColumns(db, table) {
|
|
141
|
+
return db.prepare(`PRAGMA table_info(${quoteIdent(table)})`).all();
|
|
142
|
+
}
|
|
143
|
+
function seedPgNamespace(db) {
|
|
144
|
+
db.exec(`
|
|
145
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_namespace;
|
|
146
|
+
CREATE TABLE _orez_catalog__pg_namespace (
|
|
147
|
+
oid INTEGER PRIMARY KEY,
|
|
148
|
+
nspname TEXT NOT NULL,
|
|
149
|
+
nspowner INTEGER NOT NULL DEFAULT 10,
|
|
150
|
+
nspacl TEXT
|
|
151
|
+
);
|
|
152
|
+
`);
|
|
153
|
+
const insert = db.prepare('INSERT INTO _orez_catalog__pg_namespace (oid, nspname) VALUES (?, ?)');
|
|
154
|
+
insert.run(NAMESPACE_OID_PUBLIC, 'public');
|
|
155
|
+
insert.run(NAMESPACE_OID_PG_CATALOG, 'pg_catalog');
|
|
156
|
+
insert.run(NAMESPACE_OID_INFO_SCHEMA, 'information_schema');
|
|
157
|
+
}
|
|
158
|
+
function seedPgType(db) {
|
|
159
|
+
db.exec(`
|
|
160
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_type;
|
|
161
|
+
CREATE TABLE _orez_catalog__pg_type (
|
|
162
|
+
oid INTEGER PRIMARY KEY,
|
|
163
|
+
typname TEXT NOT NULL,
|
|
164
|
+
typnamespace INTEGER NOT NULL DEFAULT ${NAMESPACE_OID_PG_CATALOG},
|
|
165
|
+
typlen INTEGER NOT NULL DEFAULT -1,
|
|
166
|
+
typtype TEXT NOT NULL DEFAULT 'b',
|
|
167
|
+
typbasetype INTEGER NOT NULL DEFAULT 0,
|
|
168
|
+
typelem INTEGER NOT NULL DEFAULT 0,
|
|
169
|
+
typcategory TEXT,
|
|
170
|
+
typnotnull INTEGER NOT NULL DEFAULT 0
|
|
171
|
+
);
|
|
172
|
+
`);
|
|
173
|
+
const insert = db.prepare('INSERT INTO _orez_catalog__pg_type (oid, typname) VALUES (?, ?)');
|
|
174
|
+
for (const [name, oid] of Object.entries(PG_TYPE_OIDS))
|
|
175
|
+
insert.run(oid, name);
|
|
176
|
+
}
|
|
177
|
+
function seedPgClass(db, tables) {
|
|
178
|
+
db.exec(`
|
|
179
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_class;
|
|
180
|
+
CREATE TABLE _orez_catalog__pg_class (
|
|
181
|
+
oid INTEGER PRIMARY KEY,
|
|
182
|
+
relname TEXT NOT NULL,
|
|
183
|
+
relnamespace INTEGER NOT NULL DEFAULT ${NAMESPACE_OID_PUBLIC},
|
|
184
|
+
relkind TEXT NOT NULL DEFAULT 'r',
|
|
185
|
+
relowner INTEGER NOT NULL DEFAULT 10,
|
|
186
|
+
relhasindex INTEGER NOT NULL DEFAULT 0,
|
|
187
|
+
relhasrules INTEGER NOT NULL DEFAULT 0,
|
|
188
|
+
relhastriggers INTEGER NOT NULL DEFAULT 0,
|
|
189
|
+
relhassubclass INTEGER NOT NULL DEFAULT 0,
|
|
190
|
+
relpersistence TEXT NOT NULL DEFAULT 'p',
|
|
191
|
+
reltuples INTEGER NOT NULL DEFAULT 0
|
|
192
|
+
);
|
|
193
|
+
`);
|
|
194
|
+
if (tables.length === 0)
|
|
195
|
+
return;
|
|
196
|
+
const insert = db.prepare('INSERT INTO _orez_catalog__pg_class (oid, relname, relnamespace, relkind) VALUES (?, ?, ?, ?)');
|
|
197
|
+
for (const t of tables) {
|
|
198
|
+
const oid = hashName(t.name, TABLE_OID_BASE);
|
|
199
|
+
const kind = t.type === 'view' ? 'v' : 'r';
|
|
200
|
+
insert.run(oid, t.name, NAMESPACE_OID_PUBLIC, kind);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function seedPgAttributeAndDefaults(db, tables) {
|
|
204
|
+
db.exec(`
|
|
205
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_attribute;
|
|
206
|
+
CREATE TABLE _orez_catalog__pg_attribute (
|
|
207
|
+
attrelid INTEGER NOT NULL,
|
|
208
|
+
attname TEXT NOT NULL,
|
|
209
|
+
attnum INTEGER NOT NULL,
|
|
210
|
+
atttypid INTEGER NOT NULL DEFAULT 25,
|
|
211
|
+
attlen INTEGER NOT NULL DEFAULT -1,
|
|
212
|
+
attnotnull INTEGER NOT NULL DEFAULT 0,
|
|
213
|
+
atthasdef INTEGER NOT NULL DEFAULT 0,
|
|
214
|
+
attisdropped INTEGER NOT NULL DEFAULT 0,
|
|
215
|
+
atttypmod INTEGER NOT NULL DEFAULT -1,
|
|
216
|
+
PRIMARY KEY (attrelid, attnum)
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_attrdef;
|
|
220
|
+
CREATE TABLE _orez_catalog__pg_attrdef (
|
|
221
|
+
oid INTEGER PRIMARY KEY,
|
|
222
|
+
adrelid INTEGER NOT NULL,
|
|
223
|
+
adnum INTEGER NOT NULL,
|
|
224
|
+
adbin TEXT,
|
|
225
|
+
adsrc TEXT
|
|
226
|
+
);
|
|
227
|
+
`);
|
|
228
|
+
const attrInsert = db.prepare('INSERT INTO _orez_catalog__pg_attribute (attrelid, attname, attnum, atttypid, attnotnull, atthasdef) VALUES (?, ?, ?, ?, ?, ?)');
|
|
229
|
+
const defInsert = db.prepare('INSERT INTO _orez_catalog__pg_attrdef (oid, adrelid, adnum, adbin, adsrc) VALUES (?, ?, ?, ?, ?)');
|
|
230
|
+
let defOid = 100_000;
|
|
231
|
+
for (const t of tables) {
|
|
232
|
+
const cols = readColumns(db, t.name);
|
|
233
|
+
if (cols.length === 0)
|
|
234
|
+
continue;
|
|
235
|
+
const oid = hashName(t.name, TABLE_OID_BASE);
|
|
236
|
+
for (const c of cols) {
|
|
237
|
+
const typname = sqliteToPgType(c.type);
|
|
238
|
+
const typoid = PG_TYPE_OIDS[typname] ?? PG_TYPE_OIDS.text;
|
|
239
|
+
const hasdef = c.dflt_value !== null ? 1 : 0;
|
|
240
|
+
attrInsert.run(oid, c.name, c.cid + 1, typoid, c.notnull, hasdef);
|
|
241
|
+
if (c.dflt_value !== null) {
|
|
242
|
+
defInsert.run(defOid++, oid, c.cid + 1, c.dflt_value, c.dflt_value);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function seedPgPublication(db, publications, tables) {
|
|
248
|
+
db.exec(`
|
|
249
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_publication;
|
|
250
|
+
CREATE TABLE _orez_catalog__pg_publication (
|
|
251
|
+
oid INTEGER PRIMARY KEY,
|
|
252
|
+
pubname TEXT NOT NULL UNIQUE,
|
|
253
|
+
pubowner INTEGER NOT NULL DEFAULT 10,
|
|
254
|
+
puballtables INTEGER NOT NULL DEFAULT 0,
|
|
255
|
+
pubinsert INTEGER NOT NULL DEFAULT 1,
|
|
256
|
+
pubupdate INTEGER NOT NULL DEFAULT 1,
|
|
257
|
+
pubdelete INTEGER NOT NULL DEFAULT 1,
|
|
258
|
+
pubtruncate INTEGER NOT NULL DEFAULT 1
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_publication_tables;
|
|
262
|
+
CREATE TABLE _orez_catalog__pg_publication_tables (
|
|
263
|
+
pubname TEXT NOT NULL,
|
|
264
|
+
schemaname TEXT NOT NULL,
|
|
265
|
+
tablename TEXT NOT NULL,
|
|
266
|
+
PRIMARY KEY (pubname, schemaname, tablename)
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
DROP TABLE IF EXISTS _orez_catalog__pg_publication_rel;
|
|
270
|
+
CREATE TABLE _orez_catalog__pg_publication_rel (
|
|
271
|
+
oid INTEGER PRIMARY KEY,
|
|
272
|
+
prpubid INTEGER NOT NULL,
|
|
273
|
+
prrelid INTEGER NOT NULL
|
|
274
|
+
);
|
|
275
|
+
`);
|
|
276
|
+
if (publications.length === 0)
|
|
277
|
+
return;
|
|
278
|
+
const pubInsert = db.prepare('INSERT INTO _orez_catalog__pg_publication (oid, pubname) VALUES (?, ?)');
|
|
279
|
+
const ptInsert = db.prepare('INSERT INTO _orez_catalog__pg_publication_tables (pubname, schemaname, tablename) VALUES (?, ?, ?)');
|
|
280
|
+
const relInsert = db.prepare('INSERT INTO _orez_catalog__pg_publication_rel (oid, prpubid, prrelid) VALUES (?, ?, ?)');
|
|
281
|
+
let relOid = 200_000;
|
|
282
|
+
for (const p of publications) {
|
|
283
|
+
const pubOid = hashName(p, 1_000_000);
|
|
284
|
+
pubInsert.run(pubOid, p);
|
|
285
|
+
for (const t of tables) {
|
|
286
|
+
ptInsert.run(p, 'public', t.name);
|
|
287
|
+
relInsert.run(relOid++, pubOid, hashName(t.name, TABLE_OID_BASE));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Empty-but-queryable stubs for catalog tables that the pass recognizes but
|
|
293
|
+
* we don't actively populate. Created with their PG-compatible columns so
|
|
294
|
+
* SELECT-from-them returns 0 rows cleanly instead of throwing.
|
|
295
|
+
*/
|
|
296
|
+
function seedSimpleStubs(db) {
|
|
297
|
+
const stubs = [
|
|
298
|
+
{
|
|
299
|
+
name: 'pg_constraint',
|
|
300
|
+
columns: 'oid INTEGER PRIMARY KEY, conname TEXT NOT NULL, connamespace INTEGER, contype TEXT, conrelid INTEGER, conindid INTEGER, confrelid INTEGER, conkey TEXT, confkey TEXT',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
name: 'pg_index',
|
|
304
|
+
columns: 'indexrelid INTEGER PRIMARY KEY, indrelid INTEGER NOT NULL, indnatts INTEGER, indisunique INTEGER DEFAULT 0, indisprimary INTEGER DEFAULT 0, indkey TEXT',
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: 'pg_proc',
|
|
308
|
+
columns: 'oid INTEGER PRIMARY KEY, proname TEXT NOT NULL, pronamespace INTEGER, prorettype INTEGER, proargtypes TEXT',
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: 'pg_trigger',
|
|
312
|
+
columns: 'oid INTEGER PRIMARY KEY, tgrelid INTEGER NOT NULL, tgname TEXT NOT NULL, tgfoid INTEGER, tgenabled TEXT',
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: 'pg_inherits',
|
|
316
|
+
columns: 'inhrelid INTEGER NOT NULL, inhparent INTEGER NOT NULL, inhseqno INTEGER',
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
name: 'pg_depend',
|
|
320
|
+
columns: 'classid INTEGER, objid INTEGER, objsubid INTEGER, refclassid INTEGER, refobjid INTEGER, refobjsubid INTEGER, deptype TEXT',
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: 'pg_description',
|
|
324
|
+
columns: 'objoid INTEGER, classoid INTEGER, objsubid INTEGER, description TEXT',
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'pg_enum',
|
|
328
|
+
columns: 'oid INTEGER PRIMARY KEY, enumtypid INTEGER NOT NULL, enumsortorder REAL, enumlabel TEXT NOT NULL',
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: 'pg_extension',
|
|
332
|
+
columns: 'oid INTEGER PRIMARY KEY, extname TEXT NOT NULL, extowner INTEGER, extnamespace INTEGER, extversion TEXT',
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'pg_sequence',
|
|
336
|
+
columns: 'seqrelid INTEGER PRIMARY KEY, seqtypid INTEGER, seqstart INTEGER, seqincrement INTEGER, seqmax INTEGER, seqmin INTEGER, seqcache INTEGER, seqcycle INTEGER',
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: 'pg_views',
|
|
340
|
+
columns: 'schemaname TEXT, viewname TEXT, viewowner TEXT, definition TEXT',
|
|
341
|
+
},
|
|
342
|
+
{ name: 'pg_collation', columns: 'oid INTEGER PRIMARY KEY, collname TEXT NOT NULL' },
|
|
343
|
+
{
|
|
344
|
+
name: 'pg_am',
|
|
345
|
+
columns: 'oid INTEGER PRIMARY KEY, amname TEXT NOT NULL, amtype TEXT',
|
|
346
|
+
},
|
|
347
|
+
{ name: 'pg_operator', columns: 'oid INTEGER PRIMARY KEY, oprname TEXT NOT NULL' },
|
|
348
|
+
{
|
|
349
|
+
name: 'pg_cast',
|
|
350
|
+
columns: 'oid INTEGER PRIMARY KEY, castsource INTEGER, casttarget INTEGER, castfunc INTEGER, castcontext TEXT, castmethod TEXT',
|
|
351
|
+
},
|
|
352
|
+
{ name: 'pg_language', columns: 'oid INTEGER PRIMARY KEY, lanname TEXT NOT NULL' },
|
|
353
|
+
{
|
|
354
|
+
name: 'pg_statistic',
|
|
355
|
+
columns: 'starelid INTEGER, staattnum INTEGER, stainherit INTEGER, stanullfrac REAL',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'pg_locks',
|
|
359
|
+
columns: 'locktype TEXT, database INTEGER, relation INTEGER, page INTEGER, tuple INTEGER, transactionid INTEGER, mode TEXT, granted INTEGER',
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
name: 'pg_replication_slots',
|
|
363
|
+
columns: "slot_name TEXT PRIMARY KEY, plugin TEXT, slot_type TEXT NOT NULL DEFAULT 'logical', database TEXT, active INTEGER NOT NULL DEFAULT 0, restart_lsn TEXT, confirmed_flush_lsn TEXT",
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
name: 'pg_stat_replication',
|
|
367
|
+
columns: 'pid INTEGER, usesysid INTEGER, usename TEXT, application_name TEXT, client_addr TEXT, state TEXT',
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: 'pg_subscription',
|
|
371
|
+
columns: 'oid INTEGER PRIMARY KEY, subname TEXT NOT NULL, subenabled INTEGER, subconninfo TEXT, subslotname TEXT',
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: 'pg_database',
|
|
375
|
+
columns: 'oid INTEGER PRIMARY KEY, datname TEXT NOT NULL',
|
|
376
|
+
},
|
|
377
|
+
{ name: 'pg_roles', columns: 'oid INTEGER PRIMARY KEY, rolname TEXT NOT NULL' },
|
|
378
|
+
{ name: 'pg_user', columns: 'usename TEXT PRIMARY KEY, usesysid INTEGER' },
|
|
379
|
+
{
|
|
380
|
+
name: 'pg_settings',
|
|
381
|
+
columns: 'name TEXT PRIMARY KEY, setting TEXT, category TEXT, short_desc TEXT, context TEXT, vartype TEXT',
|
|
382
|
+
},
|
|
383
|
+
];
|
|
384
|
+
for (const { name, columns } of stubs) {
|
|
385
|
+
db.exec(`DROP TABLE IF EXISTS _orez_catalog__${name}; CREATE TABLE _orez_catalog__${name} (${columns});`);
|
|
386
|
+
}
|
|
387
|
+
// pg_database — single row "main"
|
|
388
|
+
const datInsert = db.prepare('INSERT INTO _orez_catalog__pg_database (oid, datname) VALUES (?, ?)');
|
|
389
|
+
datInsert.run(1, 'main');
|
|
390
|
+
}
|
|
391
|
+
function seedInformationSchema(db, tables) {
|
|
392
|
+
db.exec(`
|
|
393
|
+
DROP TABLE IF EXISTS _orez_catalog__information_schema_columns;
|
|
394
|
+
CREATE TABLE _orez_catalog__information_schema_columns (
|
|
395
|
+
table_catalog TEXT NOT NULL DEFAULT 'main',
|
|
396
|
+
table_schema TEXT NOT NULL DEFAULT 'public',
|
|
397
|
+
table_name TEXT NOT NULL,
|
|
398
|
+
column_name TEXT NOT NULL,
|
|
399
|
+
ordinal_position INTEGER NOT NULL,
|
|
400
|
+
column_default TEXT,
|
|
401
|
+
is_nullable TEXT NOT NULL DEFAULT 'YES',
|
|
402
|
+
data_type TEXT NOT NULL,
|
|
403
|
+
character_maximum_length INTEGER,
|
|
404
|
+
numeric_precision INTEGER,
|
|
405
|
+
numeric_scale INTEGER,
|
|
406
|
+
udt_name TEXT
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
DROP TABLE IF EXISTS _orez_catalog__information_schema_tables;
|
|
410
|
+
CREATE TABLE _orez_catalog__information_schema_tables (
|
|
411
|
+
table_catalog TEXT NOT NULL DEFAULT 'main',
|
|
412
|
+
table_schema TEXT NOT NULL DEFAULT 'public',
|
|
413
|
+
table_name TEXT NOT NULL,
|
|
414
|
+
table_type TEXT NOT NULL DEFAULT 'BASE TABLE',
|
|
415
|
+
PRIMARY KEY (table_schema, table_name)
|
|
416
|
+
);
|
|
417
|
+
`);
|
|
418
|
+
const colInsert = db.prepare('INSERT INTO _orez_catalog__information_schema_columns ' +
|
|
419
|
+
'(table_catalog, table_schema, table_name, column_name, ordinal_position, column_default, is_nullable, data_type, udt_name) ' +
|
|
420
|
+
'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
|
421
|
+
const tblInsert = db.prepare('INSERT INTO _orez_catalog__information_schema_tables (table_catalog, table_schema, table_name, table_type) VALUES (?, ?, ?, ?)');
|
|
422
|
+
for (const t of tables) {
|
|
423
|
+
tblInsert.run('main', 'public', t.name, t.type === 'view' ? 'VIEW' : 'BASE TABLE');
|
|
424
|
+
const cols = readColumns(db, t.name);
|
|
425
|
+
for (const c of cols) {
|
|
426
|
+
const typname = sqliteToPgType(c.type);
|
|
427
|
+
const isNullable = c.notnull ? 'NO' : 'YES';
|
|
428
|
+
// dflt_value from PRAGMA is already a SQL expression as-written (e.g.
|
|
429
|
+
// `'foo'` for a string default, `CURRENT_TIMESTAMP` bare for a keyword
|
|
430
|
+
// default). Pass through unchanged — PG's column_default reports the
|
|
431
|
+
// original expression text.
|
|
432
|
+
colInsert.run('main', 'public', t.name, c.name, c.cid + 1, c.dflt_value, isNullable, typname, typname);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/catalog/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CompileOptions, CompileResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compile a single PG SQL statement into a SQLite-compatible statement.
|
|
4
|
+
*
|
|
5
|
+
* The compiler is best-effort: it applies the registered passes and emits via
|
|
6
|
+
* pgsql-deparser. Some PG-isms are not translatable; those produce warnings
|
|
7
|
+
* but the SQL is still emitted (caller can decide to reject or run anyway).
|
|
8
|
+
*/
|
|
9
|
+
export declare function compile(pgSql: string, opts?: CompileOptions): CompileResult;
|
|
10
|
+
export declare function compileMany(pgSqls: string[], opts?: CompileOptions): CompileResult[];
|
|
11
|
+
export type { CompileOptions, CompileResult, SchemaInfo } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,YAAY,CAAA;AAiB3E;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,CA0B/E;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,GAAE,cAAmB,GACxB,aAAa,EAAE,CAEjB;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pg-sqlite-compiler — PostgreSQL SQL → SQLite SQL.
|
|
3
|
+
*
|
|
4
|
+
* Single-pass visitor over the libpg_query AST, emitting via pgsql-deparser.
|
|
5
|
+
*
|
|
6
|
+
* Public API:
|
|
7
|
+
* compile(pgSql, opts?) → { sql, warnings }
|
|
8
|
+
* compileMany(pgSqls, opts?) → results[]
|
|
9
|
+
*/
|
|
10
|
+
import { deparseSync, parseSync } from 'pgsql-parser';
|
|
11
|
+
import { runPasses } from './passes/index.js';
|
|
12
|
+
const DEFAULT_VERSION = 170004;
|
|
13
|
+
const NOOP_SCHEMA = {
|
|
14
|
+
getColumnType: () => undefined,
|
|
15
|
+
getEnum: () => undefined,
|
|
16
|
+
isEnumValue: () => false,
|
|
17
|
+
getTableColumns: () => undefined,
|
|
18
|
+
};
|
|
19
|
+
function stripTrailingSemicolon(s) {
|
|
20
|
+
let i = s.length;
|
|
21
|
+
while (i > 0 && (s[i - 1] === ';' || s[i - 1] === ' ' || s[i - 1] === '\n'))
|
|
22
|
+
i--;
|
|
23
|
+
return s.slice(0, i);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compile a single PG SQL statement into a SQLite-compatible statement.
|
|
27
|
+
*
|
|
28
|
+
* The compiler is best-effort: it applies the registered passes and emits via
|
|
29
|
+
* pgsql-deparser. Some PG-isms are not translatable; those produce warnings
|
|
30
|
+
* but the SQL is still emitted (caller can decide to reject or run anyway).
|
|
31
|
+
*/
|
|
32
|
+
export function compile(pgSql, opts = {}) {
|
|
33
|
+
const schema = opts.schema ?? NOOP_SCHEMA;
|
|
34
|
+
const version = opts.pgVersion ?? DEFAULT_VERSION;
|
|
35
|
+
const passes = opts.passes;
|
|
36
|
+
const warnings = [];
|
|
37
|
+
const trimmed = stripTrailingSemicolon(pgSql.trim());
|
|
38
|
+
if (!trimmed)
|
|
39
|
+
return { sql: '', warnings };
|
|
40
|
+
// parseSync returns a ParseResult: { version, stmts: [{ stmt: {...} }, ...] }
|
|
41
|
+
const parsed = parseSync(trimmed);
|
|
42
|
+
const stmts = Array.isArray(parsed?.stmts) ? parsed.stmts : [];
|
|
43
|
+
if (stmts.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
sql: trimmed,
|
|
46
|
+
warnings: [{ kind: 'parse-empty', message: 'no statements parsed' }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Run all passes on each top-level RawStmt entry (so passes can walk from root).
|
|
50
|
+
for (let i = 0; i < stmts.length; i++) {
|
|
51
|
+
runPasses(stmts[i], { schema, warnings, passes });
|
|
52
|
+
}
|
|
53
|
+
const emitted = deparseSync({ version: parsed.version ?? version, stmts });
|
|
54
|
+
return { sql: stripTrailingSemicolon(emitted.trim()), warnings };
|
|
55
|
+
}
|
|
56
|
+
export function compileMany(pgSqls, opts = {}) {
|
|
57
|
+
return pgSqls.map((s) => compile(s, opts));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pg-sqlite-compiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,MAAM,eAAe,GAAG,MAAM,CAAA;AAE9B,MAAM,WAAW,GAAe;IAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;IACxB,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS;CACjC,CAAA;AAED,SAAS,sBAAsB,CAAC,CAAS;IACvC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,CAAC,EAAE,CAAA;IAChF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,OAAuB,EAAE;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAA;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,CAAA;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,MAAM,QAAQ,GAA8B,EAAE,CAAA;IAE9C,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;IAE1C,8EAA8E;IAC9E,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAA8C,CAAA;IAC9E,MAAM,KAAK,GAAU,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;SACrE,CAAA;IACH,CAAC;IAED,iFAAiF;IACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO,EAAE,KAAK,EAAS,CAAC,CAAA;IACjF,OAAO,EAAE,GAAG,EAAE,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAgB,EAChB,OAAuB,EAAE;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST traversal helpers tailored to the libpg_query output.
|
|
3
|
+
*
|
|
4
|
+
* The official @pgsql/traverse offers two APIs:
|
|
5
|
+
*
|
|
6
|
+
* walk() — uses a runtime schema; recurses into both tag-wrapped nodes
|
|
7
|
+
* ({SelectStmt:...}) AND unwrapped sub-fields (ColumnDef.typeName
|
|
8
|
+
* is *not* tag-wrapped — it's a plain object). Good for traversal,
|
|
9
|
+
* but mutation requires keyPath bookkeeping.
|
|
10
|
+
*
|
|
11
|
+
* visit() — only recurses into tag-wrapped objects with exactly one key.
|
|
12
|
+
* Misses non-wrapped sub-fields like typeName.
|
|
13
|
+
*
|
|
14
|
+
* For our compiler passes we want: "visit every node of a given tag, AND
|
|
15
|
+
* also visit unwrapped sub-objects that have a known tag-like field set."
|
|
16
|
+
* The simplest reliable approach is a hand-rolled walk: recurse over every
|
|
17
|
+
* object/array, fire callbacks keyed by either (a) the tag wrapper key, or
|
|
18
|
+
* (b) the parent field-name for in-place node types we want to visit
|
|
19
|
+
* (typeName etc.).
|
|
20
|
+
*
|
|
21
|
+
* Each callback gets `(node, parent, key)` so mutation is local: just
|
|
22
|
+
* reassign `parent[key]` (for tag-wrapped) or mutate `node` in place (for
|
|
23
|
+
* unwrapped sub-fields).
|
|
24
|
+
*/
|
|
25
|
+
export type NodeCallback = (node: any, parent: any, key: string | number) => void;
|
|
26
|
+
export interface VisitorMap {
|
|
27
|
+
/**
|
|
28
|
+
* Tag-wrapped nodes: keyed by the wrapper tag name (FuncCall, SelectStmt,
|
|
29
|
+
* SQLValueFunction, etc.). The callback receives the *inner* node data.
|
|
30
|
+
*
|
|
31
|
+
* Also accepts the synthetic tag names for unwrapped sub-fields listed in
|
|
32
|
+
* UNWRAPPED_FIELDS — e.g. `TypeName` fires for the value at any
|
|
33
|
+
* `someParent.typeName` slot.
|
|
34
|
+
*/
|
|
35
|
+
[tag: string]: NodeCallback | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Walk a node tree firing callbacks. For tag-wrapped nodes ({Tag: data}),
|
|
39
|
+
* the callback fires on `data` (inner) with parent=the wrapper's parent,
|
|
40
|
+
* key=where the wrapper sits. For unwrapped sub-fields (typeName etc.),
|
|
41
|
+
* fires on the object directly with parent=its container, key=field name.
|
|
42
|
+
*
|
|
43
|
+
* Mutation rules:
|
|
44
|
+
* - tag-wrapped: assign `parent[key] = newWrapper` to replace the node
|
|
45
|
+
* - unwrapped: mutate `node` in place (it's already the live object)
|
|
46
|
+
*/
|
|
47
|
+
export declare function walkAst(root: any, visitors: VisitorMap): void;
|
|
48
|
+
//# sourceMappingURL=ast-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../../src/pg-sqlite-compiler/passes/ast-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;AAEjF,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAA;CACxC;AA4BD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,CAqC7D"}
|