@voltro/database 0.84.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/CHANGELOG.md +1215 -0
  2. package/THIRD-PARTY-NOTICES.md +5 -89
  3. package/dist/actorSnapshot.js +24 -0
  4. package/dist/arrayCodec.js +32 -0
  5. package/dist/branchExecute.js +92 -0
  6. package/dist/branching.js +106 -0
  7. package/dist/bulkInsertLimits.js +25 -0
  8. package/dist/cdcOffsetsTables.js +19 -0
  9. package/dist/changeEvent.js +41 -0
  10. package/dist/changeIdentity.js +65 -0
  11. package/dist/changeListenerCeiling.js +6 -0
  12. package/dist/columnReference.js +17 -0
  13. package/dist/columns.js +326 -0
  14. package/dist/committedChanges.js +12 -0
  15. package/dist/connectionIdentity.js +36 -0
  16. package/dist/coreTables.js +16 -0
  17. package/dist/coreTablesRegistry.js +10 -0
  18. package/dist/dataTransfers.js +22 -0
  19. package/dist/dbCause.js +222 -0
  20. package/dist/dbMetrics.js +65 -0
  21. package/dist/decimalComparison.js +27 -0
  22. package/dist/derivedRowId.js +5 -0
  23. package/dist/dialect.js +13 -0
  24. package/dist/enumRenames.js +14 -0
  25. package/dist/expiresMixin.js +10 -0
  26. package/dist/fieldEncryption.js +98 -0
  27. package/dist/frameworkTables.js +130 -0
  28. package/dist/ginIndex.js +10 -0
  29. package/dist/hybridSearch.js +32 -0
  30. package/dist/idGenerator.js +57 -0
  31. package/dist/identifierLimits.js +32 -0
  32. package/dist/index.d.ts +122 -64
  33. package/dist/index.js +81 -2080
  34. package/dist/indexAudit.js +61 -0
  35. package/dist/indexStorage.js +58 -0
  36. package/dist/joinCompiler.js +160 -0
  37. package/dist/jsonEagerCompiler.js +436 -0
  38. package/dist/jsonPatch.js +78 -0
  39. package/dist/jsonPatchAssignments.js +13 -0
  40. package/dist/jsonPath.js +31 -0
  41. package/dist/localFirstMixin.js +12 -0
  42. package/dist/migrate.js +624 -0
  43. package/dist/migration.js +18 -0
  44. package/dist/migrations/appliedAtValue.js +8 -0
  45. package/dist/migrations/applier.js +1085 -0
  46. package/dist/migrations/boot.js +196 -0
  47. package/dist/migrations/branchRehearsal.js +122 -0
  48. package/dist/migrations/columnEquivalence.js +85 -0
  49. package/dist/migrations/ddlError.js +63 -0
  50. package/dist/migrations/declaredSchema.js +162 -0
  51. package/dist/migrations/deployLedger.js +19 -0
  52. package/dist/migrations/fileBased.js +57 -0
  53. package/dist/migrations/fileContext.js +482 -0
  54. package/dist/migrations/fileDiscovery.js +318 -0
  55. package/dist/migrations/fileSkipProbes.js +117 -0
  56. package/dist/migrations/fingerprint.js +46 -0
  57. package/dist/migrations/fkCycles.js +13 -0
  58. package/dist/migrations/frameworkLiveTables.js +25 -0
  59. package/dist/migrations/idempotentDdl.js +37 -0
  60. package/dist/migrations/indexPredicate.js +50 -0
  61. package/dist/migrations/introspect.js +799 -0
  62. package/dist/migrations/ledgerRows.js +4 -0
  63. package/dist/migrations/lock.js +91 -0
  64. package/dist/migrations/migrationTableExists.js +9 -0
  65. package/dist/migrations/mssqlColumnDependencies.js +76 -0
  66. package/dist/migrations/mysqlEngine.js +11 -0
  67. package/dist/migrations/namespaceCharset.js +51 -0
  68. package/dist/migrations/planner.js +775 -0
  69. package/dist/migrations/postgresEnumCheck.js +19 -0
  70. package/dist/migrations/reactiveTriggerDrift.js +58 -0
  71. package/dist/migrations/reactiveTriggerName.js +7 -0
  72. package/dist/migrations/renameMssqlCheck.js +21 -0
  73. package/dist/migrations/restoreSnapshots.js +206 -0
  74. package/dist/migrations/resumeLedger.js +86 -0
  75. package/dist/migrations/rollingDeploy.js +106 -0
  76. package/dist/migrations/schemaOwner.js +46 -0
  77. package/dist/migrations/schemaOwnerTable.js +4 -0
  78. package/dist/migrations/softDropSnapshot.js +20 -0
  79. package/dist/migrations/sqlLimit.js +8 -0
  80. package/dist/migrations/sqliteConstraintIdentity.js +97 -0
  81. package/dist/migrations/sqliteDecimalBoot.js +22 -0
  82. package/dist/migrations/sqliteDecimalPublication.js +257 -0
  83. package/dist/migrations/sqliteDecimalReview.js +30 -0
  84. package/dist/migrations/sqliteDecimalReviewStore.js +188 -0
  85. package/dist/migrations/sqliteDecimalReviewWitness.js +38 -0
  86. package/dist/migrations/sqliteDecimalSource.js +69 -0
  87. package/dist/migrations/sqliteDecimalStage.js +135 -0
  88. package/dist/migrations/sqliteForeignKeys.js +38 -0
  89. package/dist/migrations/sqliteMigrationBatch.js +37 -0
  90. package/dist/migrations/sqliteRetainedSource.js +106 -0
  91. package/dist/migrations/sqliteRowIdentity.js +63 -0
  92. package/dist/migrations/sqliteSchemaEpoch.js +12 -0
  93. package/dist/migrations/sqliteSnapshotGuard.js +10 -0
  94. package/dist/migrations/sqliteTableContents.js +34 -0
  95. package/dist/migrations/sqliteTableCopy.js +25 -0
  96. package/dist/migrations/sqliteTableSchema.js +19 -0
  97. package/dist/migrations/sqliteWitnessProtection.js +8 -0
  98. package/dist/migrations/squash.js +81 -0
  99. package/dist/migrations/storeCharset.js +66 -0
  100. package/dist/migrations/transactionCause.js +10 -0
  101. package/dist/migrations/undeclaredCharset.js +40 -0
  102. package/dist/migrations/uniqueActiveLowering.js +39 -0
  103. package/dist/mixins.js +22 -0
  104. package/dist/mssqlDecimalDistinct.js +51 -0
  105. package/dist/mssqlJsonValueCheck.js +42 -0
  106. package/dist/mssqlTextStorage.js +9 -0
  107. package/dist/namespace.js +21 -0
  108. package/dist/{wire-B28cPjEp.js → optimisticVersion.js} +2 -2
  109. package/dist/pendingAttribution.js +79 -0
  110. package/dist/pluginRef.js +17 -0
  111. package/dist/predicate.js +266 -0
  112. package/dist/predicateCoercion.js +13 -0
  113. package/dist/projectedColumn.js +37 -0
  114. package/dist/queryBuilder.js +382 -0
  115. package/dist/rawSql.js +8 -0
  116. package/dist/relations.js +69 -0
  117. package/dist/relationsRegistry.js +38 -0
  118. package/dist/replaceInProgress.js +53 -0
  119. package/dist/requiredColumns.js +26 -0
  120. package/dist/residency.js +52 -0
  121. package/dist/retention.js +62 -0
  122. package/dist/rowDecoder.js +123 -0
  123. package/dist/rowKey.js +8 -0
  124. package/dist/rowSchema.js +31 -0
  125. package/dist/scopeKey.js +8 -0
  126. package/dist/seed.js +33 -0
  127. package/dist/snowflake.js +26 -0
  128. package/dist/sql.d.ts +58 -29
  129. package/dist/sql.js +41 -6661
  130. package/dist/sqlCompiler.js +343 -0
  131. package/dist/sqlError.js +8 -0
  132. package/dist/sqlPoolCapacity.js +12 -0
  133. package/dist/sqliteDecimal.js +22 -0
  134. package/dist/sqliteDecimalAggregateSql.js +61 -0
  135. package/dist/sqliteDecimalColumnSql.js +108 -0
  136. package/dist/sqliteDecimalConversion.js +15 -0
  137. package/dist/sqliteDecimalCte.js +154 -0
  138. package/dist/sqliteDecimalEncodeSql.js +32 -0
  139. package/dist/sqliteDecimalOutputs.js +74 -0
  140. package/dist/sqliteDecimalPredicate.js +66 -0
  141. package/dist/sqliteDecimalQuery.js +183 -0
  142. package/dist/sqliteDecimalQueryPlan.js +37 -0
  143. package/dist/sqliteDecimalResultSql.js +44 -0
  144. package/dist/sqliteDecimalRowQuery.js +63 -0
  145. package/dist/sqliteDecimalSetQuery.js +50 -0
  146. package/dist/sqliteDecimalSource.js +63 -0
  147. package/dist/sqliteDecimalStorage.js +29 -0
  148. package/dist/sqliteDecimalSubquery.js +19 -0
  149. package/dist/sqliteDecimalWindowQuery.js +196 -0
  150. package/dist/sqliteValueCoercion.js +4 -0
  151. package/dist/stampId.js +21 -0
  152. package/dist/storeErrors.js +9 -0
  153. package/dist/storeRefusal.js +20 -0
  154. package/dist/stream.js +36 -0
  155. package/dist/subjectGraph.js +175 -0
  156. package/dist/table.js +394 -0
  157. package/dist/tableRegistry.js +16 -0
  158. package/dist/tenantSelection.js +27 -0
  159. package/dist/transactionOutcome.js +97 -0
  160. package/dist/transientContention.js +36 -0
  161. package/dist/typedStore.js +16 -0
  162. package/dist/upsertUpdate.js +20 -0
  163. package/dist/vectorEmbedding.js +31 -0
  164. package/dist/view.js +39 -0
  165. package/dist/wire.d.ts +9 -10
  166. package/dist/wire.js +6 -2
  167. package/dist/writeAttribution.js +16 -0
  168. package/dist/writeRecorder.js +37 -0
  169. package/package.json +4 -6
  170. package/dist/replaceInProgress-DUHl5JEz.js +0 -3557
