@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.
- package/CHANGELOG.md +1215 -0
- package/THIRD-PARTY-NOTICES.md +5 -89
- package/dist/actorSnapshot.js +24 -0
- package/dist/arrayCodec.js +32 -0
- package/dist/branchExecute.js +92 -0
- package/dist/branching.js +106 -0
- package/dist/bulkInsertLimits.js +25 -0
- package/dist/cdcOffsetsTables.js +19 -0
- package/dist/changeEvent.js +41 -0
- package/dist/changeIdentity.js +65 -0
- package/dist/changeListenerCeiling.js +6 -0
- package/dist/columnReference.js +17 -0
- package/dist/columns.js +326 -0
- package/dist/committedChanges.js +12 -0
- package/dist/connectionIdentity.js +36 -0
- package/dist/coreTables.js +16 -0
- package/dist/coreTablesRegistry.js +10 -0
- package/dist/dataTransfers.js +22 -0
- package/dist/dbCause.js +222 -0
- package/dist/dbMetrics.js +65 -0
- package/dist/decimalComparison.js +27 -0
- package/dist/derivedRowId.js +5 -0
- package/dist/dialect.js +13 -0
- package/dist/enumRenames.js +14 -0
- package/dist/expiresMixin.js +10 -0
- package/dist/fieldEncryption.js +98 -0
- package/dist/frameworkTables.js +130 -0
- package/dist/ginIndex.js +10 -0
- package/dist/hybridSearch.js +32 -0
- package/dist/idGenerator.js +57 -0
- package/dist/identifierLimits.js +32 -0
- package/dist/index.d.ts +122 -64
- package/dist/index.js +81 -2080
- package/dist/indexAudit.js +61 -0
- package/dist/indexStorage.js +58 -0
- package/dist/joinCompiler.js +160 -0
- package/dist/jsonEagerCompiler.js +436 -0
- package/dist/jsonPatch.js +78 -0
- package/dist/jsonPatchAssignments.js +13 -0
- package/dist/jsonPath.js +31 -0
- package/dist/localFirstMixin.js +12 -0
- package/dist/migrate.js +624 -0
- package/dist/migration.js +18 -0
- package/dist/migrations/appliedAtValue.js +8 -0
- package/dist/migrations/applier.js +1085 -0
- package/dist/migrations/boot.js +196 -0
- package/dist/migrations/branchRehearsal.js +122 -0
- package/dist/migrations/columnEquivalence.js +85 -0
- package/dist/migrations/ddlError.js +63 -0
- package/dist/migrations/declaredSchema.js +162 -0
- package/dist/migrations/deployLedger.js +19 -0
- package/dist/migrations/fileBased.js +57 -0
- package/dist/migrations/fileContext.js +482 -0
- package/dist/migrations/fileDiscovery.js +318 -0
- package/dist/migrations/fileSkipProbes.js +117 -0
- package/dist/migrations/fingerprint.js +46 -0
- package/dist/migrations/fkCycles.js +13 -0
- package/dist/migrations/frameworkLiveTables.js +25 -0
- package/dist/migrations/idempotentDdl.js +37 -0
- package/dist/migrations/indexPredicate.js +50 -0
- package/dist/migrations/introspect.js +799 -0
- package/dist/migrations/ledgerRows.js +4 -0
- package/dist/migrations/lock.js +91 -0
- package/dist/migrations/migrationTableExists.js +9 -0
- package/dist/migrations/mssqlColumnDependencies.js +76 -0
- package/dist/migrations/mysqlEngine.js +11 -0
- package/dist/migrations/namespaceCharset.js +51 -0
- package/dist/migrations/planner.js +775 -0
- package/dist/migrations/postgresEnumCheck.js +19 -0
- package/dist/migrations/reactiveTriggerDrift.js +58 -0
- package/dist/migrations/reactiveTriggerName.js +7 -0
- package/dist/migrations/renameMssqlCheck.js +21 -0
- package/dist/migrations/restoreSnapshots.js +206 -0
- package/dist/migrations/resumeLedger.js +86 -0
- package/dist/migrations/rollingDeploy.js +106 -0
- package/dist/migrations/schemaOwner.js +46 -0
- package/dist/migrations/schemaOwnerTable.js +4 -0
- package/dist/migrations/softDropSnapshot.js +20 -0
- package/dist/migrations/sqlLimit.js +8 -0
- package/dist/migrations/sqliteConstraintIdentity.js +97 -0
- package/dist/migrations/sqliteDecimalBoot.js +22 -0
- package/dist/migrations/sqliteDecimalPublication.js +257 -0
- package/dist/migrations/sqliteDecimalReview.js +30 -0
- package/dist/migrations/sqliteDecimalReviewStore.js +188 -0
- package/dist/migrations/sqliteDecimalReviewWitness.js +38 -0
- package/dist/migrations/sqliteDecimalSource.js +69 -0
- package/dist/migrations/sqliteDecimalStage.js +135 -0
- package/dist/migrations/sqliteForeignKeys.js +38 -0
- package/dist/migrations/sqliteMigrationBatch.js +37 -0
- package/dist/migrations/sqliteRetainedSource.js +106 -0
- package/dist/migrations/sqliteRowIdentity.js +63 -0
- package/dist/migrations/sqliteSchemaEpoch.js +12 -0
- package/dist/migrations/sqliteSnapshotGuard.js +10 -0
- package/dist/migrations/sqliteTableContents.js +34 -0
- package/dist/migrations/sqliteTableCopy.js +25 -0
- package/dist/migrations/sqliteTableSchema.js +19 -0
- package/dist/migrations/sqliteWitnessProtection.js +8 -0
- package/dist/migrations/squash.js +81 -0
- package/dist/migrations/storeCharset.js +66 -0
- package/dist/migrations/transactionCause.js +10 -0
- package/dist/migrations/undeclaredCharset.js +40 -0
- package/dist/migrations/uniqueActiveLowering.js +39 -0
- package/dist/mixins.js +22 -0
- package/dist/mssqlDecimalDistinct.js +51 -0
- package/dist/mssqlJsonValueCheck.js +42 -0
- package/dist/mssqlTextStorage.js +9 -0
- package/dist/namespace.js +21 -0
- package/dist/{wire-B28cPjEp.js → optimisticVersion.js} +2 -2
- package/dist/pendingAttribution.js +79 -0
- package/dist/pluginRef.js +17 -0
- package/dist/predicate.js +266 -0
- package/dist/predicateCoercion.js +13 -0
- package/dist/projectedColumn.js +37 -0
- package/dist/queryBuilder.js +382 -0
- package/dist/rawSql.js +8 -0
- package/dist/relations.js +69 -0
- package/dist/relationsRegistry.js +38 -0
- package/dist/replaceInProgress.js +53 -0
- package/dist/requiredColumns.js +26 -0
- package/dist/residency.js +52 -0
- package/dist/retention.js +62 -0
- package/dist/rowDecoder.js +123 -0
- package/dist/rowKey.js +8 -0
- package/dist/rowSchema.js +31 -0
- package/dist/scopeKey.js +8 -0
- package/dist/seed.js +33 -0
- package/dist/snowflake.js +26 -0
- package/dist/sql.d.ts +58 -29
- package/dist/sql.js +41 -6661
- package/dist/sqlCompiler.js +343 -0
- package/dist/sqlError.js +8 -0
- package/dist/sqlPoolCapacity.js +12 -0
- package/dist/sqliteDecimal.js +22 -0
- package/dist/sqliteDecimalAggregateSql.js +61 -0
- package/dist/sqliteDecimalColumnSql.js +108 -0
- package/dist/sqliteDecimalConversion.js +15 -0
- package/dist/sqliteDecimalCte.js +154 -0
- package/dist/sqliteDecimalEncodeSql.js +32 -0
- package/dist/sqliteDecimalOutputs.js +74 -0
- package/dist/sqliteDecimalPredicate.js +66 -0
- package/dist/sqliteDecimalQuery.js +183 -0
- package/dist/sqliteDecimalQueryPlan.js +37 -0
- package/dist/sqliteDecimalResultSql.js +44 -0
- package/dist/sqliteDecimalRowQuery.js +63 -0
- package/dist/sqliteDecimalSetQuery.js +50 -0
- package/dist/sqliteDecimalSource.js +63 -0
- package/dist/sqliteDecimalStorage.js +29 -0
- package/dist/sqliteDecimalSubquery.js +19 -0
- package/dist/sqliteDecimalWindowQuery.js +196 -0
- package/dist/sqliteValueCoercion.js +4 -0
- package/dist/stampId.js +21 -0
- package/dist/storeErrors.js +9 -0
- package/dist/storeRefusal.js +20 -0
- package/dist/stream.js +36 -0
- package/dist/subjectGraph.js +175 -0
- package/dist/table.js +394 -0
- package/dist/tableRegistry.js +16 -0
- package/dist/tenantSelection.js +27 -0
- package/dist/transactionOutcome.js +97 -0
- package/dist/transientContention.js +36 -0
- package/dist/typedStore.js +16 -0
- package/dist/upsertUpdate.js +20 -0
- package/dist/vectorEmbedding.js +31 -0
- package/dist/view.js +39 -0
- package/dist/wire.d.ts +9 -10
- package/dist/wire.js +6 -2
- package/dist/writeAttribution.js +16 -0
- package/dist/writeRecorder.js +37 -0
- package/package.json +4 -6
- 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 };
|
package/dist/sqlError.js
ADDED
|
@@ -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 };
|