@voltro/database 0.85.0 → 0.87.0
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/CHANGELOG.md +5987 -0
- package/THIRD-PARTY-NOTICES.md +5 -257
- package/dist/actorSnapshot.js +24 -0
- package/dist/arrayCodec.js +32 -0
- package/dist/branchExecute.js +92 -0
- package/dist/branching.js +106 -0
- package/dist/bulkInsertLimits.js +25 -0
- package/dist/cdcOffsetsTables.js +19 -0
- package/dist/changeEvent.js +41 -0
- package/dist/changeIdentity.js +65 -0
- package/dist/changeListenerCeiling.js +6 -0
- package/dist/columnReference.js +17 -0
- package/dist/columns.js +326 -0
- package/dist/committedChanges.js +12 -0
- package/dist/connectionIdentity.js +36 -0
- package/dist/coreTables.js +16 -0
- package/dist/coreTablesRegistry.js +10 -0
- package/dist/dataTransfers.js +23 -0
- package/dist/dbCause.js +222 -0
- package/dist/dbMetrics.js +65 -0
- package/dist/decimalComparison.js +27 -0
- package/dist/derivedRowId.js +5 -0
- package/dist/dialect.js +13 -0
- package/dist/enumRenames.js +14 -0
- package/dist/expiresMixin.js +10 -0
- package/dist/fieldEncryption.js +121 -0
- package/dist/frameworkTables.js +143 -0
- package/dist/ginIndex.js +10 -0
- package/dist/hybridSearch.js +32 -0
- package/dist/idGenerator.js +57 -0
- package/dist/identifierLimits.js +32 -0
- package/dist/index.d.ts +166 -22
- package/dist/index.js +82 -2183
- package/dist/indexAudit.js +61 -0
- package/dist/indexStorage.js +58 -0
- package/dist/joinCompiler.js +160 -0
- package/dist/jsonEagerCompiler.js +436 -0
- package/dist/jsonPatch.js +78 -0
- package/dist/jsonPatchAssignments.js +13 -0
- package/dist/jsonPath.js +31 -0
- package/dist/localFirstMixin.js +12 -0
- package/dist/migrate.js +644 -0
- package/dist/migration.js +18 -0
- package/dist/migrations/appliedAtValue.js +8 -0
- package/dist/migrations/applier.js +1100 -0
- package/dist/migrations/boot.js +196 -0
- package/dist/migrations/branchRehearsal.js +122 -0
- package/dist/migrations/columnEquivalence.js +85 -0
- package/dist/migrations/ddlError.js +63 -0
- package/dist/migrations/ddlStatements.js +9 -0
- package/dist/migrations/declaredSchema.js +162 -0
- package/dist/migrations/deployLedger.js +19 -0
- package/dist/migrations/fileBased.js +57 -0
- package/dist/migrations/fileContext.js +482 -0
- package/dist/migrations/fileDiscovery.js +332 -0
- package/dist/migrations/fileSkipProbes.js +117 -0
- package/dist/migrations/fingerprint.js +46 -0
- package/dist/migrations/fkCycles.js +13 -0
- package/dist/migrations/frameworkLiveTables.js +25 -0
- package/dist/migrations/idempotentDdl.js +37 -0
- package/dist/migrations/indexPredicate.js +50 -0
- package/dist/migrations/introspect.js +801 -0
- package/dist/migrations/ledgerRows.js +4 -0
- package/dist/migrations/lock.js +91 -0
- package/dist/migrations/migrationTableExists.js +9 -0
- package/dist/migrations/mssqlColumnDependencies.js +76 -0
- package/dist/migrations/mysqlEngine.js +11 -0
- package/dist/migrations/namespaceCharset.js +51 -0
- package/dist/migrations/planner.js +785 -0
- package/dist/migrations/postgresEnumCheck.js +22 -0
- package/dist/migrations/reactiveTriggerDrift.js +58 -0
- package/dist/migrations/reactiveTriggerName.js +7 -0
- package/dist/migrations/renameMssqlCheck.js +21 -0
- package/dist/migrations/restoreSnapshots.js +206 -0
- package/dist/migrations/resumeLedger.js +86 -0
- package/dist/migrations/rollingDeploy.js +106 -0
- package/dist/migrations/schemaOwner.js +46 -0
- package/dist/migrations/schemaOwnerTable.js +4 -0
- package/dist/migrations/softDropSnapshot.js +20 -0
- package/dist/migrations/sqlLimit.js +8 -0
- package/dist/migrations/sqliteCatalogName.js +13 -0
- package/dist/migrations/sqliteConstraintIdentity.js +97 -0
- package/dist/migrations/sqliteDecimalBoot.js +22 -0
- package/dist/migrations/sqliteDecimalPublication.js +257 -0
- package/dist/migrations/sqliteDecimalReview.js +30 -0
- package/dist/migrations/sqliteDecimalReviewStore.js +188 -0
- package/dist/migrations/sqliteDecimalReviewWitness.js +38 -0
- package/dist/migrations/sqliteDecimalSource.js +69 -0
- package/dist/migrations/sqliteDecimalStage.js +135 -0
- package/dist/migrations/sqliteForeignKeys.js +38 -0
- package/dist/migrations/sqliteMigrationBatch.js +37 -0
- package/dist/migrations/sqliteRetainedSource.js +106 -0
- package/dist/migrations/sqliteRowIdentity.js +63 -0
- package/dist/migrations/sqliteSchemaEpoch.js +12 -0
- package/dist/migrations/sqliteSnapshotGuard.js +10 -0
- package/dist/migrations/sqliteTableContents.js +34 -0
- package/dist/migrations/sqliteTableCopy.js +25 -0
- package/dist/migrations/sqliteTableSchema.js +19 -0
- package/dist/migrations/sqliteWitnessProtection.js +8 -0
- package/dist/migrations/squash.js +81 -0
- package/dist/migrations/storeCharset.js +66 -0
- package/dist/migrations/transactionCause.js +10 -0
- package/dist/migrations/undeclaredCharset.js +40 -0
- package/dist/migrations/uniqueActiveLowering.js +39 -0
- package/dist/mixins.js +22 -0
- package/dist/mssqlDecimalDistinct.js +51 -0
- package/dist/mssqlJsonValueCheck.js +42 -0
- package/dist/mssqlTextStorage.js +9 -0
- package/dist/namespace.js +21 -0
- package/dist/{wire-CG2j7J3f.js → optimisticVersion.js} +2 -2
- package/dist/pendingAttribution.js +79 -0
- package/dist/pluginRef.js +17 -0
- package/dist/predicate.js +273 -0
- package/dist/predicateCoercion.js +13 -0
- package/dist/projectedColumn.js +37 -0
- package/dist/queryBuilder.js +388 -0
- package/dist/rawSql.js +8 -0
- package/dist/relations.js +69 -0
- package/dist/relationsRegistry.js +38 -0
- package/dist/replaceInProgress.js +53 -0
- package/dist/requiredColumns.js +26 -0
- package/dist/residency.js +52 -0
- package/dist/retention.js +62 -0
- package/dist/rowDecoder.js +173 -0
- package/dist/rowKey.js +8 -0
- package/dist/rowSchema.js +31 -0
- package/dist/scopeKey.js +8 -0
- package/dist/seed.js +33 -0
- package/dist/snowflake.js +26 -0
- package/dist/sql.d.ts +2792 -3773
- package/dist/sql.js +42 -6905
- package/dist/sqlCompiler.js +360 -0
- package/dist/sqlError.js +8 -0
- package/dist/sqlMutation.js +55 -0
- package/dist/sqlPoolCapacity.js +12 -0
- package/dist/sqliteDecimal.js +22 -0
- package/dist/sqliteDecimalAggregateSql.js +61 -0
- package/dist/sqliteDecimalColumnSql.js +108 -0
- package/dist/sqliteDecimalConversion.js +15 -0
- package/dist/sqliteDecimalCte.js +154 -0
- package/dist/sqliteDecimalEncodeSql.js +32 -0
- package/dist/sqliteDecimalOutputs.js +74 -0
- package/dist/sqliteDecimalPredicate.js +66 -0
- package/dist/sqliteDecimalQuery.js +183 -0
- package/dist/sqliteDecimalQueryPlan.js +37 -0
- package/dist/sqliteDecimalResultSql.js +44 -0
- package/dist/sqliteDecimalRowQuery.js +63 -0
- package/dist/sqliteDecimalSetQuery.js +50 -0
- package/dist/sqliteDecimalSource.js +63 -0
- package/dist/sqliteDecimalStorage.js +29 -0
- package/dist/sqliteDecimalSubquery.js +19 -0
- package/dist/sqliteDecimalWindowQuery.js +196 -0
- package/dist/sqliteValueCoercion.js +4 -0
- package/dist/stampId.js +21 -0
- package/dist/storeErrors.js +9 -0
- package/dist/storeRefusal.js +20 -0
- package/dist/stream.js +36 -0
- package/dist/subjectGraph.js +175 -0
- package/dist/table.js +394 -0
- package/dist/tableRegistry.js +16 -0
- package/dist/tenantSelection.js +27 -0
- package/dist/transactionOutcome.js +100 -0
- package/dist/transientContention.js +36 -0
- package/dist/typeId.js +51 -0
- package/dist/typedStore.js +16 -0
- package/dist/upsertUpdate.js +20 -0
- package/dist/vectorEmbedding.js +31 -0
- package/dist/view.js +39 -0
- package/dist/wire.js +6 -2
- package/dist/writeAttribution.js +16 -0
- package/dist/writeRecorder.js +38 -0
- package/package.json +3 -4
- package/dist/replaceInProgress-DC88Pdiy.js +0 -3735
|
@@ -0,0 +1,801 @@
|
|
|
1
|
+
import { parseSqliteDecimalStorageType as e } from "../sqliteDecimalStorage.js";
|
|
2
|
+
import { indexStorageShape as t } from "../indexStorage.js";
|
|
3
|
+
import { MIGRATION_OPS_TABLE as n } from "./resumeLedger.js";
|
|
4
|
+
import { classifyMssqlJsonCheck as r, mssqlJsonValidation as i } from "../mssqlJsonValueCheck.js";
|
|
5
|
+
import { extractIndexPredicate as a } from "./indexPredicate.js";
|
|
6
|
+
import { idStorageOfType as o } from "./columnEquivalence.js";
|
|
7
|
+
import { DEPLOY_LEDGER_TABLE as s } from "./deployLedger.js";
|
|
8
|
+
import { SCHEMA_OWNER_TABLE as c } from "./schemaOwnerTable.js";
|
|
9
|
+
import { postgresEnumCheckValues as l } from "./postgresEnumCheck.js";
|
|
10
|
+
import { sqliteCatalogKey as u, sqliteCatalogName as d } from "./sqliteCatalogName.js";
|
|
11
|
+
import { sqliteNamedUniqueConstraints as f, sqliteUniqueColumnsKey as p } from "./sqliteConstraintIdentity.js";
|
|
12
|
+
import { Effect as m } from "effect";
|
|
13
|
+
//#region src/migrations/introspect.ts
|
|
14
|
+
var h = (e) => {
|
|
15
|
+
let t = [String(e)], n = e.cause;
|
|
16
|
+
for (let e = 0; e < 6 && n != null; e++) t.push(typeof n == "object" && typeof n.message == "string" ? n.message : String(n)), n = typeof n == "object" ? n.cause : void 0;
|
|
17
|
+
return t.join(" ");
|
|
18
|
+
}, g = (e) => {
|
|
19
|
+
let t = /[`"[]?([A-Za-z_][A-Za-z0-9_]*)[`"\]]?\s*(?:in\b|=)/i.exec(e);
|
|
20
|
+
if (!t) return null;
|
|
21
|
+
let n = [...e.replace(/\\'/g, "'").matchAll(/'((?:[^']|'')*)'/g)].map((e) => e[1].replace(/''/g, "'")).filter((e) => e.length > 0);
|
|
22
|
+
return n.length === 0 ? null : {
|
|
23
|
+
column: t[1],
|
|
24
|
+
values: n
|
|
25
|
+
};
|
|
26
|
+
}, _ = (e, t) => {
|
|
27
|
+
if (t === "vector" || t === "halfvec") return "vector";
|
|
28
|
+
switch (e) {
|
|
29
|
+
case "text":
|
|
30
|
+
case "character varying":
|
|
31
|
+
case "varchar":
|
|
32
|
+
case "uuid":
|
|
33
|
+
case "character": return "text";
|
|
34
|
+
case "integer":
|
|
35
|
+
case "smallint": return "integer";
|
|
36
|
+
case "bigint": return "bigint";
|
|
37
|
+
case "double precision":
|
|
38
|
+
case "real": return "real";
|
|
39
|
+
case "numeric":
|
|
40
|
+
case "decimal": return "decimal";
|
|
41
|
+
case "boolean": return "boolean";
|
|
42
|
+
case "bytea": return "bytes";
|
|
43
|
+
case "timestamp without time zone":
|
|
44
|
+
case "timestamp with time zone":
|
|
45
|
+
case "timestamptz":
|
|
46
|
+
case "timestamp": return "timestamp";
|
|
47
|
+
case "date": return "date";
|
|
48
|
+
case "json":
|
|
49
|
+
case "jsonb": return "json";
|
|
50
|
+
case "ARRAY": return "array";
|
|
51
|
+
case "USER-DEFINED": return "text";
|
|
52
|
+
default: return "text";
|
|
53
|
+
}
|
|
54
|
+
}, v = {
|
|
55
|
+
_text: "text",
|
|
56
|
+
_varchar: "text",
|
|
57
|
+
_uuid: "text",
|
|
58
|
+
_int4: "integer",
|
|
59
|
+
_int2: "integer",
|
|
60
|
+
_int8: "bigint",
|
|
61
|
+
_float8: "real",
|
|
62
|
+
_float4: "real",
|
|
63
|
+
_bool: "boolean",
|
|
64
|
+
_bytea: "bytes",
|
|
65
|
+
_timestamptz: "timestamp",
|
|
66
|
+
_timestamp: "timestamp",
|
|
67
|
+
_date: "date",
|
|
68
|
+
_jsonb: "json",
|
|
69
|
+
_json: "json"
|
|
70
|
+
}, y = (e) => e === void 0 ? void 0 : v[e], b = (e, t) => e == null || e === "" ? void 0 : { generatedAs: {
|
|
71
|
+
expr: e,
|
|
72
|
+
stored: t
|
|
73
|
+
} }, x = (e) => {
|
|
74
|
+
switch (e.toUpperCase()) {
|
|
75
|
+
case "CASCADE": return "cascade";
|
|
76
|
+
case "RESTRICT": return "restrict";
|
|
77
|
+
case "SET NULL": return "setNull";
|
|
78
|
+
case "SET DEFAULT": return "noAction";
|
|
79
|
+
default: return "noAction";
|
|
80
|
+
}
|
|
81
|
+
}, S = (e, t) => {
|
|
82
|
+
let n = e !== void 0 && e !== "" ? Number(e) : NaN;
|
|
83
|
+
return Number.isInteger(n) && n > 0 ? n : t;
|
|
84
|
+
}, C = () => S(process.env.VOLTRO_INTROSPECT_BATCH, 20), w = 300, T = () => {
|
|
85
|
+
let e = process.env.VOLTRO_INTROSPECT_TIMEOUT_MS;
|
|
86
|
+
return e !== void 0 && e.trim() === "0" ? 0 : S(e, 3e4);
|
|
87
|
+
}, E = (e, t) => {
|
|
88
|
+
let n = Number.isFinite(t) && t >= 1 ? Math.floor(t) : 1, r = [];
|
|
89
|
+
for (let t = 0; t < e.length; t += n) r.push(e.slice(t, t + n));
|
|
90
|
+
return r;
|
|
91
|
+
}, D = (e) => {
|
|
92
|
+
let n = T(), r = m.gen(function* () {
|
|
93
|
+
n > 0 && (yield* e.unsafe(`SET LOCAL statement_timeout = ${n}`));
|
|
94
|
+
let r = (t) => e.unsafe("(" + t.map((e) => `'${e.replace(/'/g, "''")}'`).join(", ") + ")"), i = (t) => e.unsafe(String(Math.max(0, Math.trunc(t)))), a = C(), s = (e, t) => m.gen(function* () {
|
|
95
|
+
let n = [];
|
|
96
|
+
for (let i of E(e, a)) i.length !== 0 && n.push(...yield* t(r(i)));
|
|
97
|
+
return n;
|
|
98
|
+
}), c = [];
|
|
99
|
+
for (let t = 0;; t += w) {
|
|
100
|
+
let n = yield* e`
|
|
101
|
+
SELECT c.relname AS table_name,
|
|
102
|
+
COALESCE(c.reltuples::bigint, 0) AS row_count
|
|
103
|
+
FROM pg_class c
|
|
104
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
105
|
+
WHERE n.nspname = current_schema() AND c.relkind = 'r'
|
|
106
|
+
ORDER BY c.relname
|
|
107
|
+
LIMIT ${i(w)} OFFSET ${i(t)}
|
|
108
|
+
`;
|
|
109
|
+
if (c.push(...n), n.length < w) break;
|
|
110
|
+
}
|
|
111
|
+
let u = /* @__PURE__ */ new Set(), d = [];
|
|
112
|
+
for (let e of c) u.has(e.table_name) || (u.add(e.table_name), d.push(e));
|
|
113
|
+
let f = d.map((e) => e.table_name), p = yield* s(f, (t) => e`
|
|
114
|
+
SELECT table_name, column_name, data_type, udt_name, is_nullable, column_default,
|
|
115
|
+
character_maximum_length, numeric_precision, numeric_scale,
|
|
116
|
+
is_generated, generation_expression,
|
|
117
|
+
(SELECT a.atttypmod FROM pg_attribute a
|
|
118
|
+
JOIN pg_class c ON c.oid = a.attrelid
|
|
119
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
120
|
+
WHERE n.nspname = col.table_schema AND c.relname = col.table_name
|
|
121
|
+
AND a.attname = col.column_name) AS type_modifier
|
|
122
|
+
FROM information_schema.columns col
|
|
123
|
+
WHERE table_schema = current_schema() AND table_name IN ${t}
|
|
124
|
+
ORDER BY table_name, ordinal_position
|
|
125
|
+
`), h = yield* s(f, (t) => e`
|
|
126
|
+
SELECT rel.relname AS table_name, att.attname AS column_name
|
|
127
|
+
FROM pg_constraint con
|
|
128
|
+
JOIN pg_class rel ON rel.oid = con.conrelid
|
|
129
|
+
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
|
|
130
|
+
JOIN pg_attribute att ON att.attrelid = con.conrelid AND att.attnum = ANY (con.conkey)
|
|
131
|
+
WHERE con.contype = 'p' AND nsp.nspname = current_schema()
|
|
132
|
+
AND rel.relname IN ${t}
|
|
133
|
+
ORDER BY rel.relname, array_position(con.conkey, att.attnum)
|
|
134
|
+
`), g = yield* s(f, (t) => e`
|
|
135
|
+
SELECT rel.relname AS table_name, con.conname AS constraint_name,
|
|
136
|
+
att.attname AS column_name, array_position(con.conkey, att.attnum) AS position
|
|
137
|
+
FROM pg_constraint con
|
|
138
|
+
JOIN pg_class rel ON rel.oid = con.conrelid
|
|
139
|
+
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
|
|
140
|
+
JOIN pg_attribute att ON att.attrelid = rel.oid AND att.attnum = ANY (con.conkey)
|
|
141
|
+
WHERE con.contype = 'u' AND nsp.nspname = current_schema() AND rel.relname IN ${t}
|
|
142
|
+
`), v = yield* s(f, (t) => e`
|
|
143
|
+
SELECT rel.relname AS table_name, att.attname AS column_name, pg_get_constraintdef(con.oid) AS def
|
|
144
|
+
FROM pg_constraint con
|
|
145
|
+
JOIN pg_class rel ON rel.oid = con.conrelid
|
|
146
|
+
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
|
|
147
|
+
JOIN pg_attribute att ON att.attrelid = rel.oid AND att.attnum = con.conkey[1]
|
|
148
|
+
WHERE con.contype = 'c' AND nsp.nspname = current_schema() AND array_length(con.conkey, 1) = 1
|
|
149
|
+
AND rel.relname IN ${t}
|
|
150
|
+
`), S = yield* m.orElseSucceed(e`
|
|
151
|
+
SELECT t.typname, e.enumlabel
|
|
152
|
+
FROM pg_type t JOIN pg_enum e ON e.enumtypid = t.oid
|
|
153
|
+
WHERE t.typtype = 'e'
|
|
154
|
+
ORDER BY t.typname, e.enumsortorder`, () => []), T = /* @__PURE__ */ new Map();
|
|
155
|
+
for (let e of S) {
|
|
156
|
+
let t = T.get(e.typname);
|
|
157
|
+
t ? t.push(e.enumlabel) : T.set(e.typname, [e.enumlabel]);
|
|
158
|
+
}
|
|
159
|
+
let D = new Set(T.keys()), O = (yield* m.orElseSucceed(e`SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'postgis') AS present`, () => []))[0]?.present === !0 ? yield* e`
|
|
160
|
+
SELECT f_table_name AS table_name, f_geometry_column AS column_name,
|
|
161
|
+
'geometry' AS kind, type AS geom_kind, srid
|
|
162
|
+
FROM geometry_columns WHERE f_table_schema = current_schema()
|
|
163
|
+
UNION ALL
|
|
164
|
+
SELECT f_table_name AS table_name, f_geography_column AS column_name,
|
|
165
|
+
'geography' AS kind, type AS geom_kind, srid
|
|
166
|
+
FROM geography_columns WHERE f_table_schema = current_schema()` : [], k = new Map(O.map((e) => [`${e.table_name}.${e.column_name}`, {
|
|
167
|
+
kind: e.kind === "geography" ? "geography" : "geometry",
|
|
168
|
+
geomKind: e.geom_kind,
|
|
169
|
+
srid: e.srid
|
|
170
|
+
}])), A = /* @__PURE__ */ new Map();
|
|
171
|
+
for (let e of v) {
|
|
172
|
+
let t = l(e.def, e.column_name);
|
|
173
|
+
t !== null && A.set(`${e.table_name}.${e.column_name}`, t);
|
|
174
|
+
}
|
|
175
|
+
let j = yield* s(f, (t) => e`
|
|
176
|
+
SELECT
|
|
177
|
+
rel.relname AS source_table,
|
|
178
|
+
att.attname AS source_column,
|
|
179
|
+
frel.relname AS target_table,
|
|
180
|
+
fatt.attname AS target_column,
|
|
181
|
+
con.conname AS constraint_name,
|
|
182
|
+
CASE con.confdeltype
|
|
183
|
+
WHEN 'c' THEN 'CASCADE' WHEN 'r' THEN 'RESTRICT'
|
|
184
|
+
WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT'
|
|
185
|
+
ELSE 'NO ACTION' END AS delete_rule,
|
|
186
|
+
CASE con.confupdtype
|
|
187
|
+
WHEN 'c' THEN 'CASCADE' WHEN 'r' THEN 'RESTRICT'
|
|
188
|
+
WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT'
|
|
189
|
+
ELSE 'NO ACTION' END AS update_rule
|
|
190
|
+
FROM pg_constraint con
|
|
191
|
+
JOIN pg_class rel ON rel.oid = con.conrelid
|
|
192
|
+
JOIN pg_class frel ON frel.oid = con.confrelid
|
|
193
|
+
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
|
|
194
|
+
JOIN unnest(con.conkey) WITH ORDINALITY AS ck(attnum, ord) ON true
|
|
195
|
+
JOIN unnest(con.confkey) WITH ORDINALITY AS fk(attnum, ord) ON fk.ord = ck.ord
|
|
196
|
+
JOIN pg_attribute att ON att.attrelid = con.conrelid AND att.attnum = ck.attnum
|
|
197
|
+
JOIN pg_attribute fatt ON fatt.attrelid = con.confrelid AND fatt.attnum = fk.attnum
|
|
198
|
+
WHERE con.contype = 'f' AND nsp.nspname = current_schema()
|
|
199
|
+
AND rel.relname IN ${t}
|
|
200
|
+
ORDER BY rel.relname, con.conname, ck.ord
|
|
201
|
+
`), M = yield* s(f, (t) => e`
|
|
202
|
+
WITH ix AS (
|
|
203
|
+
SELECT
|
|
204
|
+
c.relname AS table_name,
|
|
205
|
+
i.relname AS index_name,
|
|
206
|
+
ix2.indisunique AS is_unique,
|
|
207
|
+
am.amname AS access_method,
|
|
208
|
+
-- An opclass is spelled BARE when it resolves unqualified from this
|
|
209
|
+
-- connection's search_path, and qualified only when it does not.
|
|
210
|
+
-- The declared side has no catalog to ask: it maps the distance
|
|
211
|
+
-- metric to a bare vector_cosine_ops, the same bare token the DDL
|
|
212
|
+
-- writer emits. So qualifying everything outside public/pg_catalog
|
|
213
|
+
-- made an extension created in the APP's own schema (DB_SCHEMA pins
|
|
214
|
+
-- the search_path, and our CREATE EXTENSION is unqualified, so it
|
|
215
|
+
-- lands there) unmatchable against the declaration: the plan emitted
|
|
216
|
+
-- drop-index + add-index, executed both, re-planned the same two,
|
|
217
|
+
-- and a plan that does not converge records no fingerprint -- so
|
|
218
|
+
-- every boot repeated it, forever.
|
|
219
|
+
CASE WHEN opn.oid = ANY (current_schemas(true)::regnamespace[]) THEN opc.opcname
|
|
220
|
+
ELSE opn.nspname || '.' || opc.opcname END AS operator_class,
|
|
221
|
+
i.reloptions AS reloptions,
|
|
222
|
+
pg_get_expr(ix2.indpred, ix2.indrelid) AS predicate,
|
|
223
|
+
ix2.indisvalid AS is_valid,
|
|
224
|
+
(0 = ANY (ix2.indkey::int[])) AS has_expression,
|
|
225
|
+
a.attname AS column_name,
|
|
226
|
+
array_position(ix2.indkey::int[], a.attnum) + 1 AS position
|
|
227
|
+
FROM pg_index ix2
|
|
228
|
+
JOIN pg_class i ON i.oid = ix2.indexrelid
|
|
229
|
+
JOIN pg_am am ON am.oid = i.relam
|
|
230
|
+
LEFT JOIN pg_opclass opc ON opc.oid = ix2.indclass[0]
|
|
231
|
+
LEFT JOIN pg_namespace opn ON opn.oid = opc.opcnamespace
|
|
232
|
+
JOIN pg_class c ON c.oid = ix2.indrelid
|
|
233
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
234
|
+
LEFT JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY (ix2.indkey)
|
|
235
|
+
LEFT JOIN pg_constraint con ON con.conindid = i.oid
|
|
236
|
+
WHERE n.nspname = current_schema()
|
|
237
|
+
AND NOT ix2.indisprimary
|
|
238
|
+
AND con.conindid IS NULL
|
|
239
|
+
AND c.relname IN ${t}
|
|
240
|
+
)
|
|
241
|
+
SELECT * FROM ix ORDER BY table_name, index_name, position
|
|
242
|
+
`), N = /* @__PURE__ */ new Map(), P = /* @__PURE__ */ new Map(), F = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Map(), L = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map();
|
|
243
|
+
for (let e of p) {
|
|
244
|
+
let t = N.get(e.table_name);
|
|
245
|
+
t || (t = [], N.set(e.table_name, t)), t.push(e);
|
|
246
|
+
}
|
|
247
|
+
for (let e of h) {
|
|
248
|
+
let t = P.get(e.table_name);
|
|
249
|
+
t || (t = /* @__PURE__ */ new Set(), P.set(e.table_name, t)), t.add(e.column_name);
|
|
250
|
+
}
|
|
251
|
+
let z = /* @__PURE__ */ new Map();
|
|
252
|
+
for (let e of g) {
|
|
253
|
+
let t = `${e.table_name}\u0000${e.constraint_name}`, n = z.get(t);
|
|
254
|
+
n || (n = {
|
|
255
|
+
table: e.table_name,
|
|
256
|
+
columns: []
|
|
257
|
+
}, z.set(t, n)), n.columns.push({
|
|
258
|
+
name: e.column_name,
|
|
259
|
+
position: e.position
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
for (let [e, t] of z) {
|
|
263
|
+
let n = [...t.columns].sort((e, t) => e.position - t.position).map((e) => e.name);
|
|
264
|
+
if (n.length === 1) {
|
|
265
|
+
let e = F.get(t.table);
|
|
266
|
+
e || (e = /* @__PURE__ */ new Set(), F.set(t.table, e)), e.add(n[0]);
|
|
267
|
+
} else {
|
|
268
|
+
let r = I.get(t.table);
|
|
269
|
+
r || (r = [], I.set(t.table, r)), r.push({
|
|
270
|
+
name: e.slice(e.indexOf("\0") + 1),
|
|
271
|
+
table: t.table,
|
|
272
|
+
columns: n,
|
|
273
|
+
unique: !0
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
for (let e of j) {
|
|
278
|
+
let t = L.get(e.source_table);
|
|
279
|
+
t || (t = [], L.set(e.source_table, t)), t.push(e);
|
|
280
|
+
}
|
|
281
|
+
for (let e of M) {
|
|
282
|
+
let t = R.get(e.table_name);
|
|
283
|
+
t || (t = /* @__PURE__ */ new Map(), R.set(e.table_name, t));
|
|
284
|
+
let n = t.get(e.index_name);
|
|
285
|
+
n || (n = [], t.set(e.index_name, n)), n.push(e);
|
|
286
|
+
}
|
|
287
|
+
let B = [];
|
|
288
|
+
for (let e of d) {
|
|
289
|
+
let n = /* @__PURE__ */ new Set(), r = (N.get(e.table_name) ?? []).filter((e) => !n.has(e.column_name) && (n.add(e.column_name), !0)), i = P.get(e.table_name) ?? /* @__PURE__ */ new Set(), a = F.get(e.table_name) ?? /* @__PURE__ */ new Set(), s = L.get(e.table_name) ?? [], c = new Map(s.map((e) => [e.source_column, e])), l = new Set(r.filter((e) => e.udt_name === "tsvector").map((e) => e.column_name)), u = r.filter((e) => !l.has(e.column_name)).map((t) => {
|
|
290
|
+
let n = i.has(t.column_name) && i.size === 1, r = c.get(t.column_name), s = t.data_type === "USER-DEFINED" && t.udt_name !== void 0 && D.has(t.udt_name), l = s ? "enum" : _(t.data_type, t.udt_name), u = !r && n && t.column_name === "id", d = r ? "reference" : u ? "id" : l, f = r ? {
|
|
291
|
+
table: r.target_table,
|
|
292
|
+
column: r.target_column,
|
|
293
|
+
onDelete: x(r.delete_rule),
|
|
294
|
+
onUpdate: x(r.update_rule),
|
|
295
|
+
constraintName: r.constraint_name
|
|
296
|
+
} : void 0, p = A.get(`${e.table_name}.${t.column_name}`);
|
|
297
|
+
return {
|
|
298
|
+
name: t.column_name,
|
|
299
|
+
type: d,
|
|
300
|
+
...s ? {
|
|
301
|
+
enumName: t.udt_name,
|
|
302
|
+
enumValues: T.get(t.udt_name) ?? []
|
|
303
|
+
} : {},
|
|
304
|
+
...d === "array" && y(t.udt_name) !== void 0 ? { arrayElement: y(t.udt_name) } : {},
|
|
305
|
+
...k.has(`${e.table_name}.${t.column_name}`) ? { spatial: k.get(`${e.table_name}.${t.column_name}`) } : {},
|
|
306
|
+
...u ? { idStorage: o(l) } : {},
|
|
307
|
+
...d === "vector" ? {
|
|
308
|
+
vectorPrecision: t.udt_name === "halfvec" ? "half" : "float32",
|
|
309
|
+
...t.type_modifier !== void 0 && t.type_modifier > 0 ? { vectorDim: t.type_modifier } : {}
|
|
310
|
+
} : {},
|
|
311
|
+
...V(t.data_type, t.character_maximum_length) === void 0 ? {} : { maxLength: V(t.data_type, t.character_maximum_length) },
|
|
312
|
+
...l === "decimal" && typeof t.numeric_precision == "number" ? {
|
|
313
|
+
precision: t.numeric_precision,
|
|
314
|
+
...typeof t.numeric_scale == "number" ? { scale: t.numeric_scale } : {}
|
|
315
|
+
} : {},
|
|
316
|
+
nullable: t.is_nullable === "YES",
|
|
317
|
+
unique: a.has(t.column_name) || n && t.column_name === "id",
|
|
318
|
+
hasDefault: t.column_default !== null,
|
|
319
|
+
...t.column_default === null ? {} : { defaultValue: t.column_default },
|
|
320
|
+
...f ? { references: f } : {},
|
|
321
|
+
...r ? { referenceStorage: ["integer", "bigint"].includes(_(t.data_type, t.udt_name)) ? "numeric" : "text" } : {},
|
|
322
|
+
...p ? { oneOf: p } : {},
|
|
323
|
+
...b(t.is_generated === "ALWAYS" ? t.generation_expression ?? "generated" : null, !0) ?? {}
|
|
324
|
+
};
|
|
325
|
+
}), d = [], f = R.get(e.table_name);
|
|
326
|
+
if (f) for (let [n, r] of f) {
|
|
327
|
+
let i = /* @__PURE__ */ new Set(), a = [...r].filter((e) => e.column_name !== null && e.position !== null).sort((e, t) => (e.position ?? 0) - (t.position ?? 0)).filter((e) => {
|
|
328
|
+
let t = e.position;
|
|
329
|
+
return !i.has(t) && (i.add(t), !0);
|
|
330
|
+
});
|
|
331
|
+
if (a.some((e) => l.has(e.column_name))) continue;
|
|
332
|
+
let o = r.some((e) => e.has_expression), s = r[0], c = new Map((s?.reloptions ?? []).map((e) => {
|
|
333
|
+
let [t, n] = e.split("=");
|
|
334
|
+
return [t, Number(n)];
|
|
335
|
+
}));
|
|
336
|
+
if (s?.access_method === "hnsw" && !s.operator_class) throw Error(`Cannot read HNSW operator class for index ${n}`);
|
|
337
|
+
d.push({
|
|
338
|
+
name: n,
|
|
339
|
+
table: e.table_name,
|
|
340
|
+
columns: a.map((e) => e.column_name),
|
|
341
|
+
unique: r[0]?.is_unique ?? !1,
|
|
342
|
+
...t(s?.access_method, s?.access_method === "hnsw" ? { hnsw: {
|
|
343
|
+
opclass: s.operator_class,
|
|
344
|
+
m: c.get("m") ?? 16,
|
|
345
|
+
efConstruction: c.get("ef_construction") ?? 64
|
|
346
|
+
} } : s?.access_method === "gin" && s.operator_class ? { gin: { opclass: s.operator_class } } : void 0),
|
|
347
|
+
...r[0]?.predicate == null ? {} : { where: r[0].predicate },
|
|
348
|
+
...r[0]?.is_valid === !1 ? { valid: !1 } : {},
|
|
349
|
+
...o ? { expression: !0 } : {}
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
for (let t of I.get(e.table_name) ?? []) d.push(t);
|
|
353
|
+
i.size > 0 && d.push({
|
|
354
|
+
name: `${e.table_name}_pkey`,
|
|
355
|
+
table: e.table_name,
|
|
356
|
+
columns: [...i],
|
|
357
|
+
unique: !0
|
|
358
|
+
});
|
|
359
|
+
let p = Number(e.row_count ?? 0);
|
|
360
|
+
B.push({
|
|
361
|
+
name: e.table_name,
|
|
362
|
+
columns: u,
|
|
363
|
+
indexes: d,
|
|
364
|
+
...p > 0 ? { rowCount: p } : {}
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return { tables: B };
|
|
368
|
+
});
|
|
369
|
+
return (n > 0 ? e.withTransaction(r) : r).pipe(m.catch((e) => {
|
|
370
|
+
let t = h(e).toLowerCase();
|
|
371
|
+
return t.includes("statement timeout") || t.includes("57014") ? m.die(/* @__PURE__ */ Error(`schema introspection exceeded VOLTRO_INTROSPECT_TIMEOUT_MS (${n}ms) — the schema is very large / FK-dense or the database is slow. Raise VOLTRO_INTROSPECT_TIMEOUT_MS, set it to 0 to disable the ceiling, or use DB_DIRECT_URL for a non-pooler connection.`)) : m.fail(e);
|
|
372
|
+
}));
|
|
373
|
+
}, O = (e, t) => {
|
|
374
|
+
switch (e.toLowerCase()) {
|
|
375
|
+
case "varchar":
|
|
376
|
+
case "char":
|
|
377
|
+
case "text":
|
|
378
|
+
case "tinytext":
|
|
379
|
+
case "mediumtext":
|
|
380
|
+
case "longtext": return "text";
|
|
381
|
+
case "enum": return "enum";
|
|
382
|
+
case "tinyint": return t.toLowerCase() === "tinyint(1)" ? "boolean" : "integer";
|
|
383
|
+
case "int":
|
|
384
|
+
case "integer":
|
|
385
|
+
case "smallint":
|
|
386
|
+
case "mediumint": return "integer";
|
|
387
|
+
case "bigint": return "bigint";
|
|
388
|
+
case "decimal":
|
|
389
|
+
case "numeric": return "decimal";
|
|
390
|
+
case "double":
|
|
391
|
+
case "float":
|
|
392
|
+
case "real": return "real";
|
|
393
|
+
case "datetime":
|
|
394
|
+
case "timestamp": return "timestamp";
|
|
395
|
+
case "date": return "date";
|
|
396
|
+
case "blob":
|
|
397
|
+
case "tinyblob":
|
|
398
|
+
case "mediumblob":
|
|
399
|
+
case "longblob":
|
|
400
|
+
case "binary":
|
|
401
|
+
case "varbinary": return "bytes";
|
|
402
|
+
case "json": return "json";
|
|
403
|
+
default: return "text";
|
|
404
|
+
}
|
|
405
|
+
}, k = (e) => e.map((e) => {
|
|
406
|
+
let t = e, n = {};
|
|
407
|
+
for (let e of Object.keys(t)) n[e.toLowerCase()] = t[e];
|
|
408
|
+
return n;
|
|
409
|
+
}), A = (e) => m.gen(function* () {
|
|
410
|
+
let t = k(yield* e`
|
|
411
|
+
SELECT table_name, COALESCE(table_rows, 0) AS table_rows
|
|
412
|
+
FROM information_schema.tables
|
|
413
|
+
WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'
|
|
414
|
+
ORDER BY table_name`), n = k(yield* e`
|
|
415
|
+
SELECT table_name, column_name, data_type, column_type, is_nullable, column_default, column_key,
|
|
416
|
+
character_maximum_length, numeric_precision, numeric_scale,
|
|
417
|
+
generation_expression, extra, character_set_name
|
|
418
|
+
FROM information_schema.columns
|
|
419
|
+
WHERE table_schema = DATABASE()
|
|
420
|
+
ORDER BY table_name, ordinal_position`), r = k(yield* e`
|
|
421
|
+
SELECT k.table_name AS source_table,
|
|
422
|
+
k.column_name AS source_column,
|
|
423
|
+
k.referenced_table_name AS target_table,
|
|
424
|
+
k.referenced_column_name AS target_column,
|
|
425
|
+
k.constraint_name AS constraint_name,
|
|
426
|
+
r.delete_rule, r.update_rule
|
|
427
|
+
FROM information_schema.key_column_usage k
|
|
428
|
+
JOIN information_schema.referential_constraints r
|
|
429
|
+
ON k.constraint_name = r.constraint_name
|
|
430
|
+
AND k.table_schema = r.constraint_schema
|
|
431
|
+
WHERE k.table_schema = DATABASE() AND k.referenced_table_name IS NOT NULL`), i = k(yield* e`
|
|
432
|
+
SELECT table_name, index_name, non_unique, column_name, seq_in_index
|
|
433
|
+
FROM information_schema.statistics
|
|
434
|
+
WHERE table_schema = DATABASE() AND index_name <> 'PRIMARY' AND index_type <> 'FULLTEXT'
|
|
435
|
+
ORDER BY table_name, index_name, seq_in_index`), a = e`
|
|
436
|
+
SELECT cc.table_name AS table_name, cc.check_clause AS check_clause
|
|
437
|
+
FROM information_schema.check_constraints cc
|
|
438
|
+
WHERE cc.constraint_schema = DATABASE()`.unprepared, s = e`
|
|
439
|
+
SELECT tc.table_name AS table_name, cc.check_clause AS check_clause
|
|
440
|
+
FROM information_schema.check_constraints cc
|
|
441
|
+
JOIN information_schema.table_constraints tc
|
|
442
|
+
ON tc.constraint_schema = cc.constraint_schema
|
|
443
|
+
AND tc.constraint_name = cc.constraint_name
|
|
444
|
+
WHERE cc.constraint_schema = DATABASE()`.unprepared, c = k(yield* a.pipe(m.catch(() => s), m.orElseSucceed(() => []))), l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();
|
|
445
|
+
for (let e of c) {
|
|
446
|
+
let t = /json_valid\(`?([^`)]+)`?\)/i.exec(e.check_clause);
|
|
447
|
+
if (t) {
|
|
448
|
+
l.add(`${e.table_name}.${t[1]}`);
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
let n = g(e.check_clause);
|
|
452
|
+
n && u.set(`${e.table_name}.${n.column}`, n.values);
|
|
453
|
+
}
|
|
454
|
+
let d = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), p = /* @__PURE__ */ new Map();
|
|
455
|
+
for (let e of n) {
|
|
456
|
+
let t = d.get(e.table_name) ?? [];
|
|
457
|
+
t.push(e), d.set(e.table_name, t);
|
|
458
|
+
}
|
|
459
|
+
for (let e of r) {
|
|
460
|
+
let t = f.get(e.source_table) ?? [];
|
|
461
|
+
t.push(e), f.set(e.source_table, t);
|
|
462
|
+
}
|
|
463
|
+
for (let e of i) {
|
|
464
|
+
let t = p.get(e.table_name);
|
|
465
|
+
t || (t = /* @__PURE__ */ new Map(), p.set(e.table_name, t));
|
|
466
|
+
let n = t.get(e.index_name) ?? [];
|
|
467
|
+
n.push(e), t.set(e.index_name, n);
|
|
468
|
+
}
|
|
469
|
+
let h = [];
|
|
470
|
+
for (let e of t) {
|
|
471
|
+
let t = d.get(e.table_name) ?? [], n = f.get(e.table_name) ?? [], r = new Map(n.map((e) => [e.source_column, e])), i = t.filter((e) => e.column_key === "PRI").map((e) => e.column_name), a = /* @__PURE__ */ new Set(), s = p.get(e.table_name);
|
|
472
|
+
if (s) for (let e of s.values()) e.length === 1 && e[0].non_unique === 0 && a.add(e[0].column_name);
|
|
473
|
+
let c = t.map((t) => {
|
|
474
|
+
let n = i.includes(t.column_name) && i.length === 1, s = r.get(t.column_name), c = l.has(`${e.table_name}.${t.column_name}`) ? "json" : O(t.data_type, t.column_type), d = !s && n && t.column_name === "id", f = s ? "reference" : d ? "id" : c, p = s ? {
|
|
475
|
+
table: s.target_table,
|
|
476
|
+
column: s.target_column,
|
|
477
|
+
onDelete: x(s.delete_rule),
|
|
478
|
+
onUpdate: x(s.update_rule),
|
|
479
|
+
constraintName: s.constraint_name
|
|
480
|
+
} : void 0, m = a.has(t.column_name) || n && t.column_name === "id", h = t.column_default === "NULL" ? null : t.column_default, g = u.get(`${e.table_name}.${t.column_name}`), _ = t.data_type.toLowerCase() === "enum" ? [...t.column_type.matchAll(/'((?:[^']|'')*)'/g)].map((e) => e[1].replace(/''/g, "'")) : void 0;
|
|
481
|
+
return {
|
|
482
|
+
name: t.column_name,
|
|
483
|
+
type: f,
|
|
484
|
+
...d ? { idStorage: o(c) } : {},
|
|
485
|
+
...f === "enum" && _ !== void 0 ? { enumValues: _ } : {},
|
|
486
|
+
nullable: t.is_nullable === "YES",
|
|
487
|
+
...V(t.data_type, t.character_maximum_length) === void 0 ? {} : { maxLength: V(t.data_type, t.character_maximum_length) },
|
|
488
|
+
...c === "decimal" && typeof t.numeric_precision == "number" ? {
|
|
489
|
+
precision: t.numeric_precision,
|
|
490
|
+
...typeof t.numeric_scale == "number" ? { scale: t.numeric_scale } : {}
|
|
491
|
+
} : {},
|
|
492
|
+
unique: m,
|
|
493
|
+
hasDefault: h !== null,
|
|
494
|
+
...h === null ? {} : { defaultValue: h },
|
|
495
|
+
...p ? { references: p } : {},
|
|
496
|
+
...s ? { referenceStorage: ["integer", "bigint"].includes(O(t.data_type, t.column_type)) ? "numeric" : "text" } : {},
|
|
497
|
+
...g ? { oneOf: g } : {},
|
|
498
|
+
...b(t.generation_expression, /STORED/i.test(t.extra ?? "")) ?? {},
|
|
499
|
+
...t.character_set_name !== null && t.character_set_name !== void 0 && f !== "json" ? { charset: t.character_set_name } : {}
|
|
500
|
+
};
|
|
501
|
+
}), m = new Set(n.map((e) => e.source_column)), g = [];
|
|
502
|
+
if (s) for (let [t, n] of s) {
|
|
503
|
+
let r = [...n].sort((e, t) => e.seq_in_index - t.seq_in_index);
|
|
504
|
+
(r.length !== 1 || r[0].non_unique !== 0) && (r.length === 1 && r[0].non_unique !== 0 && m.has(r[0].column_name) && t !== `${e.table_name}_${r[0].column_name}_idx` || g.push({
|
|
505
|
+
name: t,
|
|
506
|
+
table: e.table_name,
|
|
507
|
+
columns: r.map((e) => e.column_name),
|
|
508
|
+
unique: r[0].non_unique === 0
|
|
509
|
+
}));
|
|
510
|
+
}
|
|
511
|
+
i.length > 0 && g.push({
|
|
512
|
+
name: `${e.table_name}_pkey`,
|
|
513
|
+
table: e.table_name,
|
|
514
|
+
columns: i,
|
|
515
|
+
unique: !0
|
|
516
|
+
});
|
|
517
|
+
let _ = Number(e.table_rows ?? 0);
|
|
518
|
+
h.push({
|
|
519
|
+
name: e.table_name,
|
|
520
|
+
columns: c,
|
|
521
|
+
indexes: g,
|
|
522
|
+
..._ > 0 ? { rowCount: _ } : {}
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
return { tables: h };
|
|
526
|
+
}), j = (t) => {
|
|
527
|
+
if (e(t)) return "decimal";
|
|
528
|
+
let n = t.toUpperCase();
|
|
529
|
+
return n.includes("INT") ? "integer" : n.includes("CHAR") || n.includes("CLOB") || n.includes("TEXT") ? "text" : n.includes("REAL") || n.includes("FLOA") || n.includes("DOUB") ? "real" : n.includes("BLOB") ? "bytes" : /^(NUMERIC|DECIMAL)\b/.test(n.trim()) ? "decimal" : "text";
|
|
530
|
+
}, M = (e) => e === 1 || e === !0, N = [
|
|
531
|
+
"content",
|
|
532
|
+
"data",
|
|
533
|
+
"idx",
|
|
534
|
+
"config",
|
|
535
|
+
"docsize",
|
|
536
|
+
"segments",
|
|
537
|
+
"segdir",
|
|
538
|
+
"stat"
|
|
539
|
+
], P = (t) => m.gen(function* () {
|
|
540
|
+
let n = yield* t`
|
|
541
|
+
SELECT name, sql FROM sqlite_master
|
|
542
|
+
WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
|
|
543
|
+
ORDER BY name`, r = new Map(n.map((e) => [u(e.name), d("table", e.name, e.sql)])), i = yield* t`
|
|
544
|
+
SELECT name, sql FROM sqlite_master WHERE type = 'index'`, s = new Map(i.map((e) => [e.name, e.sql])), c = (e) => `'${e.replace(/'/g, "''")}'`, l = [], m = n.filter((e) => /^\s*CREATE\s+VIRTUAL\s+TABLE\b/i.test(e.sql ?? "")).map((e) => e.name), h = new Set(m);
|
|
545
|
+
for (let e of m) for (let t of N) h.add(`${e}_${t}`);
|
|
546
|
+
let g = (e) => h.has(e);
|
|
547
|
+
for (let { name: i, sql: m } of n.filter((e) => !g(e.name))) {
|
|
548
|
+
let n = r.get(u(i)) ?? i, h = /* @__PURE__ */ new Map();
|
|
549
|
+
for (let e of (m ?? "").matchAll(/CHECK\s*\(\s*"([^"]+)"\s+IN\s*\(([^)]*)\)/gi)) {
|
|
550
|
+
let t = [...e[2].matchAll(/'((?:[^']|'')*)'/g)].map((e) => e[1].replace(/''/g, "'"));
|
|
551
|
+
t.length > 0 && h.set(e[1], t);
|
|
552
|
+
}
|
|
553
|
+
let g = yield* t.unsafe(`PRAGMA table_xinfo(${c(n)})`), _ = yield* t.unsafe(`PRAGMA foreign_key_list(${c(n)})`), v = yield* t.unsafe(`PRAGMA index_list(${c(n)})`), y = new Map(_.map((e) => [e.from, e])), S = g.filter((e) => e.pk > 0).sort((e, t) => e.pk - t.pk).map((e) => e.name), C = new Map(g.map((e) => [e.name.toLowerCase(), e.name])), w = /* @__PURE__ */ new Map(), T = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Set();
|
|
554
|
+
for (let e of v) {
|
|
555
|
+
let n = (yield* t.unsafe(`PRAGMA index_info(${c(e.name)})`)).map((e) => e.name).filter((e) => e !== null).map((e) => C.get(e.toLowerCase()) ?? e);
|
|
556
|
+
if (w.set(e.name, n), e.partial !== void 0 && M(e.partial)) {
|
|
557
|
+
let t = a(s.get(e.name) ?? "");
|
|
558
|
+
t !== void 0 && T.set(e.name, t);
|
|
559
|
+
}
|
|
560
|
+
!T.has(e.name) && M(e.unique) && n.length === 1 && E.add(n[0]);
|
|
561
|
+
}
|
|
562
|
+
let D = g.map((t) => {
|
|
563
|
+
let n = S.length === 1 && S[0] === t.name, i = y.get(t.name), a = j(t.type), s = e(t.type), c = !i && n && t.name === "id", l = i ? "reference" : c ? "id" : a, d = i ? {
|
|
564
|
+
table: r.get(u(i.table)) ?? i.table,
|
|
565
|
+
column: i.to,
|
|
566
|
+
onDelete: x(i.on_delete),
|
|
567
|
+
onUpdate: x(i.on_update)
|
|
568
|
+
} : void 0, f = h.get(t.name);
|
|
569
|
+
return {
|
|
570
|
+
name: t.name,
|
|
571
|
+
type: l,
|
|
572
|
+
...s ? {
|
|
573
|
+
...s,
|
|
574
|
+
sqliteDecimalEncoding: "sortable-v1"
|
|
575
|
+
} : {},
|
|
576
|
+
...c ? { idStorage: o(a) } : {},
|
|
577
|
+
nullable: t.notnull === 0 && !(n && t.type.trim().toUpperCase() === "INTEGER" && !v.some((e) => e.origin === "pk")),
|
|
578
|
+
unique: E.has(t.name) || n && t.name === "id",
|
|
579
|
+
hasDefault: t.dflt_value !== null,
|
|
580
|
+
...t.dflt_value === null ? {} : { defaultValue: t.dflt_value },
|
|
581
|
+
...d ? { references: d } : {},
|
|
582
|
+
...i ? { referenceStorage: ["integer", "bigint"].includes(j(t.type)) ? "numeric" : "text" } : {},
|
|
583
|
+
...f ? { oneOf: f } : {},
|
|
584
|
+
...b(t.hidden === 2 || t.hidden === 3 ? "generated" : null, t.hidden === 3) ?? {}
|
|
585
|
+
};
|
|
586
|
+
}), O = new Set(_.map((e) => e.from)), k, A = [];
|
|
587
|
+
for (let e of v) {
|
|
588
|
+
if (e.origin === "pk") continue;
|
|
589
|
+
let t = w.get(e.name) ?? [], r = T.get(e.name);
|
|
590
|
+
if (r === void 0 && t.length === 1 && M(e.unique) || r === void 0 && t.length === 1 && !M(e.unique) && O.has(t[0]) && e.name.toLowerCase() !== `${n}_${t[0]}_idx`.toLowerCase()) continue;
|
|
591
|
+
let i = d("index", e.name, s.get(e.name) ?? null), a = e.origin === "u" && r === void 0 && M(e.unique) ? (k ??= f(m ?? "")).get(p(t)) ?? i : i;
|
|
592
|
+
A.push({
|
|
593
|
+
name: a,
|
|
594
|
+
table: n,
|
|
595
|
+
columns: t,
|
|
596
|
+
unique: M(e.unique),
|
|
597
|
+
...r === void 0 ? {} : { where: r }
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
S.length > 0 && A.push({
|
|
601
|
+
name: `${n}_pkey`,
|
|
602
|
+
table: n,
|
|
603
|
+
columns: S,
|
|
604
|
+
unique: !0
|
|
605
|
+
}), l.push({
|
|
606
|
+
name: n,
|
|
607
|
+
columns: D,
|
|
608
|
+
indexes: A
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
return { tables: l };
|
|
612
|
+
}), F = (e) => {
|
|
613
|
+
switch (e.toLowerCase()) {
|
|
614
|
+
case "int":
|
|
615
|
+
case "smallint":
|
|
616
|
+
case "tinyint": return "integer";
|
|
617
|
+
case "bigint": return "bigint";
|
|
618
|
+
case "decimal":
|
|
619
|
+
case "numeric":
|
|
620
|
+
case "money": return "decimal";
|
|
621
|
+
case "float":
|
|
622
|
+
case "real": return "real";
|
|
623
|
+
case "bit": return "boolean";
|
|
624
|
+
case "datetime2":
|
|
625
|
+
case "datetime":
|
|
626
|
+
case "smalldatetime":
|
|
627
|
+
case "datetimeoffset": return "timestamp";
|
|
628
|
+
case "date": return "date";
|
|
629
|
+
case "varbinary":
|
|
630
|
+
case "binary":
|
|
631
|
+
case "image": return "bytes";
|
|
632
|
+
default: return "text";
|
|
633
|
+
}
|
|
634
|
+
}, I = (e) => e === !0 || e === 1, L = (e) => m.gen(function* () {
|
|
635
|
+
let t = yield* e`
|
|
636
|
+
SELECT TABLE_NAME AS table_name FROM INFORMATION_SCHEMA.TABLES
|
|
637
|
+
WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME`, n = yield* e`
|
|
638
|
+
SELECT TABLE_NAME AS table_name, COLUMN_NAME AS column_name, DATA_TYPE AS data_type,
|
|
639
|
+
IS_NULLABLE AS is_nullable, COLUMN_DEFAULT AS column_default,
|
|
640
|
+
CHARACTER_MAXIMUM_LENGTH AS character_maximum_length,
|
|
641
|
+
NUMERIC_PRECISION AS numeric_precision, NUMERIC_SCALE AS numeric_scale
|
|
642
|
+
FROM INFORMATION_SCHEMA.COLUMNS ORDER BY TABLE_NAME, ORDINAL_POSITION`, a = yield* m.orElseSucceed(e`
|
|
643
|
+
SELECT t.name AS table_name, c.name AS column_name, cc.definition AS definition,
|
|
644
|
+
cc.is_persisted AS is_persisted
|
|
645
|
+
FROM sys.computed_columns cc
|
|
646
|
+
JOIN sys.columns c ON c.object_id = cc.object_id AND c.column_id = cc.column_id
|
|
647
|
+
JOIN sys.tables t ON t.object_id = cc.object_id`, () => []), s = new Map(a.map((e) => [`${e.table_name}.${e.column_name}`, e])), c = yield* e`
|
|
648
|
+
SELECT st.name AS source_table, sc.name AS source_column,
|
|
649
|
+
tt.name AS target_table, tc.name AS target_column,
|
|
650
|
+
fk.name AS constraint_name,
|
|
651
|
+
fk.delete_referential_action_desc AS delete_rule,
|
|
652
|
+
fk.update_referential_action_desc AS update_rule
|
|
653
|
+
FROM sys.foreign_keys fk
|
|
654
|
+
JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
|
|
655
|
+
JOIN sys.tables st ON st.object_id = fkc.parent_object_id
|
|
656
|
+
JOIN sys.columns sc ON sc.object_id = fkc.parent_object_id AND sc.column_id = fkc.parent_column_id
|
|
657
|
+
JOIN sys.tables tt ON tt.object_id = fkc.referenced_object_id
|
|
658
|
+
JOIN sys.columns tc ON tc.object_id = fkc.referenced_object_id AND tc.column_id = fkc.referenced_column_id`, l = yield* e`
|
|
659
|
+
SELECT t.name AS table_name, i.name AS index_name, i.is_unique AS is_unique,
|
|
660
|
+
i.filter_definition AS predicate,
|
|
661
|
+
i.is_primary_key AS is_primary, c.name AS column_name, ic.key_ordinal AS key_ordinal
|
|
662
|
+
FROM sys.indexes i
|
|
663
|
+
JOIN sys.tables t ON t.object_id = i.object_id
|
|
664
|
+
JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
665
|
+
JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
|
|
666
|
+
WHERE i.type > 0 AND ic.is_included_column = 0
|
|
667
|
+
ORDER BY t.name, i.name, ic.key_ordinal`, u = yield* e`
|
|
668
|
+
SELECT t.name AS table_name, c.name AS column_name, cc.definition AS def,
|
|
669
|
+
cc.name AS constraint_name, cc.is_disabled, cc.is_not_trusted
|
|
670
|
+
FROM sys.check_constraints cc
|
|
671
|
+
JOIN sys.tables t ON t.object_id = cc.parent_object_id
|
|
672
|
+
LEFT JOIN sys.columns c ON c.object_id = cc.parent_object_id AND c.column_id = cc.parent_column_id`, d = /* @__PURE__ */ new Map();
|
|
673
|
+
for (let e of u) {
|
|
674
|
+
let t = g(e.def);
|
|
675
|
+
t?.column === e.column_name && d.set(`${e.table_name}.${e.column_name}`, t.values);
|
|
676
|
+
}
|
|
677
|
+
let f = /* @__PURE__ */ new Map();
|
|
678
|
+
for (let e of n) {
|
|
679
|
+
let t = f.get(e.table_name) ?? [];
|
|
680
|
+
t.push(e), f.set(e.table_name, t);
|
|
681
|
+
}
|
|
682
|
+
let p = /* @__PURE__ */ new Map();
|
|
683
|
+
for (let e of c) {
|
|
684
|
+
let t = p.get(e.source_table) ?? [];
|
|
685
|
+
t.push(e), p.set(e.source_table, t);
|
|
686
|
+
}
|
|
687
|
+
let h = /* @__PURE__ */ new Map();
|
|
688
|
+
for (let e of l) {
|
|
689
|
+
let t = h.get(e.table_name);
|
|
690
|
+
t || (t = /* @__PURE__ */ new Map(), h.set(e.table_name, t));
|
|
691
|
+
let n = t.get(e.index_name) ?? [];
|
|
692
|
+
n.push(e), t.set(e.index_name, n);
|
|
693
|
+
}
|
|
694
|
+
let _ = [];
|
|
695
|
+
for (let { table_name: e } of t) {
|
|
696
|
+
let t = f.get(e) ?? [], n = p.get(e) ?? [], a = new Map(n.map((e) => [e.source_column, e])), c = new Set(n.map((e) => e.source_column)), l = h.get(e), m = [], g = /* @__PURE__ */ new Set();
|
|
697
|
+
if (l) for (let [, e] of l) {
|
|
698
|
+
let t = [...e].sort((e, t) => e.key_ordinal - t.key_ordinal);
|
|
699
|
+
if (I(t[0].is_primary)) for (let e of t) m.push(e.column_name);
|
|
700
|
+
else t[0].predicate == null && I(t[0].is_unique) && t.length === 1 && g.add(t[0].column_name);
|
|
701
|
+
}
|
|
702
|
+
let v = t.map((t) => {
|
|
703
|
+
let n = m.length === 1 && m[0] === t.column_name, c = a.get(t.column_name), l = F(t.data_type), f = !c && n && t.column_name === "id", p = c ? "reference" : f ? "id" : l, h = c ? {
|
|
704
|
+
table: c.target_table,
|
|
705
|
+
column: c.target_column,
|
|
706
|
+
onDelete: R(c.delete_rule),
|
|
707
|
+
onUpdate: R(c.update_rule),
|
|
708
|
+
constraintName: c.constraint_name
|
|
709
|
+
} : void 0, _ = t.column_default === null ? null : z(t.column_default), v = d.get(`${e}.${t.column_name}`), y = u.flatMap((n) => {
|
|
710
|
+
if (n.table_name !== e || n.column_name !== null && n.column_name !== t.column_name) return [];
|
|
711
|
+
let i = r(t.column_name, n.def);
|
|
712
|
+
return i ? [{
|
|
713
|
+
name: n.constraint_name,
|
|
714
|
+
validation: i,
|
|
715
|
+
enabled: !I(n.is_disabled),
|
|
716
|
+
trusted: !I(n.is_not_trusted)
|
|
717
|
+
}] : [];
|
|
718
|
+
}).sort((e, t) => e.name.localeCompare(t.name)), x = i(y);
|
|
719
|
+
return {
|
|
720
|
+
name: t.column_name,
|
|
721
|
+
type: p,
|
|
722
|
+
...f ? { idStorage: o(l) } : {},
|
|
723
|
+
nullable: t.is_nullable === "YES",
|
|
724
|
+
...V(t.data_type, t.character_maximum_length) === void 0 ? {} : { maxLength: V(t.data_type, t.character_maximum_length) },
|
|
725
|
+
...l === "decimal" && typeof t.numeric_precision == "number" ? {
|
|
726
|
+
precision: t.numeric_precision,
|
|
727
|
+
...typeof t.numeric_scale == "number" ? { scale: t.numeric_scale } : {}
|
|
728
|
+
} : {},
|
|
729
|
+
unique: g.has(t.column_name) || n && t.column_name === "id",
|
|
730
|
+
hasDefault: _ !== null,
|
|
731
|
+
..._ === null ? {} : { defaultValue: _ },
|
|
732
|
+
...h ? { references: h } : {},
|
|
733
|
+
...c ? { referenceStorage: ["integer", "bigint"].includes(F(t.data_type)) ? "numeric" : "text" } : {},
|
|
734
|
+
...v ? { oneOf: v } : {},
|
|
735
|
+
...y.length > 0 ? { jsonChecks: y } : {},
|
|
736
|
+
...x ? { jsonValidation: x } : {},
|
|
737
|
+
...b(s.get(`${e}.${t.column_name}`)?.definition ?? null, I(s.get(`${e}.${t.column_name}`)?.is_persisted ?? !1)) ?? {}
|
|
738
|
+
};
|
|
739
|
+
}), y = [];
|
|
740
|
+
if (l) for (let [t, n] of l) {
|
|
741
|
+
let r = [...n].sort((e, t) => e.key_ordinal - t.key_ordinal);
|
|
742
|
+
if (I(r[0].is_primary)) continue;
|
|
743
|
+
let i = r[0].predicate ?? void 0;
|
|
744
|
+
i === void 0 && r.length === 1 && I(r[0].is_unique) || (i !== void 0 || r.length !== 1 || I(r[0].is_unique) || !c.has(r[0].column_name) || t === `${e}_${r[0].column_name}_idx`) && y.push({
|
|
745
|
+
name: t,
|
|
746
|
+
table: e,
|
|
747
|
+
columns: r.map((e) => e.column_name),
|
|
748
|
+
unique: I(r[0].is_unique),
|
|
749
|
+
...i === void 0 ? {} : { where: i }
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
m.length > 0 && y.push({
|
|
753
|
+
name: `${e}_pkey`,
|
|
754
|
+
table: e,
|
|
755
|
+
columns: m,
|
|
756
|
+
unique: !0
|
|
757
|
+
}), _.push({
|
|
758
|
+
name: e,
|
|
759
|
+
columns: v,
|
|
760
|
+
indexes: y
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
return { tables: _ };
|
|
764
|
+
}), R = (e) => {
|
|
765
|
+
switch (e.toUpperCase().replace(/_/g, " ")) {
|
|
766
|
+
case "CASCADE": return "cascade";
|
|
767
|
+
case "SET NULL": return "setNull";
|
|
768
|
+
case "SET DEFAULT": return "noAction";
|
|
769
|
+
default: return "noAction";
|
|
770
|
+
}
|
|
771
|
+
}, z = (e) => {
|
|
772
|
+
let t = e.trim();
|
|
773
|
+
for (; t.startsWith("(") && t.endsWith(")");) t = t.slice(1, -1).trim();
|
|
774
|
+
return t.startsWith("N'") && t.endsWith("'") ? t = t.slice(2, -1) : t.startsWith("'") && t.endsWith("'") && (t = t.slice(1, -1)), t;
|
|
775
|
+
}, B = /* @__PURE__ */ new Set([
|
|
776
|
+
"character varying",
|
|
777
|
+
"varchar",
|
|
778
|
+
"nvarchar",
|
|
779
|
+
"char",
|
|
780
|
+
"character",
|
|
781
|
+
"nchar"
|
|
782
|
+
]), V = (e, t) => {
|
|
783
|
+
if (!B.has(e.toLowerCase())) return;
|
|
784
|
+
let n = Number(t);
|
|
785
|
+
if (!(!Number.isFinite(n) || n <= 0)) return n;
|
|
786
|
+
}, H = /* @__PURE__ */ new Set([
|
|
787
|
+
n,
|
|
788
|
+
s,
|
|
789
|
+
c,
|
|
790
|
+
"_voltro_plugin_migrations"
|
|
791
|
+
]), U = (e) => e.onDialectOrElse({
|
|
792
|
+
mysql: () => A(e),
|
|
793
|
+
mssql: () => L(e),
|
|
794
|
+
sqlite: () => P(e),
|
|
795
|
+
orElse: () => D(e)
|
|
796
|
+
}).pipe(m.map((e) => ({
|
|
797
|
+
...e,
|
|
798
|
+
tables: e.tables.filter((e) => !H.has(e.name))
|
|
799
|
+
})));
|
|
800
|
+
//#endregion
|
|
801
|
+
export { E as chunkTables, U as introspectSchema, _ as mapPgType, g as parseEnumCheck };
|