prisma-ts-select 0.0.34 → 0.1.3

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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1343 -362
  3. package/assets/groupBy.gif +0 -0
  4. package/assets/joinUnsafeIgnoreType.gif +0 -0
  5. package/assets/joinUnsafeTypeEnforced.gif +0 -0
  6. package/assets/typesafe-join.gif +0 -0
  7. package/assets/typesafe-join.png +0 -0
  8. package/assets/{whereisNull.gif → whereIsNull.gif} +0 -0
  9. package/assets/whereNotNull.gif +0 -0
  10. package/dist/bin.cjs +1 -1
  11. package/dist/bin.js +1 -1
  12. package/dist/chunk-47KZVQLD.js +283 -0
  13. package/dist/chunk-54D2J5AR.cjs +291 -0
  14. package/dist/extend/dialects/index.d.ts +13 -0
  15. package/dist/extend/dialects/index.js +194 -0
  16. package/dist/extend/dialects/mysql-v6.d.ts +103 -0
  17. package/dist/extend/dialects/mysql-v6.js +157 -0
  18. package/dist/extend/dialects/mysql-v7.d.ts +6 -0
  19. package/dist/extend/dialects/mysql-v7.js +143 -0
  20. package/dist/extend/dialects/mysql.d.ts +93 -0
  21. package/dist/extend/dialects/mysql.js +161 -0
  22. package/dist/extend/dialects/postgresql-v6.d.ts +101 -0
  23. package/dist/extend/dialects/postgresql-v6.js +147 -0
  24. package/dist/extend/dialects/postgresql-v7.d.ts +101 -0
  25. package/dist/extend/dialects/postgresql-v7.js +147 -0
  26. package/dist/extend/dialects/postgresql.d.ts +92 -0
  27. package/dist/extend/dialects/postgresql.js +158 -0
  28. package/dist/extend/dialects/shared.d.ts +10 -0
  29. package/dist/extend/dialects/shared.js +14 -0
  30. package/dist/extend/dialects/sqlite.d.ts +68 -0
  31. package/dist/extend/dialects/sqlite.js +146 -0
  32. package/dist/extend/dialects/types.d.ts +13 -0
  33. package/dist/extend/dialects/types.js +4 -0
  34. package/dist/extend/extend.d.ts +292 -46
  35. package/dist/extend/extend.js +769 -162
  36. package/dist/extend/sql-expr-BaKWzJ-r.d.ts +10 -0
  37. package/dist/extend/types-B0F8m0ok.d.ts +8 -0
  38. package/dist/generator.cjs +1 -1
  39. package/dist/generator.js +1 -1
  40. package/package.json +44 -42
  41. package/built/extend.cjs +0 -680
  42. package/built/extend.d.cts +0 -520
  43. package/built/extend.d.ts +0 -520
  44. package/built/extend.js +0 -678
  45. package/dist/chunk-TBO3MX7Q.cjs +0 -195
  46. package/dist/chunk-X3N5N5KQ.js +0 -187
  47. package/dist/extend/extend.cjs +0 -357
  48. package/dist/extend/extend.d.cts +0 -264
