@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.
Files changed (173) hide show
  1. package/CHANGELOG.md +5987 -0
  2. package/THIRD-PARTY-NOTICES.md +5 -257
  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 +23 -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 +121 -0
  27. package/dist/frameworkTables.js +143 -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 +166 -22
  33. package/dist/index.js +82 -2183
  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 +644 -0
  43. package/dist/migration.js +18 -0
  44. package/dist/migrations/appliedAtValue.js +8 -0
  45. package/dist/migrations/applier.js +1100 -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/ddlStatements.js +9 -0
  51. package/dist/migrations/declaredSchema.js +162 -0
  52. package/dist/migrations/deployLedger.js +19 -0
  53. package/dist/migrations/fileBased.js +57 -0
  54. package/dist/migrations/fileContext.js +482 -0
  55. package/dist/migrations/fileDiscovery.js +332 -0
  56. package/dist/migrations/fileSkipProbes.js +117 -0
  57. package/dist/migrations/fingerprint.js +46 -0
  58. package/dist/migrations/fkCycles.js +13 -0
  59. package/dist/migrations/frameworkLiveTables.js +25 -0
  60. package/dist/migrations/idempotentDdl.js +37 -0
  61. package/dist/migrations/indexPredicate.js +50 -0
  62. package/dist/migrations/introspect.js +801 -0
  63. package/dist/migrations/ledgerRows.js +4 -0
  64. package/dist/migrations/lock.js +91 -0
  65. package/dist/migrations/migrationTableExists.js +9 -0
  66. package/dist/migrations/mssqlColumnDependencies.js +76 -0
  67. package/dist/migrations/mysqlEngine.js +11 -0
  68. package/dist/migrations/namespaceCharset.js +51 -0
  69. package/dist/migrations/planner.js +785 -0
  70. package/dist/migrations/postgresEnumCheck.js +22 -0
  71. package/dist/migrations/reactiveTriggerDrift.js +58 -0
  72. package/dist/migrations/reactiveTriggerName.js +7 -0
  73. package/dist/migrations/renameMssqlCheck.js +21 -0
  74. package/dist/migrations/restoreSnapshots.js +206 -0
  75. package/dist/migrations/resumeLedger.js +86 -0
  76. package/dist/migrations/rollingDeploy.js +106 -0
  77. package/dist/migrations/schemaOwner.js +46 -0
  78. package/dist/migrations/schemaOwnerTable.js +4 -0
  79. package/dist/migrations/softDropSnapshot.js +20 -0
  80. package/dist/migrations/sqlLimit.js +8 -0
  81. package/dist/migrations/sqliteCatalogName.js +13 -0
  82. package/dist/migrations/sqliteConstraintIdentity.js +97 -0
  83. package/dist/migrations/sqliteDecimalBoot.js +22 -0
  84. package/dist/migrations/sqliteDecimalPublication.js +257 -0
  85. package/dist/migrations/sqliteDecimalReview.js +30 -0
  86. package/dist/migrations/sqliteDecimalReviewStore.js +188 -0
  87. package/dist/migrations/sqliteDecimalReviewWitness.js +38 -0
  88. package/dist/migrations/sqliteDecimalSource.js +69 -0
  89. package/dist/migrations/sqliteDecimalStage.js +135 -0
  90. package/dist/migrations/sqliteForeignKeys.js +38 -0
  91. package/dist/migrations/sqliteMigrationBatch.js +37 -0
  92. package/dist/migrations/sqliteRetainedSource.js +106 -0
  93. package/dist/migrations/sqliteRowIdentity.js +63 -0
  94. package/dist/migrations/sqliteSchemaEpoch.js +12 -0
  95. package/dist/migrations/sqliteSnapshotGuard.js +10 -0
  96. package/dist/migrations/sqliteTableContents.js +34 -0
  97. package/dist/migrations/sqliteTableCopy.js +25 -0
  98. package/dist/migrations/sqliteTableSchema.js +19 -0
  99. package/dist/migrations/sqliteWitnessProtection.js +8 -0
  100. package/dist/migrations/squash.js +81 -0
  101. package/dist/migrations/storeCharset.js +66 -0
  102. package/dist/migrations/transactionCause.js +10 -0
  103. package/dist/migrations/undeclaredCharset.js +40 -0
  104. package/dist/migrations/uniqueActiveLowering.js +39 -0
  105. package/dist/mixins.js +22 -0
  106. package/dist/mssqlDecimalDistinct.js +51 -0
  107. package/dist/mssqlJsonValueCheck.js +42 -0
  108. package/dist/mssqlTextStorage.js +9 -0
  109. package/dist/namespace.js +21 -0
  110. package/dist/{wire-CG2j7J3f.js → optimisticVersion.js} +2 -2
  111. package/dist/pendingAttribution.js +79 -0
  112. package/dist/pluginRef.js +17 -0
  113. package/dist/predicate.js +273 -0
  114. package/dist/predicateCoercion.js +13 -0
  115. package/dist/projectedColumn.js +37 -0
  116. package/dist/queryBuilder.js +388 -0
  117. package/dist/rawSql.js +8 -0
  118. package/dist/relations.js +69 -0
  119. package/dist/relationsRegistry.js +38 -0
  120. package/dist/replaceInProgress.js +53 -0
  121. package/dist/requiredColumns.js +26 -0
  122. package/dist/residency.js +52 -0
  123. package/dist/retention.js +62 -0
  124. package/dist/rowDecoder.js +173 -0
  125. package/dist/rowKey.js +8 -0
  126. package/dist/rowSchema.js +31 -0
  127. package/dist/scopeKey.js +8 -0
  128. package/dist/seed.js +33 -0
  129. package/dist/snowflake.js +26 -0
  130. package/dist/sql.d.ts +2792 -3773
  131. package/dist/sql.js +42 -6905
  132. package/dist/sqlCompiler.js +360 -0
  133. package/dist/sqlError.js +8 -0
  134. package/dist/sqlMutation.js +55 -0
  135. package/dist/sqlPoolCapacity.js +12 -0
  136. package/dist/sqliteDecimal.js +22 -0
  137. package/dist/sqliteDecimalAggregateSql.js +61 -0
  138. package/dist/sqliteDecimalColumnSql.js +108 -0
  139. package/dist/sqliteDecimalConversion.js +15 -0
  140. package/dist/sqliteDecimalCte.js +154 -0
  141. package/dist/sqliteDecimalEncodeSql.js +32 -0
  142. package/dist/sqliteDecimalOutputs.js +74 -0
  143. package/dist/sqliteDecimalPredicate.js +66 -0
  144. package/dist/sqliteDecimalQuery.js +183 -0
  145. package/dist/sqliteDecimalQueryPlan.js +37 -0
  146. package/dist/sqliteDecimalResultSql.js +44 -0
  147. package/dist/sqliteDecimalRowQuery.js +63 -0
  148. package/dist/sqliteDecimalSetQuery.js +50 -0
  149. package/dist/sqliteDecimalSource.js +63 -0
  150. package/dist/sqliteDecimalStorage.js +29 -0
  151. package/dist/sqliteDecimalSubquery.js +19 -0
  152. package/dist/sqliteDecimalWindowQuery.js +196 -0
  153. package/dist/sqliteValueCoercion.js +4 -0
  154. package/dist/stampId.js +21 -0
  155. package/dist/storeErrors.js +9 -0
  156. package/dist/storeRefusal.js +20 -0
  157. package/dist/stream.js +36 -0
  158. package/dist/subjectGraph.js +175 -0
  159. package/dist/table.js +394 -0
  160. package/dist/tableRegistry.js +16 -0
  161. package/dist/tenantSelection.js +27 -0
  162. package/dist/transactionOutcome.js +100 -0
  163. package/dist/transientContention.js +36 -0
  164. package/dist/typeId.js +51 -0
  165. package/dist/typedStore.js +16 -0
  166. package/dist/upsertUpdate.js +20 -0
  167. package/dist/vectorEmbedding.js +31 -0
  168. package/dist/view.js +39 -0
  169. package/dist/wire.js +6 -2
  170. package/dist/writeAttribution.js +16 -0
  171. package/dist/writeRecorder.js +38 -0
  172. package/package.json +3 -4
  173. 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 };