@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,360 @@
1
+ import { columnComparisonOperators as e, isColumnReference as t } from "./columnReference.js";
2
+ import { authoredError as n } from "./dbCause.js";
3
+ import { getTable as r } from "./tableRegistry.js";
4
+ import { orderClausesOf as i } from "./queryBuilder.js";
5
+ import { prepareProjectedColumn as a } from "./projectedColumn.js";
6
+ import { hasEncodedSqliteDecimalSource as o } from "./sqliteDecimalQueryPlan.js";
7
+ import { coerceValueForSqlite as s } from "./sqliteValueCoercion.js";
8
+ import { jsonPathSql as c } from "./jsonPath.js";
9
+ import { qualifyTable as l } from "./namespace.js";
10
+ import { coercePredicateValue as u } from "./predicateCoercion.js";
11
+ import { mssqlDecimalDistinct as d } from "./mssqlDecimalDistinct.js";
12
+ import { compileSqliteDecimalSourcePredicate as f } from "./sqliteDecimalSource.js";
13
+ import { compileSqliteDecimalQuery as p } from "./sqliteDecimalQuery.js";
14
+ //#region src/sqlCompiler.ts
15
+ var m = (e) => e.replace(/[A-Z]/g, (e) => e.toLowerCase()), h = (e, t) => {
16
+ let { strings: n, values: r } = e, i = t.unsafe(n[0] ?? "");
17
+ for (let e = 0; e < r.length; e++) i = t`${i}${r[e]}${t.unsafe(n[e + 1] ?? "")}`;
18
+ return t`${i}`;
19
+ }, g = (e) => e.replace(/[\\%_]/g, (e) => `\\${e}`), _ = (e, t) => t.onDialectOrElse({
20
+ mssql: () => g(e).replace(/\[/g, "\\["),
21
+ orElse: () => g(e)
22
+ }), v = (i, a, o = null, l, d = /* @__PURE__ */ new Set()) => {
23
+ if ("not" in i) return a`NOT (${v(i.not, a, o, l, d)})`;
24
+ if ("and" in i) return i.and.length === 0 ? a`TRUE` : a.and(i.and.map((e) => v(e, a, o, l, d)));
25
+ if ("or" in i) return i.or.length === 0 ? a`FALSE` : a.or(i.or.map((e) => v(e, a, o, l, d)));
26
+ if (i.op === "subquery-in" || i.op === "subquery-not-in") {
27
+ let e = i, t = F(e.subquery, a, o, void 0, d);
28
+ return e.op === "subquery-in" ? a`${a(e.column)} IN (${t})` : a`${a(e.column)} NOT IN (${t})`;
29
+ }
30
+ if (i.op === "exists" || i.op === "not-exists") {
31
+ let e = i, t = F(e.subquery, a, o, void 0, d);
32
+ return e.op === "exists" ? a`EXISTS (${t})` : a`NOT EXISTS (${t})`;
33
+ }
34
+ let f = i;
35
+ if (t(f.value)) {
36
+ if (!e.some((e) => e === f.op) || f.path !== void 0) throw n("Column references require a scalar comparison without a JSON path");
37
+ let t = a(f.value.column), r = a(f.column);
38
+ switch (f.op) {
39
+ case "eq": return a`${r} = ${t}`;
40
+ case "neq": return a`${r} <> ${t}`;
41
+ case "gt": return a`${r} > ${t}`;
42
+ case "gte": return a`${r} >= ${t}`;
43
+ case "lt": return a`${r} < ${t}`;
44
+ case "lte": return a`${r} <= ${t}`;
45
+ }
46
+ }
47
+ let p = a(f.column), m = f.path, h = m !== void 0 && m.length > 0, g = () => a.onDialectOrElse({
48
+ mysql: () => a.unsafe(c(f.column, m, "mysql")),
49
+ mssql: () => a.unsafe(c(f.column, m, "mssql")),
50
+ sqlite: () => a.unsafe(c(f.column, m, "sqlite")),
51
+ orElse: () => a.unsafe(c(f.column, m, "postgres"))
52
+ }), y = () => a.onDialectOrElse({
53
+ mysql: () => a.unsafe(c(f.column, m, "mysql", { numeric: !0 })),
54
+ mssql: () => a.unsafe(c(f.column, m, "mssql", { numeric: !0 })),
55
+ sqlite: () => a.unsafe(c(f.column, m, "sqlite", { numeric: !0 })),
56
+ orElse: () => a.unsafe(c(f.column, m, "postgres", { numeric: !0 }))
57
+ }), b = h ? g() : p, x = h ? y() : p, S = (e) => h && e != null ? String(e) : e, C = (e) => h ? Number(e) : e, w = h || l === void 0 ? void 0 : r(l)?.fields?.[f.column]?.type, T = (e) => {
58
+ let t = u(w, e);
59
+ return t instanceof Date ? a.onDialectOrElse({
60
+ sqlite: () => s(t),
61
+ orElse: () => t
62
+ }) : t;
63
+ };
64
+ switch (f.op) {
65
+ case "eq": return f.value === null ? a`${b} IS NULL` : a`${b} = ${S(T(f.value))}`;
66
+ case "neq": return f.value === null ? a`${b} IS NOT NULL` : a`${b} <> ${S(T(f.value))}`;
67
+ case "gt": return a`${x} > ${C(T(f.value))}`;
68
+ case "gte": return a`${x} >= ${C(T(f.value))}`;
69
+ case "lt": return a`${x} < ${C(T(f.value))}`;
70
+ case "lte": return a`${x} <= ${C(T(f.value))}`;
71
+ case "in": {
72
+ let e = f.value ?? [];
73
+ return e.length === 0 ? a`FALSE` : a`${b} IN ${a.in(h ? e.map((e) => S(e)) : e.map(T))}`;
74
+ }
75
+ case "notIn": {
76
+ let e = f.value ?? [];
77
+ return e.length === 0 ? a`TRUE` : a`${b} NOT IN ${a.in(h ? e.map((e) => S(e)) : e.map(T))}`;
78
+ }
79
+ case "contains": {
80
+ let e = `%${_(typeof f.value == "string" ? f.value : String(f.value ?? ""), a)}%`;
81
+ return a.onDialectOrElse({
82
+ mysql: () => a`LOWER(${b}) LIKE LOWER(${e})`,
83
+ mssql: () => a`LOWER(${b}) LIKE LOWER(${e}) ESCAPE '\\'`,
84
+ sqlite: () => a`LOWER(${b}) LIKE LOWER(${e})`,
85
+ orElse: () => a`${b} ILIKE ${e} ESCAPE '\\'`
86
+ });
87
+ }
88
+ case "startsWith": {
89
+ let e = `${_(typeof f.value == "string" ? f.value : String(f.value ?? ""), a)}%`;
90
+ return a.onDialectOrElse({
91
+ mysql: () => a`${b} LIKE ${e}`,
92
+ orElse: () => a`${b} LIKE ${e} ESCAPE '\\'`
93
+ });
94
+ }
95
+ case "arrayContains": {
96
+ let e = f.value ?? [];
97
+ return e.length === 0 ? a`TRUE` : a.onDialectOrElse({
98
+ mysql: () => a`JSON_CONTAINS(${b}, ${JSON.stringify(e)})`,
99
+ mssql: () => a`(SELECT COUNT(DISTINCT value) FROM OPENJSON(${b}) WHERE value IN ${a.in(e)}) = ${e.length}`,
100
+ sqlite: () => a`(SELECT COUNT(DISTINCT value) FROM json_each(${b}) WHERE value IN ${a.in(e)}) = ${e.length}`,
101
+ orElse: () => a`${b} @> ${e}`
102
+ });
103
+ }
104
+ case "arrayOverlaps": {
105
+ let e = f.value ?? [];
106
+ return e.length === 0 ? a`FALSE` : a.onDialectOrElse({
107
+ mysql: () => a.or(e.map((e) => a`JSON_CONTAINS(${b}, ${JSON.stringify(e)})`)),
108
+ mssql: () => a`EXISTS (SELECT 1 FROM OPENJSON(${b}) WHERE value IN ${a.in(e)})`,
109
+ sqlite: () => a`EXISTS (SELECT 1 FROM json_each(${b}) WHERE value IN ${a.in(e)})`,
110
+ orElse: () => a`${b} && ${e}`
111
+ });
112
+ }
113
+ case "arrayHas": return a.onDialectOrElse({
114
+ mysql: () => a`JSON_CONTAINS(${b}, ${JSON.stringify(f.value)})`,
115
+ mssql: () => a`${f.value} IN (SELECT value FROM OPENJSON(${b}))`,
116
+ sqlite: () => a`EXISTS (SELECT 1 FROM json_each(${b}) WHERE value = ${f.value})`,
117
+ orElse: () => a`${f.value} = ANY(${b})`
118
+ });
119
+ case "isNull": return a`${b} IS NULL`;
120
+ case "isNotNull": return a`${b} IS NOT NULL`;
121
+ case "spatial": {
122
+ let e = f.value, t = a.unsafe("::geometry"), r = e.bufferMeters === void 0 ? a`${e.geom}${t}` : a`ST_Buffer(${e.geom}::geography, ${e.bufferMeters})::geometry`;
123
+ return a.onDialectOrElse({
124
+ mysql: () => {
125
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
126
+ },
127
+ mssql: () => {
128
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
129
+ },
130
+ sqlite: () => {
131
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
132
+ },
133
+ orElse: () => e.fn === "ST_DWithin" ? a`ST_DWithin(${p}::geography, ${e.geom}::geography, ${e.distanceMeters})` : e.fn === "&&" ? a`${p}${t} && ${r}` : a`${a.unsafe(e.fn)}(${p}${t}, ${r})`
134
+ });
135
+ }
136
+ }
137
+ }, y = (e, t) => {
138
+ let n = [];
139
+ return e.partitionBy && e.partitionBy.length > 0 && n.push(t`PARTITION BY ${t.join(", ", !1)(e.partitionBy.map((e) => t`${t(e)}`))}`), e.orderBy && e.orderBy.length > 0 && n.push(t`ORDER BY ${t.join(", ", !1)(e.orderBy.map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`), n.length === 0 ? t`` : n.length === 1 ? n[0] : n.reduce((e, n, r) => r === 0 ? n : t`${e} ${n}`);
140
+ }, b = /* @__PURE__ */ new Set([
141
+ "sum",
142
+ "min",
143
+ "max",
144
+ "window-sum-over",
145
+ "window-lag",
146
+ "window-lead"
147
+ ]), x = (e, t, n = () => void 0) => t.join(", ", !1)(e.map((e) => {
148
+ let r = S(e, t);
149
+ return t`${e.column !== void 0 && b.has(e.op) && n(e.column)?.type === "decimal" ? t.onDialectOrElse({
150
+ mssql: () => t`CONVERT(varchar(80), ${r})`,
151
+ orElse: () => r
152
+ }) : r} AS ${t(e.alias)}`;
153
+ })), S = (e, t) => {
154
+ let r = e.column === void 0 ? t.unsafe("*") : t`${t(e.column)}`;
155
+ if (e.op.startsWith("window-")) {
156
+ let i = y(e.window ?? {}, t);
157
+ switch (e.op) {
158
+ case "window-row-number": return t`ROW_NUMBER() OVER (${i})`;
159
+ case "window-rank": return t`RANK() OVER (${i})`;
160
+ case "window-dense-rank": return t`DENSE_RANK() OVER (${i})`;
161
+ case "window-lag": return t`LAG(${r}, ${t.unsafe(String(e.offset ?? 1))}) OVER (${i})`;
162
+ case "window-lead": return t`LEAD(${r}, ${t.unsafe(String(e.offset ?? 1))}) OVER (${i})`;
163
+ case "window-sum-over": return t`SUM(${r}) OVER (${i})`;
164
+ case "window-avg-over": return t`AVG(${r}) OVER (${i})`;
165
+ default: throw n(`compileAggregateProjection: unknown window op '${e.op}'`);
166
+ }
167
+ }
168
+ switch (e.op) {
169
+ case "count": return t`COUNT(${r})`;
170
+ case "count-distinct": return t`COUNT(DISTINCT ${r})`;
171
+ case "sum": return t`SUM(${r})`;
172
+ case "avg": return t`AVG(${r})`;
173
+ case "min": return t`MIN(${r})`;
174
+ case "max": return t`MAX(${r})`;
175
+ case "column":
176
+ if (e.column === void 0) throw n(`compileAggregateProjection: 'column' projection requires a column name (alias '${e.alias}')`);
177
+ return t`${t(e.column)}`;
178
+ default: throw n(`compileAggregateProjection: unknown op '${e.op}'`);
179
+ }
180
+ }, C = (e) => `[${e.join(",")}]`, w = (e, t) => {
181
+ if (e.queryVector === void 0) return null;
182
+ let n = t(e.column), r = C(e.queryVector), i = e.distance === "cosine" ? "<=>" : e.distance === "l2" ? "<->" : "<#>", a = e.distance === "cosine" ? "VEC_DISTANCE_COSINE" : "VEC_DISTANCE_EUCLIDEAN";
183
+ return t.onDialectOrElse({
184
+ mysql: () => t`${t.unsafe(a)}(${n}, ${r})`,
185
+ mssql: () => t`NULL`,
186
+ sqlite: () => t`NULL`,
187
+ orElse: () => t`${n} ${t.unsafe(i)} ${r}::vector`
188
+ });
189
+ }, T = (e, t) => {
190
+ let n = t.unsafe(e.useGeography ? "::geography" : "::geometry");
191
+ return t`ST_Distance(${t(e.column)}${n}, ${e.geom}${n})`;
192
+ }, E = (e, t) => t`${t(e.column)} <-> ${e.geom}::geometry`, D = (e, t) => t`${t(`${e.indexName}_tsv`)}`, O = (e, t) => `${t}_${e.indexName}_fts`, k = (e) => e.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter((e) => e !== ""), A = (e) => {
193
+ if (e.prefix !== !0) return;
194
+ let t = k(e.query);
195
+ if (t.length !== 0) return {
196
+ pg: t.map((e) => `${e}:*`).join(" & "),
197
+ mysql: t.map((e) => `+${e}*`).join(" "),
198
+ sqlite: t.map((e) => `"${e}"*`).join(" ")
199
+ };
200
+ }, j = (e, t, n) => {
201
+ let r = n.join(", ", !1)(e.columns.map((e) => n`${n(e)}`)), i = `%${_(e.query, n)}%`, a = A(e), o = () => n.or(e.columns.map((e) => n`LOWER(${n(e)}) LIKE LOWER(${i}) ESCAPE '\\'`));
202
+ return e.fallback === "like" ? o() : n.onDialectOrElse({
203
+ mysql: () => a === void 0 ? n`MATCH(${r}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)` : n`MATCH(${r}) AGAINST(${a.mysql} IN BOOLEAN MODE)`,
204
+ sqlite: () => {
205
+ let r = n(O(e, t));
206
+ return n`${n("id")} IN (SELECT ${n("row_id")} FROM ${r} WHERE ${r} MATCH ${a?.sqlite ?? e.query})`;
207
+ },
208
+ mssql: o,
209
+ orElse: () => a === void 0 ? n`${D(e, n)} @@ plainto_tsquery(${e.config ?? "english"}, ${e.query})` : n`${D(e, n)} @@ to_tsquery(${e.config ?? "english"}, ${a.pg})`
210
+ });
211
+ }, M = (e, t, n) => {
212
+ let r = `%${_(e.query, n)}%`, i = A(e), a = () => e.columns.map((e) => n`(CASE WHEN LOWER(${n(e)}) LIKE LOWER(${r}) ESCAPE '\\' THEN 1 ELSE 0 END)`).reduce((e, t, r) => r === 0 ? t : n`${e} + ${t}`);
213
+ return e.fallback === "like" ? a() : n.onDialectOrElse({
214
+ mysql: () => i === void 0 ? n`MATCH(${n.join(", ", !1)(e.columns.map((e) => n`${n(e)}`))}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)` : n`MATCH(${n.join(", ", !1)(e.columns.map((e) => n`${n(e)}`))}) AGAINST(${i.mysql} IN BOOLEAN MODE)`,
215
+ sqlite: () => {
216
+ let r = n(O(e, t));
217
+ return n`COALESCE((SELECT -bm25(${r}) FROM ${r} WHERE ${r} MATCH ${i?.sqlite ?? e.query} AND ${r}.${n("row_id")} = ${n("id")}), 0)`;
218
+ },
219
+ mssql: a,
220
+ orElse: () => i === void 0 ? n`ts_rank(${D(e, n)}, plainto_tsquery(${e.config ?? "english"}, ${e.query}))` : n`ts_rank(${D(e, n)}, to_tsquery(${e.config ?? "english"}, ${i.pg}))`
221
+ });
222
+ }, N = (e, t, n, r, i = !1) => {
223
+ let a = (e) => t(r && !e.includes(".") ? `${r}.${e}` : e), o = () => n?.length ? t.join(", ", !1)(n.map((e) => t`${a(e)}`)) : r ? t`${t(r)}.*` : t`*`, s = i && t.onDialectOrElse({
224
+ mssql: () => !0,
225
+ orElse: () => !1
226
+ });
227
+ return !e || !Object.values(e).some((e) => e.type === "bigint" || s && e.type === "decimal") ? o() : t.onDialectOrElse({
228
+ sqlite: () => t.join(", ", !1)((n?.length ? n : Object.keys(e)).map((n) => e[n]?.type === "bigint" ? t`CAST(${a(n)} AS TEXT) AS ${t(n)}` : t`${a(n)} AS ${t(n.slice(n.lastIndexOf(".") + 1))}`)),
229
+ mssql: () => s && Object.values(e).some((e) => e.type === "decimal") ? t.join(", ", !1)((n?.length ? n : Object.keys(e)).map((n) => e[n]?.type === "decimal" ? t`CONVERT(varchar(80), ${a(n)}) AS ${t(n)}` : t`${a(n)}`)) : o(),
230
+ orElse: o
231
+ });
232
+ }, P = (e, t, n) => N(r(e)?.fields, t, n), F = (e, t, o = null, s, c = /* @__PURE__ */ new Set(), u = !1) => {
233
+ let d = a(e), f = /* @__PURE__ */ new Set([...c, ...(e.ctes ?? []).map((e) => m(e.name))]), p = (e) => f.has(m(e)) ? e : l(o, e), h = (e.ctes ?? []).map((e) => t`${t(e.name)} AS (${F(e.descriptor, t, o, e.recursive && t.onDialectOrElse({
234
+ sqlite: () => !0,
235
+ orElse: () => !1
236
+ }) ? e.name : void 0, f)})`), g = (e.ctes ?? []).some((e) => e.recursive === !0), _ = h.length > 0 ? t`WITH ${t.unsafe(g ? "RECURSIVE " : "")}${t.join(", ", !1)(h)} ` : t``;
237
+ if (e.setOp && e.setOp.queries.length >= 2) {
238
+ let r = e.setOp.kind === "union" ? "UNION" : e.setOp.kind === "union-all" ? "UNION ALL" : e.setOp.kind === "intersect" ? "INTERSECT" : "EXCEPT", a = t.onDialectOrElse({
239
+ sqlite: () => !0,
240
+ orElse: () => !1
241
+ }), c = e.setOp.queries.map((e) => {
242
+ if (!a) return t`(${F(e, t, o, void 0, f)})`;
243
+ if (s !== void 0) {
244
+ if (!(i(e).length > 0 || e.take !== void 0 || e.skip !== void 0 || e.setOp !== void 0 || (e.ctes?.length ?? 0) > 0)) return F(e, t, o, void 0, f);
245
+ let r = (e) => e.replace(/[A-Z]/g, (e) => e.toLowerCase()), a = (e) => r(e) === r(s);
246
+ if (a(e.table) || e.joins?.some((e) => a(e.table))) throw n("Recursive SQLite terms cannot use branch-local ordering, pagination or nested compounds; apply ordering and pagination to the recursive compound or its outer query");
247
+ }
248
+ return t`SELECT * FROM (${F(e, t, o, void 0, f)})`;
249
+ }).reduce((e, n, i) => i === 0 ? n : t`${e} ${t.unsafe(r)} ${n}`), l = [];
250
+ if (i(e).length > 0 && l.push(t` ORDER BY ${t.join(", ", !1)(i(e).map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`), e.take !== void 0) {
251
+ if (!Number.isInteger(e.take) || e.take < 0) throw n(`compileSelect: invalid take ${e.take}`);
252
+ l.push(t` LIMIT ${t.unsafe(String(e.take))}`);
253
+ }
254
+ if (e.skip !== void 0) {
255
+ if (a && e.take === void 0 && l.push(t` LIMIT -1`), !Number.isInteger(e.skip) || e.skip < 0) throw n(`compileSelect: invalid skip ${e.skip}`);
256
+ l.push(t` OFFSET ${t.unsafe(String(e.skip))}`);
257
+ }
258
+ return t`${_}${c}${l.reduce((e, n) => t`${e}${n}`, t``)}`;
259
+ }
260
+ let y = e.annClause === void 0 ? null : w(e.annClause, t);
261
+ e.spatialClause !== void 0 && t.onDialectOrElse({
262
+ mysql: () => {
263
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
264
+ },
265
+ mssql: () => {
266
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
267
+ },
268
+ sqlite: () => {
269
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
270
+ },
271
+ orElse: () => t``
272
+ });
273
+ let b = e.spatialClause?.projectAs === void 0 ? null : T(e.spatialClause, t), S = e.aggregations && e.aggregations.length > 0 ? x(e.aggregations, t, d) : e.joinedProjection && e.joinedProjection.length > 0 ? t.join(", ", !1)(e.joinedProjection.map((e) => {
274
+ let n = t`${t(e.source)}`, r = d(e.source);
275
+ return t`${u && r?.type === "decimal" ? t.onDialectOrElse({
276
+ mssql: () => t`CONVERT(varchar(80), ${n})`,
277
+ orElse: () => n
278
+ }) : r?.type === "bigint" ? t.onDialectOrElse({
279
+ sqlite: () => t`CAST(${n} AS TEXT)`,
280
+ orElse: () => n
281
+ }) : n} AS ${t(e.outputKey)}`;
282
+ })) : N((e.sourceTable?.tableName === e.table ? e.sourceTable : r(e.table))?.fields, t, e.projection, (e.joins?.length ?? 0) > 0 ? e.alias ?? e.table : void 0, u), C = (e.aggregations && e.aggregations.length > 0) === !0, D = y !== null && !C ? t`${S}, ${y} AS ${t("distance")}` : S, O = e.fullTextSearch, k = O?.rank !== void 0 && !C ? M(O, e.table, t) : null, A = k !== null && O?.rank !== void 0 ? t`${D}, ${k} AS ${t(O.rank.alias)}` : D, P = b !== null && !C && e.spatialClause?.projectAs !== void 0 ? t`${A}, ${b} AS ${t(e.spatialClause.projectAs)}` : A, I = e.distinctOn && e.distinctOn.length > 0 ? t.onDialectOrElse({
283
+ orElse: () => t`DISTINCT ON (${t.join(", ", !1)(e.distinctOn.map((e) => t`${t(e)}`))}) `,
284
+ mysql: () => t`DISTINCT `,
285
+ mssql: () => t`DISTINCT `,
286
+ sqlite: () => t`DISTINCT `
287
+ }) : e.distinct ? t`DISTINCT ` : t``, L = e.lock !== void 0, R = L ? t.onDialectOrElse({
288
+ mssql: () => e.lock === "share" ? t` WITH (HOLDLOCK, ROWLOCK)` : t` WITH (UPDLOCK, ROWLOCK)`,
289
+ orElse: () => t``
290
+ }) : t``, z = L ? t.onDialectOrElse({
291
+ mssql: () => t``,
292
+ sqlite: () => t``,
293
+ mysql: () => e.lock === "share" ? t` LOCK IN SHARE MODE` : t` FOR UPDATE`,
294
+ orElse: () => e.lock === "share" ? t` FOR SHARE` : t` FOR UPDATE`
295
+ }) : t``, B = e.alias === void 0 ? t`${t(p(e.table))}${R}` : t`${t(p(e.table))} AS ${t(e.alias)}${R}`, V = (e.joins ?? []).map((e) => {
296
+ let n = e.kind === "inner" ? "INNER" : "LEFT";
297
+ return t` ${t.unsafe(n)} JOIN ${t(p(e.table))} AS ${t(e.alias)} ON ${v(e.on, t, o, void 0, f)}`;
298
+ }), H = V.length > 0 ? V.reduce((e, n) => t`${e}${n}`, B) : B, U = O === void 0 ? null : j(O, e.table, t), W = [e.predicate ? v(e.predicate, t, o, e.table, f) : null, U].filter((e) => e !== null), G = W.length > 0 ? t` WHERE ${t.and(W)}` : t``, K = e.groupBy && e.groupBy.length > 0 ? t` GROUP BY ${t.join(", ", !1)(e.groupBy.map((e) => t`${t(e)}`))}` : t``, q = e.having ? t` HAVING ${v(e.having, t, o, e.table, f)}` : t``, J = e.skip !== void 0, Y = [];
299
+ y !== null && Y.push(t`${y} ASC`), e.spatialClause?.order !== void 0 && Y.push(e.spatialClause.order === "desc" ? t`${E(e.spatialClause, t)} DESC` : t`${E(e.spatialClause, t)} ASC`), k !== null && O?.rank?.order === !0 && Y.push(t`${k} DESC`);
300
+ let X = i(e), Z = X.length >= 8 && (e.joinedProjection?.length ?? 0) >= 8 ? /* @__PURE__ */ new Map() : void 0;
301
+ if (Z) for (let t of e.joinedProjection ?? []) Z.has(t.outputKey) || Z.set(t.outputKey, t.source);
302
+ for (let n of X) {
303
+ let r = (Z === void 0 ? e.joinedProjection?.find((e) => e.outputKey === n.column)?.source : Z.get(n.column)) ?? n.column, i = u && !C && d(r)?.type === "decimal" ? t.onDialectOrElse({
304
+ mssql: () => t`${t(r.includes(".") ? r : `${e.alias ?? e.table}.${r}`)}`,
305
+ orElse: () => t`${t(n.column)}`
306
+ }) : !C && d(r)?.type === "bigint" ? t.onDialectOrElse({
307
+ sqlite: () => t`${t(r.includes(".") ? r : `${e.alias ?? e.table}.${r}`)}`,
308
+ orElse: () => t`${t(n.column)}`
309
+ }) : t`${t(n.column)}`;
310
+ Y.push(n.direction === "desc" ? t`${i} DESC` : t`${i} ASC`);
311
+ }
312
+ let Q = Y.length > 0 ? t` ORDER BY ${t.join(", ", !1)(Y)}` : J ? t.onDialectOrElse({
313
+ mssql: () => t` ORDER BY (SELECT NULL)`,
314
+ orElse: () => t``
315
+ }) : t``, $ = (e) => {
316
+ if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw n(`compileSelect: expected non-negative integer take/skip, got ${e}`);
317
+ return t.unsafe(String(e));
318
+ };
319
+ return t.onDialectOrElse({
320
+ mssql: () => {
321
+ let n = e.take !== void 0 && !J ? t`TOP ${$(e.take)} ` : t``, r = J ? t` OFFSET ${$(e.skip)} ROWS FETCH NEXT ${$(e.take ?? 2 ** 53 - 1)} ROWS ONLY` : t``;
322
+ return t`${_}SELECT ${n}${I}${P} FROM ${H}${G}${K}${q}${Q}${r}`;
323
+ },
324
+ orElse: () => {
325
+ let n = e.take === void 0 ? J ? t.onDialectOrElse({
326
+ sqlite: () => t` LIMIT -1`,
327
+ mysql: () => t` LIMIT 18446744073709551615`,
328
+ orElse: () => t``
329
+ }) : t`` : t` LIMIT ${$(e.take)}`, r = J ? t` OFFSET ${$(e.skip)}` : t``;
330
+ return t`${_}SELECT ${I}${P} FROM ${H}${G}${K}${q}${Q}${n}${r}${z}`;
331
+ }
332
+ });
333
+ }, I = (e, t, n = null) => t.onDialectOrElse({
334
+ sqlite: () => !0,
335
+ orElse: () => !1
336
+ }) && o(e) ? t`${p(e, t, { materialized: !1 }, n)}` : F(t.onDialectOrElse({
337
+ mssql: () => d(e) ?? e,
338
+ orElse: () => e
339
+ }), t, n, void 0, /* @__PURE__ */ new Set(), !0), L = (e, t, n = null, r) => {
340
+ if (r !== void 0 && t.onDialectOrElse({
341
+ sqlite: () => !0,
342
+ orElse: () => !1
343
+ })) {
344
+ let i = {
345
+ table: r,
346
+ predicate: e,
347
+ order: [],
348
+ projection: void 0,
349
+ take: void 0,
350
+ skip: void 0
351
+ };
352
+ if (o(i)) return f(i, t, {
353
+ compile: (e) => I(e, t, n),
354
+ resultScale: void 0
355
+ }, e);
356
+ }
357
+ return v(e, t, n, r);
358
+ }, R = (e, t, n = null, r) => v(e, t, n, r);
359
+ //#endregion
360
+ export { L as compilePredicate, h as compileRawFragment, P as compileRowProjection, I as compileSelect, R as compileStoragePredicate, g as escapeLike };
@@ -0,0 +1,8 @@
1
+ import { SqlError as e, UnknownError as t } from "effect/sql/SqlError";
2
+ //#region src/sqlError.ts
3
+ var n = (n, r) => new e({ reason: new t({
4
+ cause: r ?? Error(n),
5
+ message: n
6
+ }) });
7
+ //#endregion
8
+ export { n as sqlError };
@@ -0,0 +1,55 @@
1
+ //#region src/sqlMutation.ts
2
+ var e = class extends Error {
3
+ code;
4
+ constructor(e) {
5
+ super("Prepared SQL mutation refused: " + e), this.code = e, this.name = "SqlMutationError";
6
+ }
7
+ }, t = /* @__PURE__ */ new WeakMap(), n = (n, r, i = []) => {
8
+ if (!n || typeof n.transactional != "function" || typeof r != "function") throw new e("invalid_unit");
9
+ let a = Object.freeze(Object.create(null)), o = /* @__PURE__ */ new Set([a]);
10
+ for (let t of i) for (let n of t.handles) {
11
+ if (o.has(n)) throw new e("invalid_unit");
12
+ o.add(n);
13
+ }
14
+ if (o.size > 64) throw new e("limit_exceeded");
15
+ return t.set(a, Object.freeze({
16
+ store: n,
17
+ accept: r,
18
+ handles: o
19
+ })), a;
20
+ }, r = (e, t) => n(e, t), i = (n, r) => {
21
+ if (!Array.isArray(r) || r.length === 0) throw new e("invalid_unit");
22
+ if (r.length > 64) throw new e("limit_exceeded");
23
+ let i = Object.getOwnPropertyDescriptors(r);
24
+ if (Reflect.ownKeys(i).length !== r.length + 1) throw new e("invalid_unit");
25
+ let a = /* @__PURE__ */ new Set(), o = [];
26
+ for (let s = 0; s < r.length; s++) {
27
+ let r = i[String(s)];
28
+ if (!r || !("value" in r) || !r.enumerable) throw new e("invalid_unit");
29
+ let c = r.value;
30
+ if (!c || typeof c != "object") throw new e("invalid_unit");
31
+ let l = t.get(c);
32
+ if (!l) throw new e("invalid_unit");
33
+ if (l.store !== n) throw new e("store_mismatch");
34
+ for (let t of l.handles) {
35
+ if (a.has(t)) throw new e("invalid_unit");
36
+ a.add(t);
37
+ }
38
+ if (a.size > 64) throw new e("limit_exceeded");
39
+ o.push(l);
40
+ }
41
+ return Object.freeze(o);
42
+ }, a = async (e, t) => {
43
+ let n = [];
44
+ for (let r of t) n.push(await r.accept(e));
45
+ return Object.freeze(n);
46
+ }, o = (t, r, o) => {
47
+ let s = i(t, r);
48
+ if (typeof o != "function") throw new e("invalid_unit");
49
+ return n(t, async (e) => o(e, await a(e, s)), s);
50
+ }, s = async (e, t) => {
51
+ let n = i(e, t);
52
+ return e.transactional(async (e) => await a(e, n));
53
+ };
54
+ //#endregion
55
+ export { e as SqlMutationError, s as executeSqlMutations, r as prepareSqlMutation, o as prepareSqlMutationGroup };
@@ -0,0 +1,12 @@
1
+ //#region src/sqlPoolCapacity.ts
2
+ var e = /* @__PURE__ */ new WeakMap(), t = (t, n) => {
3
+ n !== void 0 && Number.isInteger(n) && n > 0 && e.set(t, n);
4
+ }, n = (t) => {
5
+ let n = e.get(t);
6
+ if (n !== void 0) return n;
7
+ if (!("config" in t) || typeof t.config != "object" || t.config === null || !("maxConnections" in t.config)) return;
8
+ let r = t.config.maxConnections;
9
+ return typeof r == "number" && Number.isInteger(r) && r > 0 ? r : void 0;
10
+ };
11
+ //#endregion
12
+ export { t as registerSqlPoolCapacity, n as sqlPoolCapacity };
@@ -0,0 +1,22 @@
1
+ //#region src/sqliteDecimal.ts
2
+ var e = ({ precision: e, scale: t }) => {
3
+ if (!Number.isSafeInteger(e) || e <= 0 || !Number.isSafeInteger(t) || t < 0 || t > e) throw RangeError("Invalid fixed-point decimal precision or scale");
4
+ return 10n ** BigInt(e);
5
+ }, t = (t, n) => {
6
+ let r = e(n);
7
+ if (typeof t != "string" || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(t)) throw TypeError("Expected a fixed-point decimal string");
8
+ let [i = "", a = ""] = t.replace(/^[+-]/, "").split(".");
9
+ if (/[1-9]/.test(a.slice(n.scale))) throw RangeError("Decimal value exceeds the declared scale");
10
+ let o = BigInt((i || "0") + a.slice(0, n.scale).padEnd(n.scale, "0"));
11
+ if (o >= r) throw RangeError("Decimal value exceeds the declared precision");
12
+ return "D" + ((t.startsWith("-") ? -o : o) + r).toString().padStart(n.precision + 1, "0");
13
+ }, n = (t, n) => {
14
+ let r = e(n);
15
+ if (typeof t != "string" || t.length !== n.precision + 2 || !/^D\d+$/.test(t)) throw TypeError("Expected an encoded fixed-point decimal value");
16
+ let i = BigInt(t.slice(1)) - r;
17
+ if (i <= -r || i >= r) throw RangeError("Encoded decimal value exceeds the declared precision");
18
+ let a = (i < 0n ? -i : i).toString().padStart(n.scale + 1, "0"), o = n.scale === 0 ? a : a.slice(0, -n.scale) + "." + a.slice(-n.scale);
19
+ return (i < 0n ? "-" : "") + o;
20
+ };
21
+ //#endregion
22
+ export { n as decodeSqliteDecimal, t as encodeSqliteDecimal };
@@ -0,0 +1,61 @@
1
+ //#region src/sqliteDecimalAggregateSql.ts
2
+ var e = (e, t, n) => {
3
+ let r = n ? t : `SELECT * FROM (${t}) LIMIT -1 OFFSET 0`;
4
+ return `${e} AS${n ? " MATERIALIZED" : ""} (${r})`;
5
+ }, t = ({ sourceSql: t, precision: n, scope: r, materialized: i = !1, stages: a }) => {
6
+ if (!Number.isSafeInteger(n) || n <= 0) throw RangeError("Invalid decimal aggregate precision");
7
+ let o = 1e6, s = (9223372036854775807n / BigInt(o)).toString(), c = Math.ceil((n + 1) / 6), l = Math.ceil((n + 20) / 6) * 6, u = [];
8
+ if (a && !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(a.prefix)) throw Error("Invalid decimal stage prefix");
9
+ let d = (e) => (a?.prefix ?? "") + e, f = (e) => a?.reference?.(d(e)) ?? d(e), p = (t, n) => {
10
+ a ? a.append(d(t), n, i) : u.push(e(t, n, i));
11
+ }, m = (e) => "\"" + e.replace(/"/g, "\"\"") + "\"", h = r?.kind === "group" ? r.columns.map((e, t) => `key${t}`) : r?.kind === "window" ? ["identity", ...(r.carryColumns ?? []).map((e, t) => `carry${t}`)] : [], g = h.length === 0 ? "" : h.join(",") + ",", _ = r?.kind === "group" ? r.columns.map((e, t) => `${m(e)} AS key${t}`).join(",") : r?.kind === "window" ? [`${m(r.identity)} AS identity`, ...(r.carryColumns ?? []).map((e, t) => `${m(e)} AS carry${t}`)].join(",") : "", v = r?.kind === "group" && r.columns.length > 0 ? ` GROUP BY ${r.columns.map(m).join(",")}` : "", y = r?.kind === "window" ? [...r.partitionBy?.length ? [`PARTITION BY ${r.partitionBy.map(m).join(",")}`] : [], ...r.orderBy?.length ? [`ORDER BY ${r.orderBy.map((e) => `${m(e.column)} ${e.direction === "desc" ? "DESC" : "ASC"}`).join(",")}`] : []] : [], b = r?.kind === "window" ? ` OVER (${y.join(" ")})` : "";
12
+ p("decimal_source", t);
13
+ let x = Array.from({ length: c }, (e, t) => `d${t}`), S = x.map((e, t) => {
14
+ let r = t === c - 1, i = r ? n + 1 - t * 6 : 6;
15
+ return `COALESCE(SUM(CAST(substr(value,${r ? 2 : -(t + 1) * 6},${i}) AS INTEGER))${b},0) AS ${e}`;
16
+ }), C = `COUNT(value)${b}`, w = `CASE WHEN ${C}>${s} THEN abs(-9223372036854775808) ELSE ${C} END`;
17
+ p("decimal_digits", `SELECT ${_ ? _ + "," : ""}${w} AS n,${S.join(",")} FROM ${f("decimal_source")}${v}`), p("decimal_add0", `SELECT *,0 AS carry,'' AS result FROM ${f("decimal_digits")}`);
18
+ for (let e = 0; e < c; e++) {
19
+ let t = `(carry+d${e})`;
20
+ p(`decimal_add${e + 1}`, `SELECT ${g}n,${x.join(",")},${t}/${o} AS carry,printf('%06d',${t}%${o})||result AS result FROM ${f(`decimal_add${e}`)}`);
21
+ }
22
+ p("decimal_operands", `SELECT ${g}COALESCE(NULLIF(ltrim(CASE WHEN carry>0 THEN CAST(carry AS TEXT) ELSE '' END||result,'0'),''),'0') AS a,CASE WHEN n=0 THEN '0' ELSE CAST(n AS TEXT)||'${"0".repeat(n)}' END AS b,n FROM ${f(`decimal_add${c}`)}`);
23
+ let T = "(length(a)>length(b) OR (length(a)=length(b) AND a>=b))";
24
+ p("decimal_magnitude", `SELECT ${g}CASE WHEN ${T} THEN a ELSE b END AS hi,CASE WHEN ${T} THEN b ELSE a END AS lo,CASE WHEN ${T} THEN '' ELSE '-' END AS sign,n FROM ${f("decimal_operands")}`);
25
+ let E = "0".repeat(l);
26
+ p("decimal_padded", `SELECT ${g}substr('${E}',1,${l}-length(hi))||hi AS hi,substr('${E}',1,${l}-length(lo))||lo AS lo,sign,n FROM ${f("decimal_magnitude")}`), p("decimal_sub0", `SELECT *,0 AS borrow,'' AS result FROM ${f("decimal_padded")}`);
27
+ let D = l / 6;
28
+ for (let e = 0; e < D; e++) {
29
+ let t = l + 1 - (e + 1) * 6, n = `(CAST(substr(hi,${t},6) AS INTEGER)-CAST(substr(lo,${t},6) AS INTEGER)-borrow)`;
30
+ p(`decimal_sub${e + 1}`, `SELECT ${g}hi,lo,sign,n,CASE WHEN ${n}<0 THEN 1 ELSE 0 END AS borrow,printf('%06d',(${n}+${o})%${o})||result AS result FROM ${f(`decimal_sub${e}`)}`);
31
+ }
32
+ return `${u.length ? `WITH ${u.join(",\n")} ` : ""}SELECT ${g}CASE WHEN n=0 THEN NULL WHEN ltrim(result,'0')='' THEN '0' ELSE sign||ltrim(result,'0') END AS units,CAST(n AS TEXT) AS count FROM ${f(`decimal_sub${D}`)}`;
33
+ }, n = (n) => {
34
+ let { precision: r, inputScale: i, resultScale: a, rounding: o, scope: s, materialized: c = !1, stages: l } = n;
35
+ if (!Number.isSafeInteger(i) || i < 0 || i > r || !Number.isSafeInteger(a) || a < 0) throw RangeError("Invalid decimal average scale");
36
+ let u = t(n), d = s?.kind === "group" ? s.columns.map((e, t) => `key${t}`) : s?.kind === "window" ? ["identity", ...(s.carryColumns ?? []).map((e, t) => `carry${t}`)] : [], f = d.length === 0 ? "" : d.join(",") + ",", p = a - i, m = Math.ceil((r + 20) / 6) * 6 + Math.max(p, 0), h = m + Math.min(p, 0), g = Math.ceil(h / 6) * 6, _ = [];
37
+ if (l && !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(l.prefix)) throw Error("Invalid decimal stage prefix");
38
+ let v = (e) => (l?.prefix ?? "") + e, y = (e) => l?.reference?.(v(e)) ?? v(e), b = (t, n) => {
39
+ l ? l.append(v(t), n, c) : _.push(e(t, n, c));
40
+ };
41
+ b("decimal_avg_sum", u), b("decimal_avg_input", `SELECT ${f}count,CASE WHEN substr(units,1,1)='-' THEN '-' ELSE '' END AS sign,${`COALESCE(ltrim(units,'-'),'0')||'${"0".repeat(Math.max(p, 0))}'`} AS magnitude FROM ${y("decimal_avg_sum")}`), b("decimal_avg_div0", `SELECT ${f}count,sign,substr('${"0".repeat(m)}',1,${m}-length(magnitude))||magnitude AS digits,CASE WHEN count='0' THEN 1 ELSE CAST(count AS INTEGER) END AS denominator,0 AS remainder,'' AS result FROM ${y("decimal_avg_input")}`);
42
+ let x = 0;
43
+ for (let e = 1; e <= m; e += 5) {
44
+ let t = Math.min(5, m - e + 1), n = `(remainder*${10 ** t}+CAST(substr(digits,${e},${t}) AS INTEGER))`, r = x++;
45
+ b(`decimal_avg_div${x}`, `SELECT ${f}count,sign,digits,denominator,${n}%denominator AS remainder,result||printf('%0${t}d',${n}/denominator) AS result FROM ${y(`decimal_avg_div${r}`)}`);
46
+ }
47
+ let S = p < 0 ? `substr(result,1,${h})` : "result", C = o === "half-away" ? "1" : `CAST(substr(${S},-1,1) AS INTEGER)%2`, w;
48
+ if (p < 0) {
49
+ let e = `substr(result,${h + 1})`, t = `'5${"0".repeat(-p - 1)}'`;
50
+ w = `${e}>${t} OR (${e}=${t} AND (remainder>0 OR ${C}=1))`;
51
+ } else w = `remainder*2>denominator OR (remainder*2=denominator AND ${C}=1)`;
52
+ b("decimal_avg_round0", `SELECT ${f}count,sign,substr('${"0".repeat(g)}',1,${g}-${h})||${S} AS quotient,CASE WHEN ${w} THEN 1 ELSE 0 END AS carry,'' AS result FROM ${y(`decimal_avg_div${x}`)}`);
53
+ let T = g / 6;
54
+ for (let e = 1; e <= T; e++) {
55
+ let t = `(CAST(substr(quotient,${g + 1 - e * 6},6) AS INTEGER)+carry)`;
56
+ b(`decimal_avg_round${e}`, `SELECT ${f}count,sign,quotient,${t}/1000000 AS carry,printf('%06d',${t}%1000000)||result AS result FROM ${y(`decimal_avg_round${e - 1}`)}`);
57
+ }
58
+ return `${_.length ? `WITH ${_.join(",\n")} ` : ""}SELECT ${f}CASE WHEN count='0' THEN NULL WHEN ltrim(result,'0')='' THEN '0' ELSE sign||ltrim(result,'0') END AS units,count FROM ${y(`decimal_avg_round${T}`)}`;
59
+ };
60
+ //#endregion
61
+ export { n as compileSqliteDecimalAvg, t as compileSqliteDecimalSum };
@@ -0,0 +1,108 @@
1
+ import { encodeSqliteDecimal as e } from "./sqliteDecimal.js";
2
+ //#region src/sqliteDecimalColumnSql.ts
3
+ var t = {
4
+ eq: "=",
5
+ neq: "<>",
6
+ gt: ">",
7
+ gte: ">=",
8
+ lt: "<",
9
+ lte: "<="
10
+ }, n = (n, r, i) => {
11
+ e("0", n.shape), e("0", i.shape);
12
+ let a = t[r];
13
+ if (a === void 0) throw RangeError("Invalid decimal column comparison");
14
+ let o = Math.max(n.shape.scale, i.shape.scale), s = Math.max(n.shape.precision - n.shape.scale, i.shape.precision - i.shape.scale), c = ({ expression: e, shape: t }) => {
15
+ let n = s - (t.precision - t.scale), r = "0".repeat(o - t.scale);
16
+ return `(CASE WHEN substr((${e}), 2, 1) = '1' THEN '1${"0".repeat(n)}' ELSE '0${"9".repeat(n)}' END || substr((${e}), 3) || '${r}') COLLATE BINARY`;
17
+ };
18
+ return `(${c(n)} ${a} ${c(i)})`;
19
+ }, r = ({ expression: e, shape: t }) => {
20
+ let n = i(t, (e) => e), r = [`decimal_decode_input AS (SELECT (${e}) AS encoded LIMIT -1 OFFSET 0)`], a = "decimal_decode_input";
21
+ for (let [e, t] of n.steps) {
22
+ let n = `decimal_decode_${e}`;
23
+ r.push(`${n} AS (SELECT *,${t.join(",")} FROM ${a} LIMIT -1 OFFSET 0)`), a = n;
24
+ }
25
+ return `(WITH ${r.join(",")} SELECT ${n.value} AS value FROM ${a})`;
26
+ }, i = (t, n) => {
27
+ e("0", t);
28
+ let r = n("encoded"), i = n("payload"), a = n("negative"), o = n("trimmed"), s = n("units"), c = n("magnitude"), l = n("padded"), u = `substr(${o},1,length(${o})-1)`;
29
+ for (let e = 0; e < 10; e++) u = `replace(${u},'${e}','${String.fromCharCode(97 + e)}')`;
30
+ let d = n("alphabetic");
31
+ for (let e = 0; e < 10; e++) d = `replace(${d},'${String.fromCharCode(97 + e)}','${9 - e}')`;
32
+ let f = [
33
+ ["parts", [`substr(${r},3) AS ${i}`, `substr(${r},2,1)='0' AS ${a}`]],
34
+ ["trimmed", [`rtrim(${i},'0') AS ${o}`]],
35
+ ["alphabetic", [`${u} AS ${n("alphabetic")}`]],
36
+ ["complement", [`${d} AS ${n("complement")}`]],
37
+ ["units", [`CASE WHEN ${a} THEN ${n("complement")}||CAST(10-CAST(substr(${o},-1) AS INTEGER) AS TEXT)||substr(${i},length(${o})+1) ELSE ${i} END AS ${s}`]],
38
+ ["magnitude", [`COALESCE(NULLIF(ltrim(${s},'0'),''),'0') AS ${c}`]],
39
+ ["padded", [`substr('${"0".repeat(t.scale + 1)}'||${c},-max(length(${c}),${t.scale + 1})) AS ${l}`]]
40
+ ], p = t.scale === 0 ? c : `substr(${l},1,length(${l})-${t.scale})||'.'||substr(${l},-${t.scale})`;
41
+ return {
42
+ steps: f,
43
+ retained: [
44
+ ["payload", "negative"],
45
+ [
46
+ "payload",
47
+ "negative",
48
+ "trimmed"
49
+ ],
50
+ [
51
+ "payload",
52
+ "negative",
53
+ "trimmed",
54
+ "alphabetic"
55
+ ],
56
+ [
57
+ "payload",
58
+ "negative",
59
+ "trimmed",
60
+ "complement"
61
+ ],
62
+ [
63
+ "negative",
64
+ "trimmed",
65
+ "units"
66
+ ],
67
+ [
68
+ "negative",
69
+ "trimmed",
70
+ "magnitude"
71
+ ],
72
+ [
73
+ "negative",
74
+ "trimmed",
75
+ "magnitude",
76
+ "padded"
77
+ ]
78
+ ],
79
+ value: `CASE WHEN ${r} IS NULL THEN NULL WHEN ${`typeof(${r})<>'text' OR length(${r})<>${t.precision + 2} OR substr(${r},1,1)<>'D' OR substr(${r},2,1) NOT IN ('0','1') OR substr(${r},2) GLOB '*[^0-9]*' OR (${a} AND length(${o})=0)`} THEN abs(-9223372036854775808) ELSE (CASE WHEN ${a} THEN '-' ELSE '' END)||${p} END`
80
+ };
81
+ }, a = (e, t, n, r) => {
82
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(r.prefix)) throw Error("Invalid decimal decoder stage prefix");
83
+ if (new Set(t.map((e) => e.name)).size !== t.length || t.some((e) => !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e.name))) throw Error("Invalid decimal decoder columns");
84
+ let a = new Set(n);
85
+ if (a.size !== n.length || n.some((e) => !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)) || t.some((e) => !a.has(e.name))) throw Error("Invalid decimal decoder input columns");
86
+ let o = t.map((e, t) => {
87
+ let n = (n) => n === "encoded" ? e.name : `${r.prefix}d${t}_${n}`;
88
+ return {
89
+ column: e,
90
+ ref: n,
91
+ plan: i(e.shape, n)
92
+ };
93
+ });
94
+ for (let t = 0; t < (o[0]?.plan.steps.length ?? 0); t++) {
95
+ let i = `${r.prefix}decode_${t}`, a = o.flatMap(({ plan: e }) => e.steps[t][1]), s = o.flatMap(({ plan: e, ref: n }) => t === 0 ? [] : e.retained[t - 1].filter((n) => e.retained[t].includes(n)).map(n));
96
+ r.append(i, `SELECT ${[
97
+ ...n,
98
+ ...s,
99
+ ...a
100
+ ].join(",")} FROM ${e} LIMIT -1 OFFSET 0`), e = i;
101
+ }
102
+ return {
103
+ source: e,
104
+ values: new Map(o.map(({ column: e, plan: t }) => [e.name, t.value]))
105
+ };
106
+ };
107
+ //#endregion
108
+ export { n as compileSqliteDecimalColumnComparison, r as compileSqliteDecimalColumnValue, a as compileSqliteDecimalDecodedRows };
@@ -0,0 +1,15 @@
1
+ import { decodeSqliteDecimal as e, encodeSqliteDecimal as t } from "./sqliteDecimal.js";
2
+ //#region src/sqliteDecimalConversion.ts
3
+ var n = (n, r) => {
4
+ if (t("0", r), n.kind === "sortable-v1" && t("0", n.shape), n.value === null) return null;
5
+ if (n.kind === "sortable-v1") return t(e(n.value, n.shape), r);
6
+ if (n.kind === "numeric") {
7
+ if (!(typeof n.value == "bigint" || typeof n.value == "number" && Number.isFinite(n.value) || typeof n.value == "string" && /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(n.value))) throw TypeError("NUMERIC decimal conversion requires an observed numeric source");
8
+ if (n.resolution?.acknowledgePriorRounding !== !0) throw TypeError("NUMERIC decimal conversion requires an explicit decimal source and acknowledgement of possible prior rounding");
9
+ return t(n.resolution.decimal, r);
10
+ }
11
+ if (typeof n.value != "string") throw TypeError("Decimal text conversion requires an exact string source");
12
+ return t(n.value, r);
13
+ };
14
+ //#endregion
15
+ export { n as convertSqliteDecimalValue };