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