joist-core 2.3.0-next.87 → 2.3.0-next.89
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/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +3 -3
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +3 -3
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js.map +1 -1
- package/build/Expr.cjs +12 -6
- package/build/Expr.cjs.map +1 -1
- package/build/Expr.d.cts +4 -4
- package/build/Expr.d.cts.map +1 -1
- package/build/Expr.d.mts +4 -4
- package/build/Expr.d.mts.map +1 -1
- package/build/Expr.js +12 -6
- package/build/Expr.js.map +1 -1
- package/build/expressions/case.cjs +71 -0
- package/build/expressions/case.cjs.map +1 -0
- package/build/expressions/case.d.cts +57 -0
- package/build/expressions/case.d.cts.map +1 -0
- package/build/expressions/case.d.mts +57 -0
- package/build/expressions/case.d.mts.map +1 -0
- package/build/expressions/case.js +68 -0
- package/build/expressions/case.js.map +1 -0
- package/build/expressions/coalesce.cjs +25 -0
- package/build/expressions/coalesce.cjs.map +1 -0
- package/build/expressions/coalesce.d.cts +21 -0
- package/build/expressions/coalesce.d.cts.map +1 -0
- package/build/expressions/coalesce.d.mts +21 -0
- package/build/expressions/coalesce.d.mts.map +1 -0
- package/build/expressions/coalesce.js +22 -0
- package/build/expressions/coalesce.js.map +1 -0
- package/build/expressions/codecs.cjs +112 -0
- package/build/expressions/codecs.cjs.map +1 -0
- package/build/expressions/codecs.d.cts +11 -0
- package/build/expressions/codecs.d.cts.map +1 -0
- package/build/expressions/codecs.d.mts +11 -0
- package/build/expressions/codecs.d.mts.map +1 -0
- package/build/expressions/codecs.js +111 -0
- package/build/expressions/codecs.js.map +1 -0
- package/build/expressions/expression.cjs +99 -0
- package/build/expressions/expression.cjs.map +1 -0
- package/build/expressions/expression.d.cts +23 -0
- package/build/expressions/expression.d.cts.map +1 -0
- package/build/expressions/expression.d.mts +23 -0
- package/build/expressions/expression.d.mts.map +1 -0
- package/build/expressions/expression.js +94 -0
- package/build/expressions/expression.js.map +1 -0
- package/build/expressions/greatest.cjs +25 -0
- package/build/expressions/greatest.cjs.map +1 -0
- package/build/expressions/greatest.d.cts +21 -0
- package/build/expressions/greatest.d.cts.map +1 -0
- package/build/expressions/greatest.d.mts +21 -0
- package/build/expressions/greatest.d.mts.map +1 -0
- package/build/expressions/greatest.js +22 -0
- package/build/expressions/greatest.js.map +1 -0
- package/build/expressions/least.cjs +25 -0
- package/build/expressions/least.cjs.map +1 -0
- package/build/expressions/least.d.cts +21 -0
- package/build/expressions/least.d.cts.map +1 -0
- package/build/expressions/least.d.mts +21 -0
- package/build/expressions/least.d.mts.map +1 -0
- package/build/expressions/least.js +22 -0
- package/build/expressions/least.js.map +1 -0
- package/build/expressions/nullIf.cjs +27 -0
- package/build/expressions/nullIf.cjs.map +1 -0
- package/build/expressions/nullIf.d.cts +22 -0
- package/build/expressions/nullIf.d.cts.map +1 -0
- package/build/expressions/nullIf.d.mts +22 -0
- package/build/expressions/nullIf.d.mts.map +1 -0
- package/build/expressions/nullIf.js +24 -0
- package/build/expressions/nullIf.js.map +1 -0
- package/build/expressions/parseExpression.cjs +70 -0
- package/build/expressions/parseExpression.cjs.map +1 -0
- package/build/expressions/parseExpression.d.cts +19 -0
- package/build/expressions/parseExpression.d.cts.map +1 -0
- package/build/expressions/parseExpression.d.mts +19 -0
- package/build/expressions/parseExpression.d.mts.map +1 -0
- package/build/expressions/parseExpression.js +65 -0
- package/build/expressions/parseExpression.js.map +1 -0
- package/build/expressions/types.cjs +1 -0
- package/build/expressions/types.d.cts +94 -0
- package/build/expressions/types.d.cts.map +1 -0
- package/build/expressions/types.d.mts +94 -0
- package/build/expressions/types.d.mts.map +1 -0
- package/build/expressions/types.js +1 -0
- package/build/index.cjs +2 -0
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +5 -2
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +5 -2
- package/build/index.d.mts.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/query.cjs +14 -6
- package/build/query.cjs.map +1 -1
- package/build/query.d.cts +39 -47
- package/build/query.d.cts.map +1 -1
- package/build/query.d.mts +39 -47
- package/build/query.d.mts.map +1 -1
- package/build/query.js +14 -6
- package/build/query.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_utils = require("../utils.cjs");
|
|
3
|
+
const require_Expr = require("../Expr.cjs");
|
|
4
|
+
const require_expressions_coalesce = require("./coalesce.cjs");
|
|
5
|
+
const require_expressions_greatest = require("./greatest.cjs");
|
|
6
|
+
const require_expressions_least = require("./least.cjs");
|
|
7
|
+
const require_expressions_nullIf = require("./nullIf.cjs");
|
|
8
|
+
const require_expressions_parseExpression = require("./parseExpression.cjs");
|
|
9
|
+
const require_expressions_case = require("./case.cjs");
|
|
10
|
+
const require_expressions_codecs = require("./codecs.cjs");
|
|
11
|
+
//#region src/expressions/expression.ts
|
|
12
|
+
/** Builds a reusable SQL value expression, binding literal values as parameters. */
|
|
13
|
+
function expr(input) {
|
|
14
|
+
return buildExpr(input);
|
|
15
|
+
}
|
|
16
|
+
/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */
|
|
17
|
+
function buildExpr(input) {
|
|
18
|
+
return new ObjectExpr(require_expressions_parseExpression.parseExpressionInput(input));
|
|
19
|
+
}
|
|
20
|
+
/** Exposes a ParsedExpression through the Expr methods, SQL rendering, and shared result codec. */
|
|
21
|
+
var ObjectExpr = class extends require_Expr.BaseExpr {
|
|
22
|
+
parsed;
|
|
23
|
+
codec;
|
|
24
|
+
constructor(parsed) {
|
|
25
|
+
super();
|
|
26
|
+
this.parsed = parsed;
|
|
27
|
+
this.codec = require_expressions_codecs.chooseExpressionCodec(parsed);
|
|
28
|
+
}
|
|
29
|
+
get outputType() {
|
|
30
|
+
return this.codec.outputType;
|
|
31
|
+
}
|
|
32
|
+
get sqlNullable() {
|
|
33
|
+
return expressionNullable(this.parsed);
|
|
34
|
+
}
|
|
35
|
+
toSql(ctx) {
|
|
36
|
+
return expressionToSql(this.parsed, ctx, this.codec);
|
|
37
|
+
}
|
|
38
|
+
decode(value) {
|
|
39
|
+
return value == null ? value : this.codec.decode(value);
|
|
40
|
+
}
|
|
41
|
+
encode(value) {
|
|
42
|
+
return value == null ? value : this.codec.encode(value);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Reports nullability from the fields of each parsed expression kind.
|
|
47
|
+
* A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.
|
|
48
|
+
*/
|
|
49
|
+
function expressionNullable(parsed) {
|
|
50
|
+
if (parsed instanceof require_Expr.BaseExpr) return parsed.sqlSource ? void 0 : parsed.sqlNullable;
|
|
51
|
+
switch (parsed.kind) {
|
|
52
|
+
case "literal": return parsed.value === null;
|
|
53
|
+
case "nullIf": return require_expressions_nullIf.nullIfNullable();
|
|
54
|
+
case "coalesce": return require_expressions_coalesce.coalesceNullable(parsed);
|
|
55
|
+
case "greatest": return require_expressions_greatest.greatestNullable(parsed);
|
|
56
|
+
case "least": return require_expressions_least.leastNullable(parsed);
|
|
57
|
+
case "case": return require_expressions_case.caseNullable(parsed);
|
|
58
|
+
default: return require_utils.assertNever(parsed);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.
|
|
63
|
+
* An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.
|
|
64
|
+
*/
|
|
65
|
+
function expressionToSql(parsed, ctx, codec) {
|
|
66
|
+
if (parsed instanceof require_Expr.BaseExpr) return parsed.toSql(ctx);
|
|
67
|
+
switch (parsed.kind) {
|
|
68
|
+
case "literal": {
|
|
69
|
+
const dbType = codec.outputType?.dbType;
|
|
70
|
+
return {
|
|
71
|
+
sql: dbType ? `?::${dbType}` : "?",
|
|
72
|
+
bindings: [parsed.value === null ? null : codec.encode(parsed.value)],
|
|
73
|
+
refs: []
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
case "coalesce": return require_expressions_coalesce.coalesceToSql(parsed, ctx, codec);
|
|
77
|
+
case "nullIf": return require_expressions_nullIf.nullIfToSql(parsed, ctx, codec);
|
|
78
|
+
case "greatest": return require_expressions_greatest.greatestToSql(parsed, ctx, codec);
|
|
79
|
+
case "least": return require_expressions_least.leastToSql(parsed, ctx, codec);
|
|
80
|
+
case "case": return require_expressions_case.caseToSql(parsed, ctx, codec);
|
|
81
|
+
default: return require_utils.assertNever(parsed);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */
|
|
85
|
+
function functionToSql(name, args, ctx, codec) {
|
|
86
|
+
const parts = require_Expr.joinFragments(args.map((arg) => expressionToSql(arg, ctx, codec)), ", ");
|
|
87
|
+
return {
|
|
88
|
+
...parts,
|
|
89
|
+
sql: `${name}(${parts.sql})`
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
exports.buildExpr = buildExpr;
|
|
94
|
+
exports.expr = expr;
|
|
95
|
+
exports.expressionNullable = expressionNullable;
|
|
96
|
+
exports.expressionToSql = expressionToSql;
|
|
97
|
+
exports.functionToSql = functionToSql;
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=expression.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.cjs","names":["parseExpressionInput","BaseExpr","chooseExpressionCodec","nullIfNullable","coalesceNullable","greatestNullable","leastNullable","caseNullable","assertNever","coalesceToSql","nullIfToSql","greatestToSql","leastToSql","caseToSql","joinFragments"],"sources":["../../src/expressions/expression.ts"],"sourcesContent":["import { BaseExpr, type ExprContext, type SqlFragment, joinFragments } from \"../Expr.ts\";\nimport type { TypeInfo } from \"../TypeInfo.ts\";\nimport { assertNever } from \"../utils.ts\";\nimport { caseNullable, caseToSql } from \"./case.ts\";\nimport { coalesceNullable, coalesceToSql } from \"./coalesce.ts\";\nimport { chooseExpressionCodec } from \"./codecs.ts\";\nimport { greatestNullable, greatestToSql } from \"./greatest.ts\";\nimport { leastNullable, leastToSql } from \"./least.ts\";\nimport { nullIfNullable, nullIfToSql } from \"./nullIf.ts\";\nimport { parseExpressionInput } from \"./parseExpression.ts\";\nimport type { CheckInput, ExprFromInput, ExprInput, ParsedExpression, ResultCodec } from \"./types.ts\";\n\nexport type { CaseElse, CaseWhen } from \"./case.ts\";\nexport type { CheckInput, ExprFromInput, ExprInput, ExpressionSources, ExpressionValue } from \"./types.ts\";\n\n/** Builds a reusable SQL value expression, binding literal values as parameters. */\nexport function expr<const I extends ExprInput>(input: I & CheckInput<NoInfer<I>>): ExprFromInput<I> {\n return buildExpr(input) as unknown as ExprFromInput<I>;\n}\n\n/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */\nexport function buildExpr(input: unknown): BaseExpr {\n return new ObjectExpr(parseExpressionInput(input));\n}\n\n/** Exposes a ParsedExpression through the Expr methods, SQL rendering, and shared result codec. */\nclass ObjectExpr extends BaseExpr {\n private readonly codec: ResultCodec;\n\n constructor(private readonly parsed: ParsedExpression) {\n super();\n this.codec = chooseExpressionCodec(parsed);\n }\n\n get outputType(): TypeInfo | undefined {\n return this.codec.outputType;\n }\n\n get sqlNullable(): boolean | undefined {\n return expressionNullable(this.parsed);\n }\n\n toSql(ctx: ExprContext): SqlFragment {\n return expressionToSql(this.parsed, ctx, this.codec);\n }\n\n decode(value: unknown): unknown {\n return value == null ? value : this.codec.decode(value);\n }\n\n encode(value: unknown): unknown {\n return value == null ? value : this.codec.encode(value);\n }\n}\n\n/**\n * Reports nullability from the fields of each parsed expression kind.\n * A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.\n */\nexport function expressionNullable(parsed: ParsedExpression): boolean | undefined {\n if (parsed instanceof BaseExpr) return parsed.sqlSource ? undefined : parsed.sqlNullable;\n switch (parsed.kind) {\n case \"literal\":\n return parsed.value === null;\n case \"nullIf\":\n return nullIfNullable();\n case \"coalesce\":\n return coalesceNullable(parsed);\n case \"greatest\":\n return greatestNullable(parsed);\n case \"least\":\n return leastNullable(parsed);\n case \"case\":\n return caseNullable(parsed);\n default:\n return assertNever(parsed);\n }\n}\n\n/**\n * Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.\n * An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.\n */\nexport function expressionToSql(parsed: ParsedExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n if (parsed instanceof BaseExpr) return parsed.toSql(ctx);\n switch (parsed.kind) {\n case \"literal\": {\n const dbType = codec.outputType?.dbType;\n return {\n sql: dbType ? `?::${dbType}` : \"?\",\n bindings: [parsed.value === null ? null : codec.encode(parsed.value)],\n refs: [],\n };\n }\n case \"coalesce\":\n return coalesceToSql(parsed, ctx, codec);\n case \"nullIf\":\n return nullIfToSql(parsed, ctx, codec);\n case \"greatest\":\n return greatestToSql(parsed, ctx, codec);\n case \"least\":\n return leastToSql(parsed, ctx, codec);\n case \"case\":\n return caseToSql(parsed, ctx, codec);\n default:\n return assertNever(parsed);\n }\n}\n\n/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */\nexport function functionToSql(\n name: string,\n args: readonly ParsedExpression[],\n ctx: ExprContext,\n codec: ResultCodec,\n): SqlFragment {\n const parts = joinFragments(\n args.map((arg) => expressionToSql(arg, ctx, codec)),\n \", \",\n );\n return { ...parts, sql: `${name}(${parts.sql})` };\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,SAAgB,KAAgC,OAAqD;CACnG,OAAO,UAAU,KAAK;AACxB;;AAGA,SAAgB,UAAU,OAA0B;CAClD,OAAO,IAAI,WAAWA,oCAAAA,qBAAqB,KAAK,CAAC;AACnD;;AAGA,IAAM,aAAN,cAAyBC,aAAAA,SAAS;CAGH;CAF7B;CAEA,YAAY,QAA2C;EACrD,MAAM;EADqB,KAAA,SAAA;EAE3B,KAAK,QAAQC,2BAAAA,sBAAsB,MAAM;CAC3C;CAEA,IAAI,aAAmC;EACrC,OAAO,KAAK,MAAM;CACpB;CAEA,IAAI,cAAmC;EACrC,OAAO,mBAAmB,KAAK,MAAM;CACvC;CAEA,MAAM,KAA+B;EACnC,OAAO,gBAAgB,KAAK,QAAQ,KAAK,KAAK,KAAK;CACrD;CAEA,OAAO,OAAyB;EAC9B,OAAO,SAAS,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK;CACxD;CAEA,OAAO,OAAyB;EAC9B,OAAO,SAAS,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK;CACxD;AACF;;;;;AAMA,SAAgB,mBAAmB,QAA+C;CAChF,IAAI,kBAAkBD,aAAAA,UAAU,OAAO,OAAO,YAAY,KAAA,IAAY,OAAO;CAC7E,QAAQ,OAAO,MAAf;EACE,KAAK,WACH,OAAO,OAAO,UAAU;EAC1B,KAAK,UACH,OAAOE,2BAAAA,eAAe;EACxB,KAAK,YACH,OAAOC,6BAAAA,iBAAiB,MAAM;EAChC,KAAK,YACH,OAAOC,6BAAAA,iBAAiB,MAAM;EAChC,KAAK,SACH,OAAOC,0BAAAA,cAAc,MAAM;EAC7B,KAAK,QACH,OAAOC,yBAAAA,aAAa,MAAM;EAC5B,SACE,OAAOC,cAAAA,YAAY,MAAM;CAC7B;AACF;;;;;AAMA,SAAgB,gBAAgB,QAA0B,KAAkB,OAAiC;CAC3G,IAAI,kBAAkBP,aAAAA,UAAU,OAAO,OAAO,MAAM,GAAG;CACvD,QAAQ,OAAO,MAAf;EACE,KAAK,WAAW;GACd,MAAM,SAAS,MAAM,YAAY;GACjC,OAAO;IACL,KAAK,SAAS,MAAM,WAAW;IAC/B,UAAU,CAAC,OAAO,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC;IACpE,MAAM,CAAC;GACT;EACF;EACA,KAAK,YACH,OAAOQ,6BAAAA,cAAc,QAAQ,KAAK,KAAK;EACzC,KAAK,UACH,OAAOC,2BAAAA,YAAY,QAAQ,KAAK,KAAK;EACvC,KAAK,YACH,OAAOC,6BAAAA,cAAc,QAAQ,KAAK,KAAK;EACzC,KAAK,SACH,OAAOC,0BAAAA,WAAW,QAAQ,KAAK,KAAK;EACtC,KAAK,QACH,OAAOC,yBAAAA,UAAU,QAAQ,KAAK,KAAK;EACrC,SACE,OAAOL,cAAAA,YAAY,MAAM;CAC7B;AACF;;AAGA,SAAgB,cACd,MACA,MACA,KACA,OACa;CACb,MAAM,QAAQM,aAAAA,cACZ,KAAK,KAAK,QAAQ,gBAAgB,KAAK,KAAK,KAAK,CAAC,GAClD,IACF;CACA,OAAO;EAAE,GAAG;EAAO,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI;CAAG;AAClD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CaseElse, CaseWhen } from "./case.cjs";
|
|
2
|
+
import { CheckInput, ExprFromInput, ExprInput, ExpressionSources, ExpressionValue, ParsedExpression, ResultCodec } from "./types.cjs";
|
|
3
|
+
import { BaseExpr, ExprContext, SqlFragment } from "../Expr.cjs";
|
|
4
|
+
//#region src/expressions/expression.d.ts
|
|
5
|
+
/** Builds a reusable SQL value expression, binding literal values as parameters. */
|
|
6
|
+
declare function expr<const I extends ExprInput>(input: I & CheckInput<NoInfer<I>>): ExprFromInput<I>;
|
|
7
|
+
/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */
|
|
8
|
+
declare function buildExpr(input: unknown): BaseExpr;
|
|
9
|
+
/**
|
|
10
|
+
* Reports nullability from the fields of each parsed expression kind.
|
|
11
|
+
* A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.
|
|
12
|
+
*/
|
|
13
|
+
declare function expressionNullable(parsed: ParsedExpression): boolean | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.
|
|
16
|
+
* An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.
|
|
17
|
+
*/
|
|
18
|
+
declare function expressionToSql(parsed: ParsedExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
19
|
+
/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */
|
|
20
|
+
declare function functionToSql(name: string, args: readonly ParsedExpression[], ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { type CaseElse, type CaseWhen, type CheckInput, type ExprFromInput, type ExprInput, type ExpressionSources, type ExpressionValue, buildExpr, expr, expressionNullable, expressionToSql, functionToSql };
|
|
23
|
+
//# sourceMappingURL=expression.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.d.cts","names":[],"sources":["../../src/expressions/expression.ts"],"mappings":";;;;;iBAgBgB,WAAW,UAAU,WAAW,OAAO,IAAI,WAAW,QAAQ,MAAM,cAAc;;iBAKlF,UAAU,iBAAiB;;;;;iBAsC3B,mBAAmB,QAAQ;;;;;iBAwB3B,gBAAgB,QAAQ,kBAAkB,KAAK,aAAa,OAAO,cAAc;;iBA2BjF,cACd,cACA,eAAe,oBACf,KAAK,aACL,OAAO,cACN"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CaseElse, CaseWhen } from "./case.mjs";
|
|
2
|
+
import { CheckInput, ExprFromInput, ExprInput, ExpressionSources, ExpressionValue, ParsedExpression, ResultCodec } from "./types.mjs";
|
|
3
|
+
import { BaseExpr, ExprContext, SqlFragment } from "../Expr.mjs";
|
|
4
|
+
//#region src/expressions/expression.d.ts
|
|
5
|
+
/** Builds a reusable SQL value expression, binding literal values as parameters. */
|
|
6
|
+
declare function expr<const I extends ExprInput>(input: I & CheckInput<NoInfer<I>>): ExprFromInput<I>;
|
|
7
|
+
/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */
|
|
8
|
+
declare function buildExpr(input: unknown): BaseExpr;
|
|
9
|
+
/**
|
|
10
|
+
* Reports nullability from the fields of each parsed expression kind.
|
|
11
|
+
* A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.
|
|
12
|
+
*/
|
|
13
|
+
declare function expressionNullable(parsed: ParsedExpression): boolean | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.
|
|
16
|
+
* An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.
|
|
17
|
+
*/
|
|
18
|
+
declare function expressionToSql(parsed: ParsedExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
19
|
+
/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */
|
|
20
|
+
declare function functionToSql(name: string, args: readonly ParsedExpression[], ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { type CaseElse, type CaseWhen, type CheckInput, type ExprFromInput, type ExprInput, type ExpressionSources, type ExpressionValue, buildExpr, expr, expressionNullable, expressionToSql, functionToSql };
|
|
23
|
+
//# sourceMappingURL=expression.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.d.mts","names":[],"sources":["../../src/expressions/expression.ts"],"mappings":";;;;;iBAgBgB,WAAW,UAAU,WAAW,OAAO,IAAI,WAAW,QAAQ,MAAM,cAAc;;iBAKlF,UAAU,iBAAiB;;;;;iBAsC3B,mBAAmB,QAAQ;;;;;iBAwB3B,gBAAgB,QAAQ,kBAAkB,KAAK,aAAa,OAAO,cAAc;;iBA2BjF,cACd,cACA,eAAe,oBACf,KAAK,aACL,OAAO,cACN"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { assertNever } from "../utils.js";
|
|
2
|
+
import { BaseExpr, joinFragments } from "../Expr.js";
|
|
3
|
+
import { coalesceNullable, coalesceToSql } from "./coalesce.js";
|
|
4
|
+
import { greatestNullable, greatestToSql } from "./greatest.js";
|
|
5
|
+
import { leastNullable, leastToSql } from "./least.js";
|
|
6
|
+
import { nullIfNullable, nullIfToSql } from "./nullIf.js";
|
|
7
|
+
import { parseExpressionInput } from "./parseExpression.js";
|
|
8
|
+
import { caseNullable, caseToSql } from "./case.js";
|
|
9
|
+
import { chooseExpressionCodec } from "./codecs.js";
|
|
10
|
+
//#region src/expressions/expression.ts
|
|
11
|
+
/** Builds a reusable SQL value expression, binding literal values as parameters. */
|
|
12
|
+
function expr(input) {
|
|
13
|
+
return buildExpr(input);
|
|
14
|
+
}
|
|
15
|
+
/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */
|
|
16
|
+
function buildExpr(input) {
|
|
17
|
+
return new ObjectExpr(parseExpressionInput(input));
|
|
18
|
+
}
|
|
19
|
+
/** Exposes a ParsedExpression through the Expr methods, SQL rendering, and shared result codec. */
|
|
20
|
+
var ObjectExpr = class extends BaseExpr {
|
|
21
|
+
parsed;
|
|
22
|
+
codec;
|
|
23
|
+
constructor(parsed) {
|
|
24
|
+
super();
|
|
25
|
+
this.parsed = parsed;
|
|
26
|
+
this.codec = chooseExpressionCodec(parsed);
|
|
27
|
+
}
|
|
28
|
+
get outputType() {
|
|
29
|
+
return this.codec.outputType;
|
|
30
|
+
}
|
|
31
|
+
get sqlNullable() {
|
|
32
|
+
return expressionNullable(this.parsed);
|
|
33
|
+
}
|
|
34
|
+
toSql(ctx) {
|
|
35
|
+
return expressionToSql(this.parsed, ctx, this.codec);
|
|
36
|
+
}
|
|
37
|
+
decode(value) {
|
|
38
|
+
return value == null ? value : this.codec.decode(value);
|
|
39
|
+
}
|
|
40
|
+
encode(value) {
|
|
41
|
+
return value == null ? value : this.codec.encode(value);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Reports nullability from the fields of each parsed expression kind.
|
|
46
|
+
* A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.
|
|
47
|
+
*/
|
|
48
|
+
function expressionNullable(parsed) {
|
|
49
|
+
if (parsed instanceof BaseExpr) return parsed.sqlSource ? void 0 : parsed.sqlNullable;
|
|
50
|
+
switch (parsed.kind) {
|
|
51
|
+
case "literal": return parsed.value === null;
|
|
52
|
+
case "nullIf": return nullIfNullable();
|
|
53
|
+
case "coalesce": return coalesceNullable(parsed);
|
|
54
|
+
case "greatest": return greatestNullable(parsed);
|
|
55
|
+
case "least": return leastNullable(parsed);
|
|
56
|
+
case "case": return caseNullable(parsed);
|
|
57
|
+
default: return assertNever(parsed);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.
|
|
62
|
+
* An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.
|
|
63
|
+
*/
|
|
64
|
+
function expressionToSql(parsed, ctx, codec) {
|
|
65
|
+
if (parsed instanceof BaseExpr) return parsed.toSql(ctx);
|
|
66
|
+
switch (parsed.kind) {
|
|
67
|
+
case "literal": {
|
|
68
|
+
const dbType = codec.outputType?.dbType;
|
|
69
|
+
return {
|
|
70
|
+
sql: dbType ? `?::${dbType}` : "?",
|
|
71
|
+
bindings: [parsed.value === null ? null : codec.encode(parsed.value)],
|
|
72
|
+
refs: []
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
case "coalesce": return coalesceToSql(parsed, ctx, codec);
|
|
76
|
+
case "nullIf": return nullIfToSql(parsed, ctx, codec);
|
|
77
|
+
case "greatest": return greatestToSql(parsed, ctx, codec);
|
|
78
|
+
case "least": return leastToSql(parsed, ctx, codec);
|
|
79
|
+
case "case": return caseToSql(parsed, ctx, codec);
|
|
80
|
+
default: return assertNever(parsed);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */
|
|
84
|
+
function functionToSql(name, args, ctx, codec) {
|
|
85
|
+
const parts = joinFragments(args.map((arg) => expressionToSql(arg, ctx, codec)), ", ");
|
|
86
|
+
return {
|
|
87
|
+
...parts,
|
|
88
|
+
sql: `${name}(${parts.sql})`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { buildExpr, expr, expressionNullable, expressionToSql, functionToSql };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.js","names":[],"sources":["../../src/expressions/expression.ts"],"sourcesContent":["import { BaseExpr, type ExprContext, type SqlFragment, joinFragments } from \"../Expr.ts\";\nimport type { TypeInfo } from \"../TypeInfo.ts\";\nimport { assertNever } from \"../utils.ts\";\nimport { caseNullable, caseToSql } from \"./case.ts\";\nimport { coalesceNullable, coalesceToSql } from \"./coalesce.ts\";\nimport { chooseExpressionCodec } from \"./codecs.ts\";\nimport { greatestNullable, greatestToSql } from \"./greatest.ts\";\nimport { leastNullable, leastToSql } from \"./least.ts\";\nimport { nullIfNullable, nullIfToSql } from \"./nullIf.ts\";\nimport { parseExpressionInput } from \"./parseExpression.ts\";\nimport type { CheckInput, ExprFromInput, ExprInput, ParsedExpression, ResultCodec } from \"./types.ts\";\n\nexport type { CaseElse, CaseWhen } from \"./case.ts\";\nexport type { CheckInput, ExprFromInput, ExprInput, ExpressionSources, ExpressionValue } from \"./types.ts\";\n\n/** Builds a reusable SQL value expression, binding literal values as parameters. */\nexport function expr<const I extends ExprInput>(input: I & CheckInput<NoInfer<I>>): ExprFromInput<I> {\n return buildExpr(input) as unknown as ExprFromInput<I>;\n}\n\n/** Parses explicit and inline inputs into a ParsedExpression, then wraps it in an Expr with a result codec. */\nexport function buildExpr(input: unknown): BaseExpr {\n return new ObjectExpr(parseExpressionInput(input));\n}\n\n/** Exposes a ParsedExpression through the Expr methods, SQL rendering, and shared result codec. */\nclass ObjectExpr extends BaseExpr {\n private readonly codec: ResultCodec;\n\n constructor(private readonly parsed: ParsedExpression) {\n super();\n this.codec = chooseExpressionCodec(parsed);\n }\n\n get outputType(): TypeInfo | undefined {\n return this.codec.outputType;\n }\n\n get sqlNullable(): boolean | undefined {\n return expressionNullable(this.parsed);\n }\n\n toSql(ctx: ExprContext): SqlFragment {\n return expressionToSql(this.parsed, ctx, this.codec);\n }\n\n decode(value: unknown): unknown {\n return value == null ? value : this.codec.decode(value);\n }\n\n encode(value: unknown): unknown {\n return value == null ? value : this.codec.encode(value);\n }\n}\n\n/**\n * Reports nullability from the fields of each parsed expression kind.\n * A direct column can become null through a LEFT join, so only independent values prove NOT NULL here.\n */\nexport function expressionNullable(parsed: ParsedExpression): boolean | undefined {\n if (parsed instanceof BaseExpr) return parsed.sqlSource ? undefined : parsed.sqlNullable;\n switch (parsed.kind) {\n case \"literal\":\n return parsed.value === null;\n case \"nullIf\":\n return nullIfNullable();\n case \"coalesce\":\n return coalesceNullable(parsed);\n case \"greatest\":\n return greatestNullable(parsed);\n case \"least\":\n return leastNullable(parsed);\n case \"case\":\n return caseNullable(parsed);\n default:\n return assertNever(parsed);\n }\n}\n\n/**\n * Renders a ParsedExpression in SQL binding order, resolving CASE conditions and collecting references for join pruning.\n * An omitted CASE condition removes its value as well. I.e. an unused Book.title branch must not keep the Book join.\n */\nexport function expressionToSql(parsed: ParsedExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n if (parsed instanceof BaseExpr) return parsed.toSql(ctx);\n switch (parsed.kind) {\n case \"literal\": {\n const dbType = codec.outputType?.dbType;\n return {\n sql: dbType ? `?::${dbType}` : \"?\",\n bindings: [parsed.value === null ? null : codec.encode(parsed.value)],\n refs: [],\n };\n }\n case \"coalesce\":\n return coalesceToSql(parsed, ctx, codec);\n case \"nullIf\":\n return nullIfToSql(parsed, ctx, codec);\n case \"greatest\":\n return greatestToSql(parsed, ctx, codec);\n case \"least\":\n return leastToSql(parsed, ctx, codec);\n case \"case\":\n return caseToSql(parsed, ctx, codec);\n default:\n return assertNever(parsed);\n }\n}\n\n/** Renders a function call after its parsed kind has supplied the arguments in SQL order. */\nexport function functionToSql(\n name: string,\n args: readonly ParsedExpression[],\n ctx: ExprContext,\n codec: ResultCodec,\n): SqlFragment {\n const parts = joinFragments(\n args.map((arg) => expressionToSql(arg, ctx, codec)),\n \", \",\n );\n return { ...parts, sql: `${name}(${parts.sql})` };\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgB,KAAgC,OAAqD;CACnG,OAAO,UAAU,KAAK;AACxB;;AAGA,SAAgB,UAAU,OAA0B;CAClD,OAAO,IAAI,WAAW,qBAAqB,KAAK,CAAC;AACnD;;AAGA,IAAM,aAAN,cAAyB,SAAS;CAGH;CAF7B;CAEA,YAAY,QAA2C;EACrD,MAAM;EADqB,KAAA,SAAA;EAE3B,KAAK,QAAQ,sBAAsB,MAAM;CAC3C;CAEA,IAAI,aAAmC;EACrC,OAAO,KAAK,MAAM;CACpB;CAEA,IAAI,cAAmC;EACrC,OAAO,mBAAmB,KAAK,MAAM;CACvC;CAEA,MAAM,KAA+B;EACnC,OAAO,gBAAgB,KAAK,QAAQ,KAAK,KAAK,KAAK;CACrD;CAEA,OAAO,OAAyB;EAC9B,OAAO,SAAS,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK;CACxD;CAEA,OAAO,OAAyB;EAC9B,OAAO,SAAS,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK;CACxD;AACF;;;;;AAMA,SAAgB,mBAAmB,QAA+C;CAChF,IAAI,kBAAkB,UAAU,OAAO,OAAO,YAAY,KAAA,IAAY,OAAO;CAC7E,QAAQ,OAAO,MAAf;EACE,KAAK,WACH,OAAO,OAAO,UAAU;EAC1B,KAAK,UACH,OAAO,eAAe;EACxB,KAAK,YACH,OAAO,iBAAiB,MAAM;EAChC,KAAK,YACH,OAAO,iBAAiB,MAAM;EAChC,KAAK,SACH,OAAO,cAAc,MAAM;EAC7B,KAAK,QACH,OAAO,aAAa,MAAM;EAC5B,SACE,OAAO,YAAY,MAAM;CAC7B;AACF;;;;;AAMA,SAAgB,gBAAgB,QAA0B,KAAkB,OAAiC;CAC3G,IAAI,kBAAkB,UAAU,OAAO,OAAO,MAAM,GAAG;CACvD,QAAQ,OAAO,MAAf;EACE,KAAK,WAAW;GACd,MAAM,SAAS,MAAM,YAAY;GACjC,OAAO;IACL,KAAK,SAAS,MAAM,WAAW;IAC/B,UAAU,CAAC,OAAO,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC;IACpE,MAAM,CAAC;GACT;EACF;EACA,KAAK,YACH,OAAO,cAAc,QAAQ,KAAK,KAAK;EACzC,KAAK,UACH,OAAO,YAAY,QAAQ,KAAK,KAAK;EACvC,KAAK,YACH,OAAO,cAAc,QAAQ,KAAK,KAAK;EACzC,KAAK,SACH,OAAO,WAAW,QAAQ,KAAK,KAAK;EACtC,KAAK,QACH,OAAO,UAAU,QAAQ,KAAK,KAAK;EACrC,SACE,OAAO,YAAY,MAAM;CAC7B;AACF;;AAGA,SAAgB,cACd,MACA,MACA,KACA,OACa;CACb,MAAM,QAAQ,cACZ,KAAK,KAAK,QAAQ,gBAAgB,KAAK,KAAK,KAAK,CAAC,GAClD,IACF;CACA,OAAO;EAAE,GAAG;EAAO,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI;CAAG;AAClD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_expressions_parseExpression = require("./parseExpression.cjs");
|
|
3
|
+
const require_expressions_expression = require("./expression.cjs");
|
|
4
|
+
//#region src/expressions/greatest.ts
|
|
5
|
+
/** Parses GREATEST values and requires at least one operand. */
|
|
6
|
+
function parseGreatestExpression(input) {
|
|
7
|
+
return {
|
|
8
|
+
kind: "greatest",
|
|
9
|
+
values: require_expressions_parseExpression.parseNonEmptyOperands(input, "GREATEST")
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Renders the values compared by GREATEST. */
|
|
13
|
+
function greatestToSql(parsed, ctx, codec) {
|
|
14
|
+
return require_expressions_expression.functionToSql("GREATEST", parsed.values, ctx, codec);
|
|
15
|
+
}
|
|
16
|
+
/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
17
|
+
function greatestNullable(parsed) {
|
|
18
|
+
return parsed.values.some((value) => require_expressions_expression.expressionNullable(value) === false) ? false : void 0;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.greatestNullable = greatestNullable;
|
|
22
|
+
exports.greatestToSql = greatestToSql;
|
|
23
|
+
exports.parseGreatestExpression = parseGreatestExpression;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=greatest.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greatest.cjs","names":["parseNonEmptyOperands","functionToSql","expressionNullable"],"sources":["../../src/expressions/greatest.ts"],"sourcesContent":["import type { ExprContext, SqlFragment } from \"../Expr.ts\";\nimport { expressionNullable, functionToSql } from \"./expression.ts\";\nimport { parseNonEmptyOperands } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** Values whose largest non-null member is selected by PostgreSQL. */\nexport interface GreatestInput {\n readonly greatest: readonly unknown[];\n}\n\n/** A GREATEST comparison with at least one value. */\nexport interface ParsedGreatestExpression {\n kind: \"greatest\";\n values: [ParsedExpression, ...ParsedExpression[]];\n}\n\n/** Parses GREATEST values and requires at least one operand. */\nexport function parseGreatestExpression(input: unknown): ParsedGreatestExpression {\n return { kind: \"greatest\", values: parseNonEmptyOperands(input, \"GREATEST\") };\n}\n\n/** Renders the values compared by GREATEST. */\nexport function greatestToSql(parsed: ParsedGreatestExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n return functionToSql(\"GREATEST\", parsed.values, ctx, codec);\n}\n\n/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */\nexport function greatestNullable(parsed: ParsedGreatestExpression): boolean | undefined {\n return parsed.values.some((value) => expressionNullable(value) === false) ? false : undefined;\n}\n"],"mappings":";;;;;AAiBA,SAAgB,wBAAwB,OAA0C;CAChF,OAAO;EAAE,MAAM;EAAY,QAAQA,oCAAAA,sBAAsB,OAAO,UAAU;CAAE;AAC9E;;AAGA,SAAgB,cAAc,QAAkC,KAAkB,OAAiC;CACjH,OAAOC,+BAAAA,cAAc,YAAY,OAAO,QAAQ,KAAK,KAAK;AAC5D;;AAGA,SAAgB,iBAAiB,QAAuD;CACtF,OAAO,OAAO,OAAO,MAAM,UAAUC,+BAAAA,mBAAmB,KAAK,MAAM,KAAK,IAAI,QAAQ,KAAA;AACtF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.cjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.cjs";
|
|
3
|
+
//#region src/expressions/greatest.d.ts
|
|
4
|
+
/** Values whose largest non-null member is selected by PostgreSQL. */
|
|
5
|
+
interface GreatestInput {
|
|
6
|
+
readonly greatest: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** A GREATEST comparison with at least one value. */
|
|
9
|
+
interface ParsedGreatestExpression {
|
|
10
|
+
kind: "greatest";
|
|
11
|
+
values: [ParsedExpression, ...ParsedExpression[]];
|
|
12
|
+
}
|
|
13
|
+
/** Parses GREATEST values and requires at least one operand. */
|
|
14
|
+
declare function parseGreatestExpression(input: unknown): ParsedGreatestExpression;
|
|
15
|
+
/** Renders the values compared by GREATEST. */
|
|
16
|
+
declare function greatestToSql(parsed: ParsedGreatestExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
17
|
+
/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
18
|
+
declare function greatestNullable(parsed: ParsedGreatestExpression): boolean | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { GreatestInput, ParsedGreatestExpression, greatestNullable, greatestToSql, parseGreatestExpression };
|
|
21
|
+
//# sourceMappingURL=greatest.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greatest.d.cts","names":[],"sources":["../../src/expressions/greatest.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,SAAS,qBAAqB;;;iBAIhB,wBAAwB,iBAAiB;;iBAKzC,cAAc,QAAQ,0BAA0B,KAAK,aAAa,OAAO,cAAc;;iBAKvF,iBAAiB,QAAQ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.mjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.mjs";
|
|
3
|
+
//#region src/expressions/greatest.d.ts
|
|
4
|
+
/** Values whose largest non-null member is selected by PostgreSQL. */
|
|
5
|
+
interface GreatestInput {
|
|
6
|
+
readonly greatest: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** A GREATEST comparison with at least one value. */
|
|
9
|
+
interface ParsedGreatestExpression {
|
|
10
|
+
kind: "greatest";
|
|
11
|
+
values: [ParsedExpression, ...ParsedExpression[]];
|
|
12
|
+
}
|
|
13
|
+
/** Parses GREATEST values and requires at least one operand. */
|
|
14
|
+
declare function parseGreatestExpression(input: unknown): ParsedGreatestExpression;
|
|
15
|
+
/** Renders the values compared by GREATEST. */
|
|
16
|
+
declare function greatestToSql(parsed: ParsedGreatestExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
17
|
+
/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
18
|
+
declare function greatestNullable(parsed: ParsedGreatestExpression): boolean | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { GreatestInput, ParsedGreatestExpression, greatestNullable, greatestToSql, parseGreatestExpression };
|
|
21
|
+
//# sourceMappingURL=greatest.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greatest.d.mts","names":[],"sources":["../../src/expressions/greatest.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,SAAS,qBAAqB;;;iBAIhB,wBAAwB,iBAAiB;;iBAKzC,cAAc,QAAQ,0BAA0B,KAAK,aAAa,OAAO,cAAc;;iBAKvF,iBAAiB,QAAQ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseNonEmptyOperands } from "./parseExpression.js";
|
|
2
|
+
import { expressionNullable, functionToSql } from "./expression.js";
|
|
3
|
+
//#region src/expressions/greatest.ts
|
|
4
|
+
/** Parses GREATEST values and requires at least one operand. */
|
|
5
|
+
function parseGreatestExpression(input) {
|
|
6
|
+
return {
|
|
7
|
+
kind: "greatest",
|
|
8
|
+
values: parseNonEmptyOperands(input, "GREATEST")
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Renders the values compared by GREATEST. */
|
|
12
|
+
function greatestToSql(parsed, ctx, codec) {
|
|
13
|
+
return functionToSql("GREATEST", parsed.values, ctx, codec);
|
|
14
|
+
}
|
|
15
|
+
/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
16
|
+
function greatestNullable(parsed) {
|
|
17
|
+
return parsed.values.some((value) => expressionNullable(value) === false) ? false : void 0;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { greatestNullable, greatestToSql, parseGreatestExpression };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=greatest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greatest.js","names":[],"sources":["../../src/expressions/greatest.ts"],"sourcesContent":["import type { ExprContext, SqlFragment } from \"../Expr.ts\";\nimport { expressionNullable, functionToSql } from \"./expression.ts\";\nimport { parseNonEmptyOperands } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** Values whose largest non-null member is selected by PostgreSQL. */\nexport interface GreatestInput {\n readonly greatest: readonly unknown[];\n}\n\n/** A GREATEST comparison with at least one value. */\nexport interface ParsedGreatestExpression {\n kind: \"greatest\";\n values: [ParsedExpression, ...ParsedExpression[]];\n}\n\n/** Parses GREATEST values and requires at least one operand. */\nexport function parseGreatestExpression(input: unknown): ParsedGreatestExpression {\n return { kind: \"greatest\", values: parseNonEmptyOperands(input, \"GREATEST\") };\n}\n\n/** Renders the values compared by GREATEST. */\nexport function greatestToSql(parsed: ParsedGreatestExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n return functionToSql(\"GREATEST\", parsed.values, ctx, codec);\n}\n\n/** GREATEST ignores nulls, so one non-null value guarantees a non-null result. */\nexport function greatestNullable(parsed: ParsedGreatestExpression): boolean | undefined {\n return parsed.values.some((value) => expressionNullable(value) === false) ? false : undefined;\n}\n"],"mappings":";;;;AAiBA,SAAgB,wBAAwB,OAA0C;CAChF,OAAO;EAAE,MAAM;EAAY,QAAQ,sBAAsB,OAAO,UAAU;CAAE;AAC9E;;AAGA,SAAgB,cAAc,QAAkC,KAAkB,OAAiC;CACjH,OAAO,cAAc,YAAY,OAAO,QAAQ,KAAK,KAAK;AAC5D;;AAGA,SAAgB,iBAAiB,QAAuD;CACtF,OAAO,OAAO,OAAO,MAAM,UAAU,mBAAmB,KAAK,MAAM,KAAK,IAAI,QAAQ,KAAA;AACtF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_expressions_parseExpression = require("./parseExpression.cjs");
|
|
3
|
+
const require_expressions_expression = require("./expression.cjs");
|
|
4
|
+
//#region src/expressions/least.ts
|
|
5
|
+
/** Parses LEAST values and requires at least one operand. */
|
|
6
|
+
function parseLeastExpression(input) {
|
|
7
|
+
return {
|
|
8
|
+
kind: "least",
|
|
9
|
+
values: require_expressions_parseExpression.parseNonEmptyOperands(input, "LEAST")
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Renders the values compared by LEAST. */
|
|
13
|
+
function leastToSql(parsed, ctx, codec) {
|
|
14
|
+
return require_expressions_expression.functionToSql("LEAST", parsed.values, ctx, codec);
|
|
15
|
+
}
|
|
16
|
+
/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
17
|
+
function leastNullable(parsed) {
|
|
18
|
+
return parsed.values.some((value) => require_expressions_expression.expressionNullable(value) === false) ? false : void 0;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.leastNullable = leastNullable;
|
|
22
|
+
exports.leastToSql = leastToSql;
|
|
23
|
+
exports.parseLeastExpression = parseLeastExpression;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=least.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"least.cjs","names":["parseNonEmptyOperands","functionToSql","expressionNullable"],"sources":["../../src/expressions/least.ts"],"sourcesContent":["import type { ExprContext, SqlFragment } from \"../Expr.ts\";\nimport { expressionNullable, functionToSql } from \"./expression.ts\";\nimport { parseNonEmptyOperands } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** Values whose smallest non-null member is selected by PostgreSQL. */\nexport interface LeastInput {\n readonly least: readonly unknown[];\n}\n\n/** A LEAST comparison with at least one value. */\nexport interface ParsedLeastExpression {\n kind: \"least\";\n values: [ParsedExpression, ...ParsedExpression[]];\n}\n\n/** Parses LEAST values and requires at least one operand. */\nexport function parseLeastExpression(input: unknown): ParsedLeastExpression {\n return { kind: \"least\", values: parseNonEmptyOperands(input, \"LEAST\") };\n}\n\n/** Renders the values compared by LEAST. */\nexport function leastToSql(parsed: ParsedLeastExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n return functionToSql(\"LEAST\", parsed.values, ctx, codec);\n}\n\n/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */\nexport function leastNullable(parsed: ParsedLeastExpression): boolean | undefined {\n return parsed.values.some((value) => expressionNullable(value) === false) ? false : undefined;\n}\n"],"mappings":";;;;;AAiBA,SAAgB,qBAAqB,OAAuC;CAC1E,OAAO;EAAE,MAAM;EAAS,QAAQA,oCAAAA,sBAAsB,OAAO,OAAO;CAAE;AACxE;;AAGA,SAAgB,WAAW,QAA+B,KAAkB,OAAiC;CAC3G,OAAOC,+BAAAA,cAAc,SAAS,OAAO,QAAQ,KAAK,KAAK;AACzD;;AAGA,SAAgB,cAAc,QAAoD;CAChF,OAAO,OAAO,OAAO,MAAM,UAAUC,+BAAAA,mBAAmB,KAAK,MAAM,KAAK,IAAI,QAAQ,KAAA;AACtF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.cjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.cjs";
|
|
3
|
+
//#region src/expressions/least.d.ts
|
|
4
|
+
/** Values whose smallest non-null member is selected by PostgreSQL. */
|
|
5
|
+
interface LeastInput {
|
|
6
|
+
readonly least: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** A LEAST comparison with at least one value. */
|
|
9
|
+
interface ParsedLeastExpression {
|
|
10
|
+
kind: "least";
|
|
11
|
+
values: [ParsedExpression, ...ParsedExpression[]];
|
|
12
|
+
}
|
|
13
|
+
/** Parses LEAST values and requires at least one operand. */
|
|
14
|
+
declare function parseLeastExpression(input: unknown): ParsedLeastExpression;
|
|
15
|
+
/** Renders the values compared by LEAST. */
|
|
16
|
+
declare function leastToSql(parsed: ParsedLeastExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
17
|
+
/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
18
|
+
declare function leastNullable(parsed: ParsedLeastExpression): boolean | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { LeastInput, ParsedLeastExpression, leastNullable, leastToSql, parseLeastExpression };
|
|
21
|
+
//# sourceMappingURL=least.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"least.d.cts","names":[],"sources":["../../src/expressions/least.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,SAAS,qBAAqB;;;iBAIhB,qBAAqB,iBAAiB;;iBAKtC,WAAW,QAAQ,uBAAuB,KAAK,aAAa,OAAO,cAAc;;iBAKjF,cAAc,QAAQ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.mjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.mjs";
|
|
3
|
+
//#region src/expressions/least.d.ts
|
|
4
|
+
/** Values whose smallest non-null member is selected by PostgreSQL. */
|
|
5
|
+
interface LeastInput {
|
|
6
|
+
readonly least: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** A LEAST comparison with at least one value. */
|
|
9
|
+
interface ParsedLeastExpression {
|
|
10
|
+
kind: "least";
|
|
11
|
+
values: [ParsedExpression, ...ParsedExpression[]];
|
|
12
|
+
}
|
|
13
|
+
/** Parses LEAST values and requires at least one operand. */
|
|
14
|
+
declare function parseLeastExpression(input: unknown): ParsedLeastExpression;
|
|
15
|
+
/** Renders the values compared by LEAST. */
|
|
16
|
+
declare function leastToSql(parsed: ParsedLeastExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
17
|
+
/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
18
|
+
declare function leastNullable(parsed: ParsedLeastExpression): boolean | undefined;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { LeastInput, ParsedLeastExpression, leastNullable, leastToSql, parseLeastExpression };
|
|
21
|
+
//# sourceMappingURL=least.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"least.d.mts","names":[],"sources":["../../src/expressions/least.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,SAAS,qBAAqB;;;iBAIhB,qBAAqB,iBAAiB;;iBAKtC,WAAW,QAAQ,uBAAuB,KAAK,aAAa,OAAO,cAAc;;iBAKjF,cAAc,QAAQ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseNonEmptyOperands } from "./parseExpression.js";
|
|
2
|
+
import { expressionNullable, functionToSql } from "./expression.js";
|
|
3
|
+
//#region src/expressions/least.ts
|
|
4
|
+
/** Parses LEAST values and requires at least one operand. */
|
|
5
|
+
function parseLeastExpression(input) {
|
|
6
|
+
return {
|
|
7
|
+
kind: "least",
|
|
8
|
+
values: parseNonEmptyOperands(input, "LEAST")
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Renders the values compared by LEAST. */
|
|
12
|
+
function leastToSql(parsed, ctx, codec) {
|
|
13
|
+
return functionToSql("LEAST", parsed.values, ctx, codec);
|
|
14
|
+
}
|
|
15
|
+
/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */
|
|
16
|
+
function leastNullable(parsed) {
|
|
17
|
+
return parsed.values.some((value) => expressionNullable(value) === false) ? false : void 0;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { leastNullable, leastToSql, parseLeastExpression };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=least.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"least.js","names":[],"sources":["../../src/expressions/least.ts"],"sourcesContent":["import type { ExprContext, SqlFragment } from \"../Expr.ts\";\nimport { expressionNullable, functionToSql } from \"./expression.ts\";\nimport { parseNonEmptyOperands } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** Values whose smallest non-null member is selected by PostgreSQL. */\nexport interface LeastInput {\n readonly least: readonly unknown[];\n}\n\n/** A LEAST comparison with at least one value. */\nexport interface ParsedLeastExpression {\n kind: \"least\";\n values: [ParsedExpression, ...ParsedExpression[]];\n}\n\n/** Parses LEAST values and requires at least one operand. */\nexport function parseLeastExpression(input: unknown): ParsedLeastExpression {\n return { kind: \"least\", values: parseNonEmptyOperands(input, \"LEAST\") };\n}\n\n/** Renders the values compared by LEAST. */\nexport function leastToSql(parsed: ParsedLeastExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n return functionToSql(\"LEAST\", parsed.values, ctx, codec);\n}\n\n/** LEAST ignores nulls, so one non-null value guarantees a non-null result. */\nexport function leastNullable(parsed: ParsedLeastExpression): boolean | undefined {\n return parsed.values.some((value) => expressionNullable(value) === false) ? false : undefined;\n}\n"],"mappings":";;;;AAiBA,SAAgB,qBAAqB,OAAuC;CAC1E,OAAO;EAAE,MAAM;EAAS,QAAQ,sBAAsB,OAAO,OAAO;CAAE;AACxE;;AAGA,SAAgB,WAAW,QAA+B,KAAkB,OAAiC;CAC3G,OAAO,cAAc,SAAS,OAAO,QAAQ,KAAK,KAAK;AACzD;;AAGA,SAAgB,cAAc,QAAoD;CAChF,OAAO,OAAO,OAAO,MAAM,UAAU,mBAAmB,KAAK,MAAM,KAAK,IAAI,QAAQ,KAAA;AACtF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_expressions_parseExpression = require("./parseExpression.cjs");
|
|
3
|
+
const require_expressions_expression = require("./expression.cjs");
|
|
4
|
+
//#region src/expressions/nullIf.ts
|
|
5
|
+
/** Parses exactly two NULLIF operands into their distinct roles. */
|
|
6
|
+
function parseNullIfExpression(input) {
|
|
7
|
+
if (!Array.isArray(input) || input.length !== 2) throw new Error("NULLIF needs exactly two values");
|
|
8
|
+
return {
|
|
9
|
+
kind: "nullIf",
|
|
10
|
+
value: require_expressions_parseExpression.parseExpression(input[0]),
|
|
11
|
+
equals: require_expressions_parseExpression.parseExpression(input[1])
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Renders the returned value before its equality comparison operand. */
|
|
15
|
+
function nullIfToSql(parsed, ctx, codec) {
|
|
16
|
+
return require_expressions_expression.functionToSql("NULLIF", [parsed.value, parsed.equals], ctx, codec);
|
|
17
|
+
}
|
|
18
|
+
/** NULLIF can return SQL NULL when its operands match. */
|
|
19
|
+
function nullIfNullable() {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.nullIfNullable = nullIfNullable;
|
|
24
|
+
exports.nullIfToSql = nullIfToSql;
|
|
25
|
+
exports.parseNullIfExpression = parseNullIfExpression;
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=nullIf.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullIf.cjs","names":["parseExpression","functionToSql"],"sources":["../../src/expressions/nullIf.ts"],"sourcesContent":["import type { ExprContext, SqlFragment } from \"../Expr.ts\";\nimport { functionToSql } from \"./expression.ts\";\nimport { parseExpression } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** A value and the value it must equal for NULLIF to return SQL NULL. */\nexport interface NullIfInput {\n readonly nullIf: readonly unknown[];\n}\n\n/** NULLIF returns value unless it matches equals. */\nexport interface ParsedNullIfExpression {\n kind: \"nullIf\";\n value: ParsedExpression;\n equals: ParsedExpression;\n}\n\n/** Parses exactly two NULLIF operands into their distinct roles. */\nexport function parseNullIfExpression(input: unknown): ParsedNullIfExpression {\n if (!Array.isArray(input) || input.length !== 2) throw new Error(\"NULLIF needs exactly two values\");\n return { kind: \"nullIf\", value: parseExpression(input[0]), equals: parseExpression(input[1]) };\n}\n\n/** Renders the returned value before its equality comparison operand. */\nexport function nullIfToSql(parsed: ParsedNullIfExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n return functionToSql(\"NULLIF\", [parsed.value, parsed.equals], ctx, codec);\n}\n\n/** NULLIF can return SQL NULL when its operands match. */\nexport function nullIfNullable(): true {\n return true;\n}\n"],"mappings":";;;;;AAkBA,SAAgB,sBAAsB,OAAwC;CAC5E,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,iCAAiC;CAClG,OAAO;EAAE,MAAM;EAAU,OAAOA,oCAAAA,gBAAgB,MAAM,EAAE;EAAG,QAAQA,oCAAAA,gBAAgB,MAAM,EAAE;CAAE;AAC/F;;AAGA,SAAgB,YAAY,QAAgC,KAAkB,OAAiC;CAC7G,OAAOC,+BAAAA,cAAc,UAAU,CAAC,OAAO,OAAO,OAAO,MAAM,GAAG,KAAK,KAAK;AAC1E;;AAGA,SAAgB,iBAAuB;CACrC,OAAO;AACT"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.cjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.cjs";
|
|
3
|
+
//#region src/expressions/nullIf.d.ts
|
|
4
|
+
/** A value and the value it must equal for NULLIF to return SQL NULL. */
|
|
5
|
+
interface NullIfInput {
|
|
6
|
+
readonly nullIf: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** NULLIF returns value unless it matches equals. */
|
|
9
|
+
interface ParsedNullIfExpression {
|
|
10
|
+
kind: "nullIf";
|
|
11
|
+
value: ParsedExpression;
|
|
12
|
+
equals: ParsedExpression;
|
|
13
|
+
}
|
|
14
|
+
/** Parses exactly two NULLIF operands into their distinct roles. */
|
|
15
|
+
declare function parseNullIfExpression(input: unknown): ParsedNullIfExpression;
|
|
16
|
+
/** Renders the returned value before its equality comparison operand. */
|
|
17
|
+
declare function nullIfToSql(parsed: ParsedNullIfExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
18
|
+
/** NULLIF can return SQL NULL when its operands match. */
|
|
19
|
+
declare function nullIfNullable(): true;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { NullIfInput, ParsedNullIfExpression, nullIfNullable, nullIfToSql, parseNullIfExpression };
|
|
22
|
+
//# sourceMappingURL=nullIf.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullIf.d.cts","names":[],"sources":["../../src/expressions/nullIf.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,OAAO;EACP,QAAQ;;;iBAIM,sBAAsB,iBAAiB;;iBAMvC,YAAY,QAAQ,wBAAwB,KAAK,aAAa,OAAO,cAAc;;iBAKnF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ParsedExpression, ResultCodec } from "./types.mjs";
|
|
2
|
+
import { ExprContext, SqlFragment } from "../Expr.mjs";
|
|
3
|
+
//#region src/expressions/nullIf.d.ts
|
|
4
|
+
/** A value and the value it must equal for NULLIF to return SQL NULL. */
|
|
5
|
+
interface NullIfInput {
|
|
6
|
+
readonly nullIf: readonly unknown[];
|
|
7
|
+
}
|
|
8
|
+
/** NULLIF returns value unless it matches equals. */
|
|
9
|
+
interface ParsedNullIfExpression {
|
|
10
|
+
kind: "nullIf";
|
|
11
|
+
value: ParsedExpression;
|
|
12
|
+
equals: ParsedExpression;
|
|
13
|
+
}
|
|
14
|
+
/** Parses exactly two NULLIF operands into their distinct roles. */
|
|
15
|
+
declare function parseNullIfExpression(input: unknown): ParsedNullIfExpression;
|
|
16
|
+
/** Renders the returned value before its equality comparison operand. */
|
|
17
|
+
declare function nullIfToSql(parsed: ParsedNullIfExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment;
|
|
18
|
+
/** NULLIF can return SQL NULL when its operands match. */
|
|
19
|
+
declare function nullIfNullable(): true;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { NullIfInput, ParsedNullIfExpression, nullIfNullable, nullIfToSql, parseNullIfExpression };
|
|
22
|
+
//# sourceMappingURL=nullIf.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullIf.d.mts","names":[],"sources":["../../src/expressions/nullIf.ts"],"mappings":";;;;UAMiB;WACN;;;UAIM;EACf;EACA,OAAO;EACP,QAAQ;;;iBAIM,sBAAsB,iBAAiB;;iBAMvC,YAAY,QAAQ,wBAAwB,KAAK,aAAa,OAAO,cAAc;;iBAKnF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { parseExpression } from "./parseExpression.js";
|
|
2
|
+
import { functionToSql } from "./expression.js";
|
|
3
|
+
//#region src/expressions/nullIf.ts
|
|
4
|
+
/** Parses exactly two NULLIF operands into their distinct roles. */
|
|
5
|
+
function parseNullIfExpression(input) {
|
|
6
|
+
if (!Array.isArray(input) || input.length !== 2) throw new Error("NULLIF needs exactly two values");
|
|
7
|
+
return {
|
|
8
|
+
kind: "nullIf",
|
|
9
|
+
value: parseExpression(input[0]),
|
|
10
|
+
equals: parseExpression(input[1])
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Renders the returned value before its equality comparison operand. */
|
|
14
|
+
function nullIfToSql(parsed, ctx, codec) {
|
|
15
|
+
return functionToSql("NULLIF", [parsed.value, parsed.equals], ctx, codec);
|
|
16
|
+
}
|
|
17
|
+
/** NULLIF can return SQL NULL when its operands match. */
|
|
18
|
+
function nullIfNullable() {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { nullIfNullable, nullIfToSql, parseNullIfExpression };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=nullIf.js.map
|