@@ -0,0 +1,343 @@
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}`), _ = (i, a, o = null, l, d = /* @__PURE__ */ new Set()) => {
20
+ if ("not" in i) return a`NOT (${_(i.not, a, o, l, d)})`;
21
+ if ("and" in i) return i.and.length === 0 ? a`TRUE` : a.and(i.and.map((e) => _(e, a, o, l, d)));
22
+ if ("or" in i) return i.or.length === 0 ? a`FALSE` : a.or(i.or.map((e) => _(e, a, o, l, d)));
23
+ if (i.op === "subquery-in" || i.op === "subquery-not-in") {
24
+ let e = i, t = M(e.subquery, a, o, void 0, d);
25
+ return e.op === "subquery-in" ? a`${a(e.column)} IN (${t})` : a`${a(e.column)} NOT IN (${t})`;
26
+ }
27
+ if (i.op === "exists" || i.op === "not-exists") {
28
+ let e = i, t = M(e.subquery, a, o, void 0, d);
29
+ return e.op === "exists" ? a`EXISTS (${t})` : a`NOT EXISTS (${t})`;
30
+ }
31
+ let f = i;
32
+ if (t(f.value)) {
33
+ if (!e.some((e) => e === f.op) || f.path !== void 0) throw n("Column references require a scalar comparison without a JSON path");
34
+ let t = a(f.value.column), r = a(f.column);
35
+ switch (f.op) {
36
+ case "eq": return a`${r} = ${t}`;
37
+ case "neq": return a`${r} <> ${t}`;
38
+ case "gt": return a`${r} > ${t}`;
39
+ case "gte": return a`${r} >= ${t}`;
40
+ case "lt": return a`${r} < ${t}`;
41
+ case "lte": return a`${r} <= ${t}`;
42
+ }
43
+ }
44
+ let p = a(f.column), m = f.path, h = m !== void 0 && m.length > 0, v = () => a.onDialectOrElse({
45
+ mysql: () => a.unsafe(c(f.column, m, "mysql")),
46
+ mssql: () => a.unsafe(c(f.column, m, "mssql")),
47
+ sqlite: () => a.unsafe(c(f.column, m, "sqlite")),
48
+ orElse: () => a.unsafe(c(f.column, m, "postgres"))
49
+ }), y = () => a.onDialectOrElse({
50
+ mysql: () => a.unsafe(c(f.column, m, "mysql", { numeric: !0 })),
51
+ mssql: () => a.unsafe(c(f.column, m, "mssql", { numeric: !0 })),
52
+ sqlite: () => a.unsafe(c(f.column, m, "sqlite", { numeric: !0 })),
53
+ orElse: () => a.unsafe(c(f.column, m, "postgres", { numeric: !0 }))
54
+ }), b = h ? v() : 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) => {
55
+ let t = u(w, e);
56
+ return t instanceof Date ? a.onDialectOrElse({
57
+ sqlite: () => s(t),
58
+ orElse: () => t
59
+ }) : t;
60
+ };
61
+ switch (f.op) {
62
+ case "eq": return a`${b} = ${S(T(f.value))}`;
63
+ case "neq": return a`${b} <> ${S(T(f.value))}`;
64
+ case "gt": return a`${x} > ${C(T(f.value))}`;
65
+ case "gte": return a`${x} >= ${C(T(f.value))}`;
66
+ case "lt": return a`${x} < ${C(T(f.value))}`;
67
+ case "lte": return a`${x} <= ${C(T(f.value))}`;
68
+ case "in": {
69
+ let e = f.value ?? [];
70
+ return e.length === 0 ? a`FALSE` : a`${b} IN ${a.in(h ? e.map((e) => S(e)) : e.map(T))}`;
71
+ }
72
+ case "notIn": {
73
+ let e = f.value ?? [];
74
+ return e.length === 0 ? a`TRUE` : a`${b} NOT IN ${a.in(h ? e.map((e) => S(e)) : e.map(T))}`;
75
+ }
76
+ case "contains": {
77
+ let e = `%${g(typeof f.value == "string" ? f.value : String(f.value ?? ""))}%`;
78
+ return a.onDialectOrElse({
79
+ mysql: () => a`LOWER(${b}) LIKE LOWER(${e})`,
80
+ mssql: () => a`LOWER(${b}) LIKE LOWER(${e})`,
81
+ sqlite: () => a`LOWER(${b}) LIKE LOWER(${e})`,
82
+ orElse: () => a`${b} ILIKE ${e} ESCAPE '\\'`
83
+ });
84
+ }
85
+ case "startsWith": {
86
+ let e = `${g(typeof f.value == "string" ? f.value : String(f.value ?? ""))}%`;
87
+ return a.onDialectOrElse({
88
+ mysql: () => a`${b} LIKE ${e}`,
89
+ orElse: () => a`${b} LIKE ${e} ESCAPE '\\'`
90
+ });
91
+ }
92
+ case "arrayContains": {
93
+ let e = f.value ?? [];
94
+ return e.length === 0 ? a`TRUE` : a.onDialectOrElse({
95
+ mysql: () => a`JSON_CONTAINS(${b}, ${JSON.stringify(e)})`,
96
+ mssql: () => a`(SELECT COUNT(DISTINCT value) FROM OPENJSON(${b}) WHERE value IN ${a.in(e)}) = ${e.length}`,
97
+ sqlite: () => a`(SELECT COUNT(DISTINCT value) FROM json_each(${b}) WHERE value IN ${a.in(e)}) = ${e.length}`,
98
+ orElse: () => a`${b} @> ${e}`
99
+ });
100
+ }
101
+ case "arrayOverlaps": {
102
+ let e = f.value ?? [];
103
+ return e.length === 0 ? a`FALSE` : a.onDialectOrElse({
104
+ mysql: () => a.or(e.map((e) => a`JSON_CONTAINS(${b}, ${JSON.stringify(e)})`)),
105
+ mssql: () => a`EXISTS (SELECT 1 FROM OPENJSON(${b}) WHERE value IN ${a.in(e)})`,
106
+ sqlite: () => a`EXISTS (SELECT 1 FROM json_each(${b}) WHERE value IN ${a.in(e)})`,
107
+ orElse: () => a`${b} && ${e}`
108
+ });
109
+ }
110
+ case "arrayHas": return a.onDialectOrElse({
111
+ mysql: () => a`JSON_CONTAINS(${b}, ${JSON.stringify(f.value)})`,
112
+ mssql: () => a`${f.value} IN (SELECT value FROM OPENJSON(${b}))`,
113
+ sqlite: () => a`EXISTS (SELECT 1 FROM json_each(${b}) WHERE value = ${f.value})`,
114
+ orElse: () => a`${f.value} = ANY(${b})`
115
+ });
116
+ case "isNull": return a`${b} IS NULL`;
117
+ case "isNotNull": return a`${b} IS NOT NULL`;
118
+ case "spatial": {
119
+ 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`;
120
+ return a.onDialectOrElse({
121
+ mysql: () => {
122
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
123
+ },
124
+ mssql: () => {
125
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
126
+ },
127
+ sqlite: () => {
128
+ throw n("@voltro/plugin-postgis: spatial predicates are postgres-only");
129
+ },
130
+ 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})`
131
+ });
132
+ }
133
+ }
134
+ }, v = (e, t) => {
135
+ let n = [];
136
+ 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}`);
137
+ }, y = (e, t) => t.join(", ", !1)(e.map((e) => {
138
+ let r = e.column === void 0 ? t.unsafe("*") : t`${t(e.column)}`;
139
+ if (e.op.startsWith("window-")) {
140
+ let i = v(e.window ?? {}, t);
141
+ switch (e.op) {
142
+ case "window-row-number": return t`ROW_NUMBER() OVER (${i}) AS ${t(e.alias)}`;
143
+ case "window-rank": return t`RANK() OVER (${i}) AS ${t(e.alias)}`;
144
+ case "window-dense-rank": return t`DENSE_RANK() OVER (${i}) AS ${t(e.alias)}`;
145
+ case "window-lag": return t`LAG(${r}, ${t.unsafe(String(e.offset ?? 1))}) OVER (${i}) AS ${t(e.alias)}`;
146
+ case "window-lead": return t`LEAD(${r}, ${t.unsafe(String(e.offset ?? 1))}) OVER (${i}) AS ${t(e.alias)}`;
147
+ case "window-sum-over": return t`SUM(${r}) OVER (${i}) AS ${t(e.alias)}`;
148
+ case "window-avg-over": return t`AVG(${r}) OVER (${i}) AS ${t(e.alias)}`;
149
+ default: throw n(`compileAggregateProjection: unknown window op '${e.op}'`);
150
+ }
151
+ }
152
+ switch (e.op) {
153
+ case "count": return t`COUNT(${r}) AS ${t(e.alias)}`;
154
+ case "count-distinct": return t`COUNT(DISTINCT ${r}) AS ${t(e.alias)}`;
155
+ case "sum": return t`SUM(${r}) AS ${t(e.alias)}`;
156
+ case "avg": return t`AVG(${r}) AS ${t(e.alias)}`;
157
+ case "min": return t`MIN(${r}) AS ${t(e.alias)}`;
158
+ case "max": return t`MAX(${r}) AS ${t(e.alias)}`;
159
+ case "column":
160
+ if (e.column === void 0) throw n(`compileAggregateProjection: 'column' projection requires a column name (alias '${e.alias}')`);
161
+ return t`${t(e.column)} AS ${t(e.alias)}`;
162
+ default: throw n(`compileAggregateProjection: unknown op '${e.op}'`);
163
+ }
164
+ })), b = (e) => `[${e.join(",")}]`, x = (e, t) => {
165
+ if (e.queryVector === void 0) return null;
166
+ let n = t(e.column), r = b(e.queryVector), i = e.distance === "cosine" ? "<=>" : e.distance === "l2" ? "<->" : "<#>", a = e.distance === "cosine" ? "VEC_DISTANCE_COSINE" : "VEC_DISTANCE_EUCLIDEAN";
167
+ return t.onDialectOrElse({
168
+ mysql: () => t`${t.unsafe(a)}(${n}, ${r})`,
169
+ mssql: () => t`NULL`,
170
+ sqlite: () => t`NULL`,
171
+ orElse: () => t`${n} ${t.unsafe(i)} ${r}::vector`
172
+ });
173
+ }, S = (e, t) => {
174
+ let n = t.unsafe(e.useGeography ? "::geography" : "::geometry");
175
+ return t`ST_Distance(${t(e.column)}${n}, ${e.geom}${n})`;
176
+ }, C = (e, t) => t`${t(e.column)} <-> ${e.geom}::geometry`, w = (e, t) => t`${t(`${e.indexName}_tsv`)}`, T = (e, t) => `${t}_${e.indexName}_fts`, E = (e) => e.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter((e) => e !== ""), D = (e) => {
177
+ if (e.prefix !== !0) return;
178
+ let t = E(e.query);
179
+ if (t.length !== 0) return {
180
+ pg: t.map((e) => `${e}:*`).join(" & "),
181
+ mysql: t.map((e) => `+${e}*`).join(" "),
182
+ sqlite: t.map((e) => `"${e}"*`).join(" ")
183
+ };
184
+ }, O = (e, t, n) => {
185
+ let r = n.join(", ", !1)(e.columns.map((e) => n`${n(e)}`)), i = `%${g(e.query)}%`, a = D(e), o = () => n.or(e.columns.map((e) => n`LOWER(${n(e)}) LIKE LOWER(${i}) ESCAPE '\\'`));
186
+ return e.fallback === "like" ? o() : n.onDialectOrElse({
187
+ mysql: () => a === void 0 ? n`MATCH(${r}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)` : n`MATCH(${r}) AGAINST(${a.mysql} IN BOOLEAN MODE)`,
188
+ sqlite: () => {
189
+ let r = n(T(e, t));
190
+ return n`${n("id")} IN (SELECT ${n("row_id")} FROM ${r} WHERE ${r} MATCH ${a?.sqlite ?? e.query})`;
191
+ },
192
+ mssql: o,
193
+ orElse: () => a === void 0 ? n`${w(e, n)} @@ plainto_tsquery(${e.config ?? "english"}, ${e.query})` : n`${w(e, n)} @@ to_tsquery(${e.config ?? "english"}, ${a.pg})`
194
+ });
195
+ }, k = (e, t, n) => {
196
+ let r = `%${g(e.query)}%`, i = D(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}`);
197
+ return e.fallback === "like" ? a() : n.onDialectOrElse({
198
+ 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)`,
199
+ sqlite: () => {
200
+ let r = n(T(e, t));
201
+ return n`COALESCE((SELECT -bm25(${r}) FROM ${r} WHERE ${r} MATCH ${i?.sqlite ?? e.query} AND ${r}.${n("row_id")} = ${n("id")}), 0)`;
202
+ },
203
+ mssql: a,
204
+ orElse: () => i === void 0 ? n`ts_rank(${w(e, n)}, plainto_tsquery(${e.config ?? "english"}, ${e.query}))` : n`ts_rank(${w(e, n)}, to_tsquery(${e.config ?? "english"}, ${i.pg}))`
205
+ });
206
+ }, A = (e, t, n, r, i = !1) => {
207
+ 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({
208
+ mssql: () => !0,
209
+ orElse: () => !1
210
+ });
211
+ return !e || !Object.values(e).some((e) => e.type === "bigint" || s && e.type === "decimal") ? o() : t.onDialectOrElse({
212
+ 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))}`)),
213
+ 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(),
214
+ orElse: o
215
+ });
216
+ }, j = (e, t, n) => A(r(e)?.fields, t, n), M = (e, t, o = null, s, c = /* @__PURE__ */ new Set(), u = !1) => {
217
+ 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 (${M(e.descriptor, t, o, e.recursive && t.onDialectOrElse({
218
+ sqlite: () => !0,
219
+ orElse: () => !1
220
+ }) ? e.name : void 0, f)})`), g = (e.ctes ?? []).some((e) => e.recursive === !0), v = h.length > 0 ? t`WITH ${t.unsafe(g ? "RECURSIVE " : "")}${t.join(", ", !1)(h)} ` : t``;
221
+ if (e.setOp && e.setOp.queries.length >= 2) {
222
+ let r = e.setOp.kind === "union" ? "UNION" : e.setOp.kind === "union-all" ? "UNION ALL" : e.setOp.kind === "intersect" ? "INTERSECT" : "EXCEPT", a = t.onDialectOrElse({
223
+ sqlite: () => !0,
224
+ orElse: () => !1
225
+ }), c = e.setOp.queries.map((e) => {
226
+ if (!a) return t`(${M(e, t, o, void 0, f)})`;
227
+ if (s !== void 0) {
228
+ if (!(i(e).length > 0 || e.take !== void 0 || e.skip !== void 0 || e.setOp !== void 0 || (e.ctes?.length ?? 0) > 0)) return M(e, t, o, void 0, f);
229
+ let r = (e) => e.replace(/[A-Z]/g, (e) => e.toLowerCase()), a = (e) => r(e) === r(s);
230
+ 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");
231
+ }
232
+ return t`SELECT * FROM (${M(e, t, o, void 0, f)})`;
233
+ }).reduce((e, n, i) => i === 0 ? n : t`${e} ${t.unsafe(r)} ${n}`), l = [];
234
+ 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) {
235
+ if (!Number.isInteger(e.take) || e.take < 0) throw n(`compileSelect: invalid take ${e.take}`);
236
+ l.push(t` LIMIT ${t.unsafe(String(e.take))}`);
237
+ }
238
+ if (e.skip !== void 0) {
239
+ 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}`);
240
+ l.push(t` OFFSET ${t.unsafe(String(e.skip))}`);
241
+ }
242
+ return t`${v}${c}${l.reduce((e, n) => t`${e}${n}`, t``)}`;
243
+ }
244
+ let b = e.annClause === void 0 ? null : x(e.annClause, t);
245
+ e.spatialClause !== void 0 && t.onDialectOrElse({
246
+ mysql: () => {
247
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
248
+ },
249
+ mssql: () => {
250
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
251
+ },
252
+ sqlite: () => {
253
+ throw n("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
254
+ },
255
+ orElse: () => t``
256
+ });
257
+ let w = e.spatialClause?.projectAs === void 0 ? null : S(e.spatialClause, t), T = e.aggregations && e.aggregations.length > 0 ? y(e.aggregations, t) : e.joinedProjection && e.joinedProjection.length > 0 ? t.join(", ", !1)(e.joinedProjection.map((e) => {
258
+ let n = t`${t(e.source)}`, r = d(e.source);
259
+ return t`${u && r?.type === "decimal" ? t.onDialectOrElse({
260
+ mssql: () => t`CONVERT(varchar(80), ${n})`,
261
+ orElse: () => n
262
+ }) : r?.type === "bigint" ? t.onDialectOrElse({
263
+ sqlite: () => t`CAST(${n} AS TEXT)`,
264
+ orElse: () => n
265
+ }) : n} AS ${t(e.outputKey)}`;
266
+ })) : A((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), E = (e.aggregations && e.aggregations.length > 0) === !0, D = b !== null && !E ? t`${T}, ${b} AS ${t("distance")}` : T, j = e.fullTextSearch, N = j?.rank !== void 0 && !E ? k(j, e.table, t) : null, P = N !== null && j?.rank !== void 0 ? t`${D}, ${N} AS ${t(j.rank.alias)}` : D, F = w !== null && !E && e.spatialClause?.projectAs !== void 0 ? t`${P}, ${w} AS ${t(e.spatialClause.projectAs)}` : P, I = e.distinctOn && e.distinctOn.length > 0 ? t.onDialectOrElse({
267
+ orElse: () => t`DISTINCT ON (${t.join(", ", !1)(e.distinctOn.map((e) => t`${t(e)}`))}) `,
268
+ mysql: () => t`DISTINCT `,
269
+ mssql: () => t`DISTINCT `,
270
+ sqlite: () => t`DISTINCT `
271
+ }) : e.distinct ? t`DISTINCT ` : t``, L = e.lock === "update", R = L ? t.onDialectOrElse({
272
+ mssql: () => t` WITH (UPDLOCK, ROWLOCK)`,
273
+ orElse: () => t``
274
+ }) : t``, z = L ? t.onDialectOrElse({
275
+ mssql: () => t``,
276
+ sqlite: () => t``,
277
+ orElse: () => t` FOR UPDATE`
278
+ }) : 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) => {
279
+ let n = e.kind === "inner" ? "INNER" : "LEFT";
280
+ return t` ${t.unsafe(n)} JOIN ${t(p(e.table))} AS ${t(e.alias)} ON ${_(e.on, t, o, void 0, f)}`;
281
+ }), H = V.length > 0 ? V.reduce((e, n) => t`${e}${n}`, B) : B, U = j === void 0 ? null : O(j, e.table, t), W = [e.predicate ? _(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 ${_(e.having, t, o, e.table, f)}` : t``, J = e.skip !== void 0, Y = [];
282
+ b !== null && Y.push(t`${b} ASC`), e.spatialClause?.order !== void 0 && Y.push(e.spatialClause.order === "desc" ? t`${C(e.spatialClause, t)} DESC` : t`${C(e.spatialClause, t)} ASC`), N !== null && j?.rank?.order === !0 && Y.push(t`${N} DESC`);
283
+ let X = i(e), Z = X.length >= 8 && (e.joinedProjection?.length ?? 0) >= 8 ? /* @__PURE__ */ new Map() : void 0;
284
+ if (Z) for (let t of e.joinedProjection ?? []) Z.has(t.outputKey) || Z.set(t.outputKey, t.source);
285
+ for (let n of X) {
286
+ let r = (Z === void 0 ? e.joinedProjection?.find((e) => e.outputKey === n.column)?.source : Z.get(n.column)) ?? n.column, i = u && !E && d(r)?.type === "decimal" ? t.onDialectOrElse({
287
+ mssql: () => t`${t(r.includes(".") ? r : `${e.alias ?? e.table}.${r}`)}`,
288
+ orElse: () => t`${t(n.column)}`
289
+ }) : !E && d(r)?.type === "bigint" ? t.onDialectOrElse({
290
+ sqlite: () => t`${t(r.includes(".") ? r : `${e.alias ?? e.table}.${r}`)}`,
291
+ orElse: () => t`${t(n.column)}`
292
+ }) : t`${t(n.column)}`;
293
+ Y.push(n.direction === "desc" ? t`${i} DESC` : t`${i} ASC`);
294
+ }
295
+ let Q = Y.length > 0 ? t` ORDER BY ${t.join(", ", !1)(Y)}` : J ? t.onDialectOrElse({
296
+ mssql: () => t` ORDER BY (SELECT NULL)`,
297
+ orElse: () => t``
298
+ }) : t``, $ = (e) => {
299
+ if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw n(`compileSelect: expected non-negative integer take/skip, got ${e}`);
300
+ return t.unsafe(String(e));
301
+ };
302
+ return t.onDialectOrElse({
303
+ mssql: () => {
304
+ 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``;
305
+ return t`${v}SELECT ${n}${I}${F} FROM ${H}${G}${K}${q}${Q}${r}`;
306
+ },
307
+ orElse: () => {
308
+ let n = e.take === void 0 ? J ? t.onDialectOrElse({
309
+ sqlite: () => t` LIMIT -1`,
310
+ mysql: () => t` LIMIT 18446744073709551615`,
311
+ orElse: () => t``
312
+ }) : t`` : t` LIMIT ${$(e.take)}`, r = J ? t` OFFSET ${$(e.skip)}` : t``;
313
+ return t`${v}SELECT ${I}${F} FROM ${H}${G}${K}${q}${Q}${n}${r}${z}`;
314
+ }
315
+ });
316
+ }, N = (e, t, n = null) => t.onDialectOrElse({
317
+ sqlite: () => !0,
318
+ orElse: () => !1
319
+ }) && o(e) ? t`${p(e, t, { materialized: !1 }, n)}` : M(t.onDialectOrElse({
320
+ mssql: () => d(e) ?? e,
321
+ orElse: () => e
322
+ }), t, n, void 0, /* @__PURE__ */ new Set(), !0), P = (e, t, n = null, r) => {
323
+ if (r !== void 0 && t.onDialectOrElse({
324
+ sqlite: () => !0,
325
+ orElse: () => !1
326
+ })) {
327
+ let i = {
328
+ table: r,
329
+ predicate: e,
330
+ order: [],
331
+ projection: void 0,
332
+ take: void 0,
333
+ skip: void 0
334
+ };
335
+ if (o(i)) return f(i, t, {
336
+ compile: (e) => N(e, t, n),
337
+ resultScale: void 0
338
+ }, e);
339
+ }
340
+ return _(e, t, n, r);
341
+ }, F = (e, t, n = null, r) => _(e, t, n, r);
342
+ //#endregion
343
+ export { P as compilePredicate, h as compileRawFragment, j as compileRowProjection, N as compileSelect, F 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,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 };