@@ -0,0 +1,194 @@
1
+ // src/dialects/types.ts
2
+ var SUPPORTED_PROVIDERS = ["sqlite", "mysql", "postgresql"];
3
+
4
+ // src/sql-expr.ts
5
+ function sqlExpr(sql) {
6
+ return { sql, toString() {
7
+ return sql;
8
+ } };
9
+ }
10
+ function resolveArg(arg, quoteFn) {
11
+ if (typeof arg !== "string") return arg.sql;
12
+ return quoteFn(arg);
13
+ }
14
+
15
+ // src/dialects/shared.ts
16
+ var esc = (s) => s.replace(/'/g, "''");
17
+ var flattenJsonObjectPairs = (pairs, quoteFn) => pairs.flatMap(([k, v]) => [`'${esc(k)}'`, resolveArg(v, quoteFn)]);
18
+
19
+ // src/dialects/sqlite.ts
20
+ var SQLITE_CAST_TYPES = /* @__PURE__ */ new Set(["INTEGER", "TEXT", "REAL", "NUMERIC", "BLOB"]);
21
+ var dateArg = (col, quoteFn) => {
22
+ if (typeof col !== "string") return col.sql;
23
+ const ref = quoteFn(col);
24
+ return `CASE WHEN typeof(${ref}) = 'integer' THEN datetime(${ref}/1000, 'unixepoch') ELSE ${ref} END`;
25
+ };
26
+ var sqliteContextFns = (quoteFn, condFn) => ({
27
+ avg: (col) => sqlExpr(`AVG(${resolveArg(col, quoteFn)})`),
28
+ // SQLite SUM returns INTEGER (→ bigint) for integer columns, REAL (→ number) for float columns
29
+ sum: (col) => sqlExpr(`SUM(${resolveArg(col, quoteFn)})`),
30
+ // Aggregate integer-result fns — SQLite returns INTEGER → bigint
31
+ countAll: () => sqlExpr("COUNT(*)"),
32
+ count: (col) => sqlExpr(col === "*" ? "COUNT(*)" : `COUNT(${quoteFn(col)})`),
33
+ countDistinct: (col) => sqlExpr(`COUNT(DISTINCT ${quoteFn(col)})`),
34
+ // LENGTH returns INTEGER → bigint in SQLite
35
+ length: (col) => sqlExpr(`LENGTH(${resolveArg(col, quoteFn)})`),
36
+ groupConcat: (col, sep) => sqlExpr(`GROUP_CONCAT(${quoteFn(col)}${sep !== void 0 ? `, '${sep.replace(/'/g, "''")}'` : ""})`),
37
+ total: (col) => sqlExpr(`TOTAL(${quoteFn(col)})`),
38
+ // SQLite MIN/MAX return bigint for integer columns — override base (number) return types
39
+ min: (col) => sqlExpr(`MIN(${quoteFn(col)})`),
40
+ max: (col) => sqlExpr(`MAX(${quoteFn(col)})`),
41
+ concat: (...args) => {
42
+ if (args.length === 0) throw new Error("concat: requires at least one argument");
43
+ return sqlExpr(args.map((a) => resolveArg(a, quoteFn)).join(" || "));
44
+ },
45
+ substr: (col, start, len) => sqlExpr(`SUBSTR(${resolveArg(col, quoteFn)}, ${start}${len !== void 0 ? `, ${len}` : ""})`),
46
+ instr: (col, substr) => sqlExpr(`INSTR(${resolveArg(col, quoteFn)}, '${substr.replace(/'/g, "''")}')`),
47
+ char: (...codes) => sqlExpr(`CHAR(${codes.join(", ")})`),
48
+ hex: (col) => sqlExpr(`HEX(${resolveArg(col, quoteFn)})`),
49
+ unicode: (col) => sqlExpr(`UNICODE(${resolveArg(col, quoteFn)})`),
50
+ // Control flow
51
+ // Note: SQLite has no GREATEST()/LEAST() functions — it uses scalar MAX(a,b)/MIN(a,b) instead.
52
+ // Omitted here because the naming diverges from the MySQL/PG convention.
53
+ iif: (cond, trueVal, falseVal) => {
54
+ const condSql = typeof cond === "object" && cond !== null && "sql" in cond ? cond.sql : condFn(cond);
55
+ return sqlExpr(`IIF(${condSql}, ${trueVal.sql}, ${falseVal.sql})`);
56
+ },
57
+ ifNull: (col, fallback) => sqlExpr(`IFNULL(${resolveArg(col, quoteFn)}, ${fallback.sql})`),
58
+ // DateTime overrides
59
+ now: () => sqlExpr(`datetime('now')`),
60
+ curDate: () => sqlExpr(`date('now')`),
61
+ year: (col) => sqlExpr(`strftime('%Y', ${dateArg(col, quoteFn)})`),
62
+ month: (col) => sqlExpr(`strftime('%m', ${dateArg(col, quoteFn)})`),
63
+ day: (col) => sqlExpr(`strftime('%d', ${dateArg(col, quoteFn)})`),
64
+ hour: (col) => sqlExpr(`strftime('%H', ${dateArg(col, quoteFn)})`),
65
+ minute: (col) => sqlExpr(`strftime('%M', ${dateArg(col, quoteFn)})`),
66
+ second: (col) => sqlExpr(`strftime('%S', ${dateArg(col, quoteFn)})`),
67
+ // SQLite-only DateTime fns
68
+ /**
69
+ * SQLite `strftime` returns `NULL` if the date value is `NULL` or cannot be parsed.
70
+ * Unknown format directives (e.g. `%q`) are passed through literally, not as errors.
71
+ */
72
+ strftime: (fmt, col) => sqlExpr(`strftime('${fmt.replace(/'/g, "''")}', ${dateArg(col, quoteFn)})`),
73
+ julianday: (col) => sqlExpr(`julianday(${dateArg(col, quoteFn)})`),
74
+ date: (col) => sqlExpr(`date(${dateArg(col, quoteFn)})`),
75
+ datetime: (col) => sqlExpr(`datetime(${dateArg(col, quoteFn)})`),
76
+ // ── Math ─────────────────────────────────────────────────────────────────
77
+ // SQLite returns bigint for integer results (ceil, floor, sign, mod) and number for floats.
78
+ // All inputs accept SQLExpr<number | bigint> so composed calls (e.g. sqrt(power(...))) type-check.
79
+ // sqrt/exp always return REAL, so they are typed as number.
80
+ abs: (col) => sqlExpr(`ABS(${resolveArg(col, quoteFn)})`),
81
+ ceil: (col) => sqlExpr(`CEIL(${resolveArg(col, quoteFn)})`),
82
+ floor: (col) => sqlExpr(`FLOOR(${resolveArg(col, quoteFn)})`),
83
+ round: (col, decimals) => sqlExpr(decimals !== void 0 ? `ROUND(${resolveArg(col, quoteFn)}, ${decimals})` : `ROUND(${resolveArg(col, quoteFn)})`),
84
+ // SQLite's POWER() always returns REAL regardless of input type
85
+ power: (base, exp) => sqlExpr(`POWER(${resolveArg(base, quoteFn)}, ${typeof exp === "number" ? exp : exp.sql})`),
86
+ sqrt: (col) => sqlExpr(`SQRT(${resolveArg(col, quoteFn)})`),
87
+ mod: (col, divisor) => sqlExpr(`MOD(${resolveArg(col, quoteFn)}, ${divisor})`),
88
+ sign: (col) => sqlExpr(`SIGN(${resolveArg(col, quoteFn)})`),
89
+ exp: (col) => sqlExpr(`EXP(${resolveArg(col, quoteFn)})`),
90
+ // ── Math (SQLite 3.35+) ──────────────────────────────────────────────────
91
+ // SQLite RANDOM() returns a 64-bit signed integer — always bigint
92
+ random: () => sqlExpr("RANDOM()"),
93
+ log: (x) => sqlExpr(`LOG(${resolveArg(x, quoteFn)})`),
94
+ log2: (x) => sqlExpr(`LOG2(${resolveArg(x, quoteFn)})`),
95
+ log10: (x) => sqlExpr(`LOG10(${resolveArg(x, quoteFn)})`),
96
+ // ── JSON scalar fns ───────────────────────────────────────────────────────
97
+ jsonExtract: (col, path) => sqlExpr(`json_extract(${resolveArg(col, quoteFn)}, '${esc(path)}')`),
98
+ jsonArray: (...args) => sqlExpr(`json_array(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`),
99
+ jsonObject: (pairs) => sqlExpr(`json_object(${flattenJsonObjectPairs(pairs, quoteFn).join(", ")})`),
100
+ // ── Type coercion ────────────────────────────────────────────────────────
101
+ cast: (expr, type) => {
102
+ if (!SQLITE_CAST_TYPES.has(type)) throw new Error(`cast: invalid cast type '${String(type)}'`);
103
+ return sqlExpr(`CAST(${resolveArg(expr, quoteFn)} AS ${type})`);
104
+ }
105
+ });
106
+ var sqliteDialect = {
107
+ name: "sqlite",
108
+ needsBooleanCoercion: () => true,
109
+ quote: (name, _isAlias) => {
110
+ if (_isAlias) return "`" + name + "`";
111
+ return name;
112
+ },
113
+ quoteTableIdentifier: (name, _isAlias) => {
114
+ if (_isAlias) return "`" + name + "`";
115
+ return name;
116
+ },
117
+ quoteQualifiedColumn: (ref) => {
118
+ if (!ref.includes(".")) return ref;
119
+ const [table, col] = ref.split(".", 2);
120
+ return `${table}.${col}`;
121
+ },
122
+ quoteOrderByClause: (clause) => {
123
+ const parts = clause.trim().split(/\s+/);
124
+ const colRef = parts[0] ?? "";
125
+ const suffix = parts.slice(1).join(" ");
126
+ const quoted = colRef.includes(".") ? (() => {
127
+ const [table, col] = colRef.split(".", 2);
128
+ return `${table}.${col}`;
129
+ })() : `${colRef}`;
130
+ return suffix ? `${quoted} ${suffix}` : quoted;
131
+ }
132
+ };
133
+
134
+ // src/dialects/mysql.ts
135
+ var mysqlDialect = {
136
+ name: "mysql",
137
+ needsBooleanCoercion: () => true,
138
+ quote: (id, _isAlias) => `\`${id}\``,
139
+ quoteTableIdentifier: (name, _isAlias) => `\`${name}\``,
140
+ quoteQualifiedColumn: (ref) => {
141
+ if (!ref.includes(".")) return `\`${ref}\``;
142
+ const [table, col] = ref.split(".", 2);
143
+ return `\`${table}\`.\`${col}\``;
144
+ },
145
+ quoteOrderByClause: (clause) => {
146
+ const parts = clause.trim().split(/\s+/);
147
+ const colRef = parts[0] ?? "";
148
+ const suffix = parts.slice(1).join(" ");
149
+ const quoted = colRef.includes(".") ? (() => {
150
+ const [table, col] = colRef.split(".", 2);
151
+ return `\`${table}\`.\`${col}\``;
152
+ })() : `\`${colRef}\``;
153
+ return suffix ? `${quoted} ${suffix}` : quoted;
154
+ }
155
+ };
156
+
157
+ // src/dialects/postgresql.ts
158
+ var postgresqlDialect = {
159
+ name: "postgresql",
160
+ needsBooleanCoercion: () => false,
161
+ quote: (id, _isAlias) => `"${id}"`,
162
+ quoteTableIdentifier: (name, _isAlias) => `"${name}"`,
163
+ quoteQualifiedColumn: (ref) => {
164
+ if (!ref.includes(".")) return `"${ref}"`;
165
+ const [table, col] = ref.split(".", 2);
166
+ return `"${table}"."${col}"`;
167
+ },
168
+ quoteOrderByClause: (clause) => {
169
+ const parts = clause.trim().split(/\s+/);
170
+ const colRef = parts[0] ?? "";
171
+ const suffix = parts.slice(1).join(" ");
172
+ const quoted = colRef.includes(".") ? (() => {
173
+ const [table, col] = colRef.split(".", 2);
174
+ return `"${table}"."${col}"`;
175
+ })() : `"${colRef}"`;
176
+ return suffix ? `${quoted} ${suffix}` : quoted;
177
+ }
178
+ };
179
+
180
+ // src/dialects/index.ts
181
+ function getDialect(provider) {
182
+ switch (provider) {
183
+ case "sqlite":
184
+ return sqliteDialect;
185
+ case "mysql":
186
+ return mysqlDialect;
187
+ case "postgresql":
188
+ return postgresqlDialect;
189
+ default:
190
+ return sqliteDialect;
191
+ }
192
+ }
193
+
194
+ export { SUPPORTED_PROVIDERS, sqliteDialect as dialect, sqliteContextFns as dialectContextFns, getDialect, mysqlDialect, postgresqlDialect, sqliteDialect };
@@ -0,0 +1,103 @@
1
+ import { ColName, FilterCols, FilterJsonCols } from './shared.js';
2
+ import { IntervalUnit } from './mysql.js';
3
+ export { mysqlDialect } from './mysql.js';
4
+ import { J as JSONValue, a as JSONObject } from '../types-B0F8m0ok.js';
5
+ import * as _prisma_client_runtime_client from '@prisma/client/runtime/client';
6
+ import { S as SQLExpr } from '../sql-expr-BaKWzJ-r.js';
7
+ import './types.js';
8
+
9
+ declare const mysqlV6ContextFns: <TColEntries extends [string, unknown] = never, TCriteria extends object = object>(quoteFn: (ref: string) => string, condFn: (criteria: TCriteria) => string) => {
10
+ countAll: () => SQLExpr<bigint>;
11
+ count: (col: ColName<TColEntries> | "*") => SQLExpr<bigint>;
12
+ countDistinct: (col: ColName<TColEntries>) => SQLExpr<bigint>;
13
+ length: (col: FilterCols<TColEntries, string> | SQLExpr<string>) => SQLExpr<bigint>;
14
+ abs: (col: FilterCols<TColEntries, number> | SQLExpr<number>) => SQLExpr<bigint | number>;
15
+ ceil: (col: FilterCols<TColEntries, number> | SQLExpr<number>) => SQLExpr<bigint | number>;
16
+ floor: (col: FilterCols<TColEntries, number> | SQLExpr<number>) => SQLExpr<bigint | number>;
17
+ mod: (col: FilterCols<TColEntries, number> | SQLExpr<number>, divisor: number) => SQLExpr<bigint | number>;
18
+ sign: (col: FilterCols<TColEntries, number> | SQLExpr<number>) => SQLExpr<bigint | number>;
19
+ avg: (col: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<_prisma_client_runtime_client.Decimal>;
20
+ sum: (col: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<_prisma_client_runtime_client.Decimal>;
21
+ groupConcat: (col: ColName<TColEntries>, sep?: string) => SQLExpr<string>;
22
+ bitAnd: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
23
+ bitOr: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
24
+ bitXor: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
25
+ stddev: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
26
+ stddevSamp: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
27
+ variance: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
28
+ varSamp: (col: FilterCols<TColEntries, number>) => SQLExpr<number>;
29
+ jsonArrayAgg: (col: ColName<TColEntries>) => SQLExpr<JSONValue>;
30
+ jsonObjectAgg: (key: ColName<TColEntries>, val: ColName<TColEntries>) => SQLExpr<JSONValue>;
31
+ concat: (args_0: SQLExpr<string> | FilterCols<TColEntries, string>, ...args: (SQLExpr<string> | FilterCols<TColEntries, string>)[]) => SQLExpr<string>;
32
+ substring: (col: SQLExpr<string> | FilterCols<TColEntries, string>, start: number, len?: number) => SQLExpr<string>;
33
+ left: (col: SQLExpr<string> | FilterCols<TColEntries, string>, n: number) => SQLExpr<string>;
34
+ right: (col: SQLExpr<string> | FilterCols<TColEntries, string>, n: number) => SQLExpr<string>;
35
+ repeat: (col: SQLExpr<string> | FilterCols<TColEntries, string>, n: number) => SQLExpr<string>;
36
+ reverse: (col: SQLExpr<string> | FilterCols<TColEntries, string>) => SQLExpr<string>;
37
+ lpad: (col: SQLExpr<string> | FilterCols<TColEntries, string>, len: number, pad: string) => SQLExpr<string>;
38
+ rpad: (col: SQLExpr<string> | FilterCols<TColEntries, string>, len: number, pad: string) => SQLExpr<string>;
39
+ locate: (substr: string, col: SQLExpr<string> | FilterCols<TColEntries, string>) => SQLExpr<bigint>;
40
+ space: (n: number) => SQLExpr<string>;
41
+ now: () => SQLExpr<Date>;
42
+ curDate: () => SQLExpr<Date>;
43
+ year: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<bigint>;
44
+ month: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<bigint>;
45
+ day: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<bigint>;
46
+ hour: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<bigint>;
47
+ minute: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<number>;
48
+ second: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<number>;
49
+ $if: <T>(cond: TCriteria | SQLExpr<unknown>, trueVal: SQLExpr<T>, falseVal: SQLExpr<T>) => SQLExpr<T>;
50
+ ifNull: <T>(col: FilterCols<TColEntries, T> | SQLExpr<T>, fallback: SQLExpr<NonNullable<T>>) => SQLExpr<NonNullable<T>>;
51
+ greatest: <T>(args_0: FilterCols<TColEntries, T> | SQLExpr<T>, ...args: (FilterCols<TColEntries, T> | SQLExpr<T>)[]) => SQLExpr<T | null>;
52
+ least: <T>(args_0: FilterCols<TColEntries, T> | SQLExpr<T>, ...args: (FilterCols<TColEntries, T> | SQLExpr<T>)[]) => SQLExpr<T | null>;
53
+ dateAdd: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>, n: number, unit: IntervalUnit) => SQLExpr<Date>;
54
+ dateSub: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>, n: number, unit: IntervalUnit) => SQLExpr<Date>;
55
+ dateFormat: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>, fmt: string) => SQLExpr<string>;
56
+ dateDiff: (d1: SQLExpr<Date> | FilterCols<TColEntries, Date>, d2: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<number>;
57
+ quarter: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<bigint>;
58
+ weekOfYear: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<number>;
59
+ dayName: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<string>;
60
+ lastDay: (col: SQLExpr<Date> | FilterCols<TColEntries, Date>) => SQLExpr<Date>;
61
+ round: (col: SQLExpr<number> | FilterCols<TColEntries, number>, decimals?: number) => SQLExpr<number>;
62
+ power: (base: SQLExpr<number> | FilterCols<TColEntries, number>, exp: number | SQLExpr<number>) => SQLExpr<number>;
63
+ sqrt: (col: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
64
+ exp: (col: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
65
+ pi: () => SQLExpr<number>;
66
+ ln: (x: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
67
+ log: (x: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
68
+ log2: (x: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
69
+ log10: (x: SQLExpr<number> | FilterCols<TColEntries, number>) => SQLExpr<number>;
70
+ truncate: (x: SQLExpr<number> | FilterCols<TColEntries, number>, n: number) => SQLExpr<number>;
71
+ rand: (seed?: number) => SQLExpr<number>;
72
+ jsonExtract: (col: SQLExpr<_prisma_client_runtime_client.JsonValue> | FilterJsonCols<TColEntries>, path: string) => SQLExpr<JSONValue>;
73
+ jsonArray: (args_0: SQLExpr<unknown> | ColName<TColEntries>, ...args: (SQLExpr<unknown> | ColName<TColEntries>)[]) => SQLExpr<JSONValue[]>;
74
+ jsonObject: (pairs: [string, SQLExpr<unknown> | ColName<TColEntries>][]) => SQLExpr<JSONObject>;
75
+ cast: <T extends keyof {
76
+ SIGNED: bigint;
77
+ UNSIGNED: bigint;
78
+ DECIMAL: _prisma_client_runtime_client.Decimal;
79
+ CHAR: string;
80
+ BINARY: Buffer;
81
+ DATE: Date;
82
+ DATETIME: Date;
83
+ TIME: string;
84
+ JSON: JSONValue;
85
+ FLOAT: number;
86
+ DOUBLE: number;
87
+ }>(expr: SQLExpr<unknown> | ColName<TColEntries>, type: T) => SQLExpr<{
88
+ SIGNED: bigint;
89
+ UNSIGNED: bigint;
90
+ DECIMAL: _prisma_client_runtime_client.Decimal;
91
+ CHAR: string;
92
+ BINARY: Buffer;
93
+ DATE: Date;
94
+ DATETIME: Date;
95
+ TIME: string;
96
+ JSON: JSONValue;
97
+ FLOAT: number;
98
+ DOUBLE: number;
99
+ }[T]>;
100
+ };
101
+ type DialectFns<TColEntries extends [string, unknown] = never, TCriteria extends object = object> = ReturnType<typeof mysqlV6ContextFns<TColEntries, TCriteria>>;
102
+
103
+ export { type DialectFns, IntervalUnit, mysqlV6ContextFns };
@@ -0,0 +1,157 @@
1
+ // src/sql-expr.ts
2
+ function sqlExpr(sql) {
3
+ return { sql, toString() {
4
+ return sql;
5
+ } };
6
+ }
7
+ function resolveArg(arg, quoteFn) {
8
+ if (typeof arg !== "string") return arg.sql;
9
+ return quoteFn(arg);
10
+ }
11
+
12
+ // src/dialects/shared.ts
13
+ var esc = (s) => s.replace(/'/g, "''");
14
+ var flattenJsonObjectPairs = (pairs, quoteFn) => pairs.flatMap(([k, v]) => [`'${esc(k)}'`, resolveArg(v, quoteFn)]);
15
+
16
+ // src/dialects/mysql.ts
17
+ var MYSQL_CAST_TYPES = /* @__PURE__ */ new Set(["SIGNED", "UNSIGNED", "DECIMAL", "CHAR", "BINARY", "DATE", "DATETIME", "TIME", "JSON", "FLOAT", "DOUBLE"]);
18
+ var mysqlContextFns = (quoteFn, condFn) => ({
19
+ avg: (col) => sqlExpr(`AVG(${resolveArg(col, quoteFn)})`),
20
+ sum: (col) => sqlExpr(`SUM(${resolveArg(col, quoteFn)})`),
21
+ countAll: () => sqlExpr("COUNT(*)"),
22
+ count: (col) => sqlExpr(col === "*" ? "COUNT(*)" : `COUNT(${quoteFn(col)})`),
23
+ countDistinct: (col) => sqlExpr(`COUNT(DISTINCT ${quoteFn(col)})`),
24
+ length: (col) => sqlExpr(`LENGTH(${resolveArg(col, quoteFn)})`),
25
+ groupConcat: (col, sep) => sqlExpr(`GROUP_CONCAT(${quoteFn(col)}${sep !== void 0 ? ` SEPARATOR '${esc(sep)}'` : ""})`),
26
+ bitAnd: (col) => sqlExpr(`BIT_AND(${quoteFn(col)})`),
27
+ bitOr: (col) => sqlExpr(`BIT_OR(${quoteFn(col)})`),
28
+ bitXor: (col) => sqlExpr(`BIT_XOR(${quoteFn(col)})`),
29
+ stddev: (col) => sqlExpr(`STDDEV(${quoteFn(col)})`),
30
+ stddevSamp: (col) => sqlExpr(`STDDEV_SAMP(${quoteFn(col)})`),
31
+ variance: (col) => sqlExpr(`VARIANCE(${quoteFn(col)})`),
32
+ varSamp: (col) => sqlExpr(`VAR_SAMP(${quoteFn(col)})`),
33
+ jsonArrayAgg: (col) => sqlExpr(`JSON_ARRAYAGG(${quoteFn(col)})`),
34
+ jsonObjectAgg: (key, val) => sqlExpr(`JSON_OBJECTAGG(${quoteFn(key)}, ${quoteFn(val)})`),
35
+ concat: (...args) => {
36
+ if (args.length === 0) throw new Error("concat: requires at least one argument");
37
+ return sqlExpr(`CONCAT(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
38
+ },
39
+ substring: (col, start, len) => sqlExpr(`SUBSTRING(${resolveArg(col, quoteFn)}, ${start}${len !== void 0 ? `, ${len}` : ""})`),
40
+ left: (col, n) => sqlExpr(`LEFT(${resolveArg(col, quoteFn)}, ${n})`),
41
+ right: (col, n) => sqlExpr(`RIGHT(${resolveArg(col, quoteFn)}, ${n})`),
42
+ repeat: (col, n) => sqlExpr(`REPEAT(${resolveArg(col, quoteFn)}, ${n})`),
43
+ reverse: (col) => sqlExpr(`REVERSE(${resolveArg(col, quoteFn)})`),
44
+ lpad: (col, len, pad) => sqlExpr(`LPAD(${resolveArg(col, quoteFn)}, ${len}, '${esc(pad)}')`),
45
+ rpad: (col, len, pad) => sqlExpr(`RPAD(${resolveArg(col, quoteFn)}, ${len}, '${esc(pad)}')`),
46
+ locate: (substr, col) => sqlExpr(`LOCATE('${esc(substr)}', ${resolveArg(col, quoteFn)})`),
47
+ space: (n) => sqlExpr(`SPACE(${n})`),
48
+ // DateTime base fns (MySQL defaults)
49
+ now: () => sqlExpr("NOW()"),
50
+ curDate: () => sqlExpr("CURDATE()"),
51
+ year: (col) => sqlExpr(`YEAR(${resolveArg(col, quoteFn)})`),
52
+ month: (col) => sqlExpr(`MONTH(${resolveArg(col, quoteFn)})`),
53
+ day: (col) => sqlExpr(`DAY(${resolveArg(col, quoteFn)})`),
54
+ hour: (col) => sqlExpr(`HOUR(${resolveArg(col, quoteFn)})`),
55
+ minute: (col) => sqlExpr(`MINUTE(${resolveArg(col, quoteFn)})`),
56
+ second: (col) => sqlExpr(`SECOND(${resolveArg(col, quoteFn)})`),
57
+ // Control flow
58
+ $if: (cond, trueVal, falseVal) => {
59
+ const condSql = typeof cond === "object" && cond !== null && "sql" in cond ? cond.sql : condFn(cond);
60
+ return sqlExpr(`IF(${condSql}, ${trueVal.sql}, ${falseVal.sql})`);
61
+ },
62
+ ifNull: (col, fallback) => sqlExpr(`IFNULL(${resolveArg(col, quoteFn)}, ${fallback.sql})`),
63
+ // NULL-poisoned: returns NULL if any arg is NULL
64
+ greatest: (...args) => {
65
+ if (args.length === 0) throw new Error("greatest: requires at least one argument");
66
+ return sqlExpr(`GREATEST(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
67
+ },
68
+ // NULL-poisoned: returns NULL if any arg is NULL
69
+ least: (...args) => {
70
+ if (args.length === 0) throw new Error("least: requires at least one argument");
71
+ return sqlExpr(`LEAST(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
72
+ },
73
+ // DateTime fns (MySQL-only)
74
+ dateAdd: (col, n, unit) => {
75
+ if (!Number.isFinite(n)) throw new Error(`dateAdd: n must be a finite number, got ${n}`);
76
+ return sqlExpr(`DATE_ADD(${resolveArg(col, quoteFn)}, INTERVAL ${n} ${unit})`);
77
+ },
78
+ dateSub: (col, n, unit) => {
79
+ if (!Number.isFinite(n)) throw new Error(`dateSub: n must be a finite number, got ${n}`);
80
+ return sqlExpr(`DATE_SUB(${resolveArg(col, quoteFn)}, INTERVAL ${n} ${unit})`);
81
+ },
82
+ /**
83
+ * MySQL `DATE_FORMAT` returns `NULL` if the date column value is `NULL`.
84
+ * Unknown format specifiers are passed through literally, not as errors.
85
+ */
86
+ dateFormat: (col, fmt) => sqlExpr(`DATE_FORMAT(${resolveArg(col, quoteFn)}, '${esc(fmt)}')`),
87
+ dateDiff: (d1, d2) => sqlExpr(`DATEDIFF(${resolveArg(d1, quoteFn)}, ${resolveArg(d2, quoteFn)})`),
88
+ quarter: (col) => sqlExpr(`QUARTER(${resolveArg(col, quoteFn)})`),
89
+ weekOfYear: (col) => sqlExpr(`WEEKOFYEAR(${resolveArg(col, quoteFn)})`),
90
+ dayName: (col) => sqlExpr(`DAYNAME(${resolveArg(col, quoteFn)})`),
91
+ lastDay: (col) => sqlExpr(`LAST_DAY(${resolveArg(col, quoteFn)})`),
92
+ // ── Math ─────────────────────────────────────────────────────────────────
93
+ abs: (col) => sqlExpr(`ABS(${resolveArg(col, quoteFn)})`),
94
+ ceil: (col) => sqlExpr(`CEIL(${resolveArg(col, quoteFn)})`),
95
+ floor: (col) => sqlExpr(`FLOOR(${resolveArg(col, quoteFn)})`),
96
+ round: (col, decimals) => sqlExpr(decimals !== void 0 ? `ROUND(${resolveArg(col, quoteFn)}, ${decimals})` : `ROUND(${resolveArg(col, quoteFn)})`),
97
+ power: (base, exp) => sqlExpr(`POWER(${resolveArg(base, quoteFn)}, ${typeof exp === "number" ? exp : exp.sql})`),
98
+ sqrt: (col) => sqlExpr(`SQRT(${resolveArg(col, quoteFn)})`),
99
+ mod: (col, divisor) => sqlExpr(`MOD(${resolveArg(col, quoteFn)}, ${divisor})`),
100
+ sign: (col) => sqlExpr(`SIGN(${resolveArg(col, quoteFn)})`),
101
+ exp: (col) => sqlExpr(`EXP(${resolveArg(col, quoteFn)})`),
102
+ // ── Math (MySQL-specific) ─────────────────────────────────────────────────
103
+ pi: () => sqlExpr("PI()"),
104
+ ln: (x) => sqlExpr(`LN(${resolveArg(x, quoteFn)})`),
105
+ /** Natural log (ln(x)). Use `log10(x)` for base-10. Note: PG `log(x)` is base-10 — opposite semantics. */
106
+ log: (x) => sqlExpr(`LOG(${resolveArg(x, quoteFn)})`),
107
+ log2: (x) => sqlExpr(`LOG2(${resolveArg(x, quoteFn)})`),
108
+ log10: (x) => sqlExpr(`LOG10(${resolveArg(x, quoteFn)})`),
109
+ truncate: (x, n) => sqlExpr(`TRUNCATE(${resolveArg(x, quoteFn)}, ${n})`),
110
+ rand: (seed) => sqlExpr(seed !== void 0 ? `RAND(${seed})` : "RAND()"),
111
+ // ── JSON scalar fns ───────────────────────────────────────────────────────
112
+ jsonExtract: (col, path) => sqlExpr(`JSON_EXTRACT(${resolveArg(col, quoteFn)}, '${esc(path)}')`),
113
+ jsonArray: (...args) => sqlExpr(`JSON_ARRAY(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`),
114
+ jsonObject: (pairs) => sqlExpr(`JSON_OBJECT(${flattenJsonObjectPairs(pairs, quoteFn).join(", ")})`),
115
+ // ── Type coercion ────────────────────────────────────────────────────────
116
+ cast: (expr, type) => {
117
+ if (!MYSQL_CAST_TYPES.has(type)) throw new Error(`cast: invalid cast type '${String(type)}'`);
118
+ return sqlExpr(`CAST(${resolveArg(expr, quoteFn)} AS ${type})`);
119
+ }
120
+ });
121
+ var mysqlDialect = {
122
+ name: "mysql",
123
+ needsBooleanCoercion: () => true,
124
+ quote: (id, _isAlias) => `\`${id}\``,
125
+ quoteTableIdentifier: (name, _isAlias) => `\`${name}\``,
126
+ quoteQualifiedColumn: (ref) => {
127
+ if (!ref.includes(".")) return `\`${ref}\``;
128
+ const [table, col] = ref.split(".", 2);
129
+ return `\`${table}\`.\`${col}\``;
130
+ },
131
+ quoteOrderByClause: (clause) => {
132
+ const parts = clause.trim().split(/\s+/);
133
+ const colRef = parts[0] ?? "";
134
+ const suffix = parts.slice(1).join(" ");
135
+ const quoted = colRef.includes(".") ? (() => {
136
+ const [table, col] = colRef.split(".", 2);
137
+ return `\`${table}\`.\`${col}\``;
138
+ })() : `\`${colRef}\``;
139
+ return suffix ? `${quoted} ${suffix}` : quoted;
140
+ }
141
+ };
142
+
143
+ // src/dialects/mysql-v6.ts
144
+ var mysqlV6ContextFns = (quoteFn, condFn) => ({
145
+ ...mysqlContextFns(quoteFn, condFn),
146
+ countAll: () => sqlExpr("COUNT(*)"),
147
+ count: (col) => sqlExpr(col === "*" ? "COUNT(*)" : `COUNT(${quoteFn(col)})`),
148
+ countDistinct: (col) => sqlExpr(`COUNT(DISTINCT ${quoteFn(col)})`),
149
+ length: (col) => sqlExpr(`LENGTH(${resolveArg(col, quoteFn)})`),
150
+ abs: (col) => sqlExpr(`ABS(${resolveArg(col, quoteFn)})`),
151
+ ceil: (col) => sqlExpr(`CEIL(${resolveArg(col, quoteFn)})`),
152
+ floor: (col) => sqlExpr(`FLOOR(${resolveArg(col, quoteFn)})`),
153
+ mod: (col, divisor) => sqlExpr(`MOD(${resolveArg(col, quoteFn)}, ${divisor})`),
154
+ sign: (col) => sqlExpr(`SIGN(${resolveArg(col, quoteFn)})`)
155
+ });
156
+
157
+ export { mysqlDialect, mysqlV6ContextFns };
@@ -0,0 +1,6 @@
1
+ export { DialectFns, IntervalUnit, mysqlDialect, mysqlContextFns as mysqlV7ContextFns } from './mysql.js';
2
+ import './types.js';
3
+ import '../sql-expr-BaKWzJ-r.js';
4
+ import '../types-B0F8m0ok.js';
5
+ import '@prisma/client/runtime/client';
6
+ import './shared.js';
@@ -0,0 +1,143 @@
1
+ // src/sql-expr.ts
2
+ function sqlExpr(sql) {
3
+ return { sql, toString() {
4
+ return sql;
5
+ } };
6
+ }
7
+ function resolveArg(arg, quoteFn) {
8
+ if (typeof arg !== "string") return arg.sql;
9
+ return quoteFn(arg);
10
+ }
11
+
12
+ // src/dialects/shared.ts
13
+ var esc = (s) => s.replace(/'/g, "''");
14
+ var flattenJsonObjectPairs = (pairs, quoteFn) => pairs.flatMap(([k, v]) => [`'${esc(k)}'`, resolveArg(v, quoteFn)]);
15
+
16
+ // src/dialects/mysql.ts
17
+ var MYSQL_CAST_TYPES = /* @__PURE__ */ new Set(["SIGNED", "UNSIGNED", "DECIMAL", "CHAR", "BINARY", "DATE", "DATETIME", "TIME", "JSON", "FLOAT", "DOUBLE"]);
18
+ var mysqlContextFns = (quoteFn, condFn) => ({
19
+ avg: (col) => sqlExpr(`AVG(${resolveArg(col, quoteFn)})`),
20
+ sum: (col) => sqlExpr(`SUM(${resolveArg(col, quoteFn)})`),
21
+ countAll: () => sqlExpr("COUNT(*)"),
22
+ count: (col) => sqlExpr(col === "*" ? "COUNT(*)" : `COUNT(${quoteFn(col)})`),
23
+ countDistinct: (col) => sqlExpr(`COUNT(DISTINCT ${quoteFn(col)})`),
24
+ length: (col) => sqlExpr(`LENGTH(${resolveArg(col, quoteFn)})`),
25
+ groupConcat: (col, sep) => sqlExpr(`GROUP_CONCAT(${quoteFn(col)}${sep !== void 0 ? ` SEPARATOR '${esc(sep)}'` : ""})`),
26
+ bitAnd: (col) => sqlExpr(`BIT_AND(${quoteFn(col)})`),
27
+ bitOr: (col) => sqlExpr(`BIT_OR(${quoteFn(col)})`),
28
+ bitXor: (col) => sqlExpr(`BIT_XOR(${quoteFn(col)})`),
29
+ stddev: (col) => sqlExpr(`STDDEV(${quoteFn(col)})`),
30
+ stddevSamp: (col) => sqlExpr(`STDDEV_SAMP(${quoteFn(col)})`),
31
+ variance: (col) => sqlExpr(`VARIANCE(${quoteFn(col)})`),
32
+ varSamp: (col) => sqlExpr(`VAR_SAMP(${quoteFn(col)})`),
33
+ jsonArrayAgg: (col) => sqlExpr(`JSON_ARRAYAGG(${quoteFn(col)})`),
34
+ jsonObjectAgg: (key, val) => sqlExpr(`JSON_OBJECTAGG(${quoteFn(key)}, ${quoteFn(val)})`),
35
+ concat: (...args) => {
36
+ if (args.length === 0) throw new Error("concat: requires at least one argument");
37
+ return sqlExpr(`CONCAT(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
38
+ },
39
+ substring: (col, start, len) => sqlExpr(`SUBSTRING(${resolveArg(col, quoteFn)}, ${start}${len !== void 0 ? `, ${len}` : ""})`),
40
+ left: (col, n) => sqlExpr(`LEFT(${resolveArg(col, quoteFn)}, ${n})`),
41
+ right: (col, n) => sqlExpr(`RIGHT(${resolveArg(col, quoteFn)}, ${n})`),
42
+ repeat: (col, n) => sqlExpr(`REPEAT(${resolveArg(col, quoteFn)}, ${n})`),
43
+ reverse: (col) => sqlExpr(`REVERSE(${resolveArg(col, quoteFn)})`),
44
+ lpad: (col, len, pad) => sqlExpr(`LPAD(${resolveArg(col, quoteFn)}, ${len}, '${esc(pad)}')`),
45
+ rpad: (col, len, pad) => sqlExpr(`RPAD(${resolveArg(col, quoteFn)}, ${len}, '${esc(pad)}')`),
46
+ locate: (substr, col) => sqlExpr(`LOCATE('${esc(substr)}', ${resolveArg(col, quoteFn)})`),
47
+ space: (n) => sqlExpr(`SPACE(${n})`),
48
+ // DateTime base fns (MySQL defaults)
49
+ now: () => sqlExpr("NOW()"),
50
+ curDate: () => sqlExpr("CURDATE()"),
51
+ year: (col) => sqlExpr(`YEAR(${resolveArg(col, quoteFn)})`),
52
+ month: (col) => sqlExpr(`MONTH(${resolveArg(col, quoteFn)})`),
53
+ day: (col) => sqlExpr(`DAY(${resolveArg(col, quoteFn)})`),
54
+ hour: (col) => sqlExpr(`HOUR(${resolveArg(col, quoteFn)})`),
55
+ minute: (col) => sqlExpr(`MINUTE(${resolveArg(col, quoteFn)})`),
56
+ second: (col) => sqlExpr(`SECOND(${resolveArg(col, quoteFn)})`),
57
+ // Control flow
58
+ $if: (cond, trueVal, falseVal) => {
59
+ const condSql = typeof cond === "object" && cond !== null && "sql" in cond ? cond.sql : condFn(cond);
60
+ return sqlExpr(`IF(${condSql}, ${trueVal.sql}, ${falseVal.sql})`);
61
+ },
62
+ ifNull: (col, fallback) => sqlExpr(`IFNULL(${resolveArg(col, quoteFn)}, ${fallback.sql})`),
63
+ // NULL-poisoned: returns NULL if any arg is NULL
64
+ greatest: (...args) => {
65
+ if (args.length === 0) throw new Error("greatest: requires at least one argument");
66
+ return sqlExpr(`GREATEST(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
67
+ },
68
+ // NULL-poisoned: returns NULL if any arg is NULL
69
+ least: (...args) => {
70
+ if (args.length === 0) throw new Error("least: requires at least one argument");
71
+ return sqlExpr(`LEAST(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`);
72
+ },
73
+ // DateTime fns (MySQL-only)
74
+ dateAdd: (col, n, unit) => {
75
+ if (!Number.isFinite(n)) throw new Error(`dateAdd: n must be a finite number, got ${n}`);
76
+ return sqlExpr(`DATE_ADD(${resolveArg(col, quoteFn)}, INTERVAL ${n} ${unit})`);
77
+ },
78
+ dateSub: (col, n, unit) => {
79
+ if (!Number.isFinite(n)) throw new Error(`dateSub: n must be a finite number, got ${n}`);
80
+ return sqlExpr(`DATE_SUB(${resolveArg(col, quoteFn)}, INTERVAL ${n} ${unit})`);
81
+ },
82
+ /**
83
+ * MySQL `DATE_FORMAT` returns `NULL` if the date column value is `NULL`.
84
+ * Unknown format specifiers are passed through literally, not as errors.
85
+ */
86
+ dateFormat: (col, fmt) => sqlExpr(`DATE_FORMAT(${resolveArg(col, quoteFn)}, '${esc(fmt)}')`),
87
+ dateDiff: (d1, d2) => sqlExpr(`DATEDIFF(${resolveArg(d1, quoteFn)}, ${resolveArg(d2, quoteFn)})`),
88
+ quarter: (col) => sqlExpr(`QUARTER(${resolveArg(col, quoteFn)})`),
89
+ weekOfYear: (col) => sqlExpr(`WEEKOFYEAR(${resolveArg(col, quoteFn)})`),
90
+ dayName: (col) => sqlExpr(`DAYNAME(${resolveArg(col, quoteFn)})`),
91
+ lastDay: (col) => sqlExpr(`LAST_DAY(${resolveArg(col, quoteFn)})`),
92
+ // ── Math ─────────────────────────────────────────────────────────────────
93
+ abs: (col) => sqlExpr(`ABS(${resolveArg(col, quoteFn)})`),
94
+ ceil: (col) => sqlExpr(`CEIL(${resolveArg(col, quoteFn)})`),
95
+ floor: (col) => sqlExpr(`FLOOR(${resolveArg(col, quoteFn)})`),
96
+ round: (col, decimals) => sqlExpr(decimals !== void 0 ? `ROUND(${resolveArg(col, quoteFn)}, ${decimals})` : `ROUND(${resolveArg(col, quoteFn)})`),
97
+ power: (base, exp) => sqlExpr(`POWER(${resolveArg(base, quoteFn)}, ${typeof exp === "number" ? exp : exp.sql})`),
98
+ sqrt: (col) => sqlExpr(`SQRT(${resolveArg(col, quoteFn)})`),
99
+ mod: (col, divisor) => sqlExpr(`MOD(${resolveArg(col, quoteFn)}, ${divisor})`),
100
+ sign: (col) => sqlExpr(`SIGN(${resolveArg(col, quoteFn)})`),
101
+ exp: (col) => sqlExpr(`EXP(${resolveArg(col, quoteFn)})`),
102
+ // ── Math (MySQL-specific) ─────────────────────────────────────────────────
103
+ pi: () => sqlExpr("PI()"),
104
+ ln: (x) => sqlExpr(`LN(${resolveArg(x, quoteFn)})`),
105
+ /** Natural log (ln(x)). Use `log10(x)` for base-10. Note: PG `log(x)` is base-10 — opposite semantics. */
106
+ log: (x) => sqlExpr(`LOG(${resolveArg(x, quoteFn)})`),
107
+ log2: (x) => sqlExpr(`LOG2(${resolveArg(x, quoteFn)})`),
108
+ log10: (x) => sqlExpr(`LOG10(${resolveArg(x, quoteFn)})`),
109
+ truncate: (x, n) => sqlExpr(`TRUNCATE(${resolveArg(x, quoteFn)}, ${n})`),
110
+ rand: (seed) => sqlExpr(seed !== void 0 ? `RAND(${seed})` : "RAND()"),
111
+ // ── JSON scalar fns ───────────────────────────────────────────────────────
112
+ jsonExtract: (col, path) => sqlExpr(`JSON_EXTRACT(${resolveArg(col, quoteFn)}, '${esc(path)}')`),
113
+ jsonArray: (...args) => sqlExpr(`JSON_ARRAY(${args.map((a) => resolveArg(a, quoteFn)).join(", ")})`),
114
+ jsonObject: (pairs) => sqlExpr(`JSON_OBJECT(${flattenJsonObjectPairs(pairs, quoteFn).join(", ")})`),
115
+ // ── Type coercion ────────────────────────────────────────────────────────
116
+ cast: (expr, type) => {
117
+ if (!MYSQL_CAST_TYPES.has(type)) throw new Error(`cast: invalid cast type '${String(type)}'`);
118
+ return sqlExpr(`CAST(${resolveArg(expr, quoteFn)} AS ${type})`);
119
+ }
120
+ });
121
+ var mysqlDialect = {
122
+ name: "mysql",
123
+ needsBooleanCoercion: () => true,
124
+ quote: (id, _isAlias) => `\`${id}\``,
125
+ quoteTableIdentifier: (name, _isAlias) => `\`${name}\``,
126
+ quoteQualifiedColumn: (ref) => {
127
+ if (!ref.includes(".")) return `\`${ref}\``;
128
+ const [table, col] = ref.split(".", 2);
129
+ return `\`${table}\`.\`${col}\``;
130
+ },
131
+ quoteOrderByClause: (clause) => {
132
+ const parts = clause.trim().split(/\s+/);
133
+ const colRef = parts[0] ?? "";
134
+ const suffix = parts.slice(1).join(" ");
135
+ const quoted = colRef.includes(".") ? (() => {
136
+ const [table, col] = colRef.split(".", 2);
137
+ return `\`${table}\`.\`${col}\``;
138
+ })() : `\`${colRef}\``;
139
+ return suffix ? `${quoted} ${suffix}` : quoted;
140
+ }
141
+ };
142
+
143
+ export { mysqlDialect, mysqlContextFns as mysqlV7ContextFns };