effect-qb 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +663 -261
- package/dist/mysql.js +2840 -492
- package/dist/postgres/metadata.js +113 -14
- package/dist/postgres.js +2596 -285
- package/dist/sqlite.js +2783 -450
- package/dist/standard.js +663 -261
- package/package.json +1 -1
- package/src/internal/analytics.ts +264 -0
- package/src/internal/coercion/errors.d.ts +1 -1
- package/src/internal/coercion/errors.ts +1 -1
- package/src/internal/custom-sql-renderer.ts +20 -0
- package/src/internal/dialect-numeric.ts +332 -0
- package/src/internal/dialect-renderers/mysql.ts +68 -13
- package/src/internal/dialect-renderers/postgres.ts +83 -13
- package/src/internal/dialect-renderers/sqlite.ts +57 -13
- package/src/internal/dynamic.ts +131 -0
- package/src/internal/executor.ts +198 -7
- package/src/internal/expression-ast.ts +62 -1
- package/src/internal/fragment.ts +120 -0
- package/src/internal/function-constraints.ts +105 -0
- package/src/internal/grouping-key.ts +26 -0
- package/src/internal/numeric.ts +204 -0
- package/src/internal/query.ts +13 -1
- package/src/internal/runtime/normalize.ts +5 -2
- package/src/internal/runtime/schema.ts +2 -1
- package/src/internal/standard-dsl.ts +43 -20
- package/src/internal/window-frame.ts +30 -0
- package/src/internal/window-renderer.ts +25 -0
- package/src/mysql/executor.ts +126 -45
- package/src/mysql/function/aggregate.ts +87 -1
- package/src/mysql/function/index.ts +5 -2
- package/src/mysql/function/numeric.ts +185 -0
- package/src/mysql/function/temporal.ts +6 -6
- package/src/mysql/function/window.ts +12 -0
- package/src/mysql/internal/dsl.ts +38 -20
- package/src/mysql.ts +2 -0
- package/src/postgres/executor.ts +111 -45
- package/src/postgres/function/aggregate.ts +124 -1
- package/src/postgres/function/core.ts +2 -1
- package/src/postgres/function/index.ts +19 -1
- package/src/postgres/function/numeric.ts +246 -0
- package/src/postgres/function/window.ts +12 -0
- package/src/postgres/internal/dsl.ts +38 -20
- package/src/sqlite/executor.ts +96 -45
- package/src/sqlite/function/aggregate.ts +90 -1
- package/src/sqlite/function/index.ts +5 -2
- package/src/sqlite/function/numeric.ts +139 -0
- package/src/sqlite/function/window.ts +12 -0
- package/src/sqlite/internal/dsl.ts +38 -20
- package/src/sqlite.ts +2 -0
- package/src/standard/function/core.ts +8 -1
- package/src/standard/function/index.ts +18 -11
- package/src/standard/function/string.ts +1 -1
- package/src/standard/function/window.ts +10 -1
- package/src/standard/query.ts +19 -7
- package/src/standard/type.ts +16 -0
- package/src/standard.ts +4 -0
- package/src/standard/function/temporal.ts +0 -78
|
@@ -2639,6 +2639,33 @@ var sqliteSpecificDatatypeKeys = [
|
|
|
2639
2639
|
];
|
|
2640
2640
|
var pickDatatypeConstructors = (module, keys) => Object.fromEntries(keys.map((key2) => [key2, module[key2]]));
|
|
2641
2641
|
|
|
2642
|
+
// src/internal/custom-sql-renderer.ts
|
|
2643
|
+
var renderCustomSql = (node, state, dialect, renderExpression2) => node.strings.map((part, index3) => {
|
|
2644
|
+
const value = node.values[index3];
|
|
2645
|
+
if (value === undefined) {
|
|
2646
|
+
return part;
|
|
2647
|
+
}
|
|
2648
|
+
return part + (TypeId2 in value ? renderExpression2(value, state, dialect) : value.parts.map((segment) => dialect.quoteIdentifier(segment)).join("."));
|
|
2649
|
+
}).join("");
|
|
2650
|
+
|
|
2651
|
+
// src/internal/window-renderer.ts
|
|
2652
|
+
var renderBoundary = (boundary) => {
|
|
2653
|
+
if (boundary === "unboundedPreceding") {
|
|
2654
|
+
return "unbounded preceding";
|
|
2655
|
+
}
|
|
2656
|
+
if (boundary === "currentRow") {
|
|
2657
|
+
return "current row";
|
|
2658
|
+
}
|
|
2659
|
+
if (boundary === "unboundedFollowing") {
|
|
2660
|
+
return "unbounded following";
|
|
2661
|
+
}
|
|
2662
|
+
if ("preceding" in boundary) {
|
|
2663
|
+
return `${boundary.preceding} preceding`;
|
|
2664
|
+
}
|
|
2665
|
+
return `${boundary.following} following`;
|
|
2666
|
+
};
|
|
2667
|
+
var renderWindowFrame = (frame) => frame.end === undefined ? `${frame.unit} ${renderBoundary(frame.start)}` : `${frame.unit} between ${renderBoundary(frame.start)} and ${renderBoundary(frame.end)}`;
|
|
2668
|
+
|
|
2642
2669
|
// src/internal/dsl-plan-runtime.ts
|
|
2643
2670
|
var renderSelectLockMode = (mode) => mode === "update" ? "for update" : "for share";
|
|
2644
2671
|
var renderMysqlMutationLockMode = (mode, _statement) => {
|
|
@@ -3804,8 +3831,9 @@ var normalizeOffsetTime = (value) => {
|
|
|
3804
3831
|
return `${formatLocalTime(validDate(value))}Z`;
|
|
3805
3832
|
}
|
|
3806
3833
|
const raw = expectString(value, "offset time").trim();
|
|
3807
|
-
|
|
3808
|
-
|
|
3834
|
+
const canonical = raw.replace(/([+-]\d{2})$/, "$1:00").replace(/([+-]\d{2})(\d{2})$/, "$1:$2");
|
|
3835
|
+
if (isValidOffsetTimeString(canonical)) {
|
|
3836
|
+
return canonical;
|
|
3809
3837
|
}
|
|
3810
3838
|
throw new Error("Expected an offset-time value");
|
|
3811
3839
|
};
|
|
@@ -4245,6 +4273,14 @@ var castTargetGroupingKey = (target) => {
|
|
|
4245
4273
|
};
|
|
4246
4274
|
var escapeGroupingText = (value) => value.replace(/\\/g, "\\\\").replace(/,/g, "\\,").replace(/\|/g, "\\|").replace(/=/g, "\\=").replace(/>/g, "\\>");
|
|
4247
4275
|
var functionCallNameGroupingKey = (name) => escapeGroupingText(name);
|
|
4276
|
+
var customSqlGroupingKey = (strings, values) => strings.map((part, index3) => {
|
|
4277
|
+
const value = values[index3];
|
|
4278
|
+
if (value === undefined) {
|
|
4279
|
+
return escapeGroupingText(part);
|
|
4280
|
+
}
|
|
4281
|
+
const rendered = isExpression3(value) ? groupingKeyOfExpression(value) : `identifier:${value.parts.map(escapeGroupingText).join(".")}`;
|
|
4282
|
+
return `${escapeGroupingText(part)}${rendered}`;
|
|
4283
|
+
}).join("|");
|
|
4248
4284
|
var quantifiedComparisonGroupingName = (kind) => kind === "comparisonAny" ? "compareAny" : "compareAll";
|
|
4249
4285
|
var caseGroupingKey = (branches, fallback) => {
|
|
4250
4286
|
const typedBranches = branches;
|
|
@@ -4326,12 +4362,19 @@ var groupingKeyOfExpression = (expression) => {
|
|
|
4326
4362
|
return `collate(${requiredExpressionGroupingKey("collate", ast.value)},${collationGroupingKey(ast.collation)})`;
|
|
4327
4363
|
case "function":
|
|
4328
4364
|
return `function(${functionCallNameGroupingKey(ast.name)},${functionCallArgsGroupingKey(ast.args)})`;
|
|
4365
|
+
case "customSql":
|
|
4366
|
+
return `customSql(${customSqlGroupingKey(ast.strings, ast.values)})`;
|
|
4329
4367
|
case "isNull":
|
|
4330
4368
|
case "isNotNull":
|
|
4331
4369
|
case "not":
|
|
4332
4370
|
case "upper":
|
|
4333
4371
|
case "lower":
|
|
4334
4372
|
case "count":
|
|
4373
|
+
case "sum":
|
|
4374
|
+
case "avg":
|
|
4375
|
+
case "abs":
|
|
4376
|
+
case "round":
|
|
4377
|
+
case "negate":
|
|
4335
4378
|
case "max":
|
|
4336
4379
|
case "min":
|
|
4337
4380
|
return `${ast.kind}(${requiredExpressionGroupingKey(ast.kind, ast.value)})`;
|
|
@@ -4352,6 +4395,11 @@ var groupingKeyOfExpression = (expression) => {
|
|
|
4352
4395
|
case "contains":
|
|
4353
4396
|
case "containedBy":
|
|
4354
4397
|
case "overlaps":
|
|
4398
|
+
case "add":
|
|
4399
|
+
case "subtract":
|
|
4400
|
+
case "multiply":
|
|
4401
|
+
case "divide":
|
|
4402
|
+
case "modulo":
|
|
4355
4403
|
return `${ast.kind}(${requiredBinaryExpressionGroupingKey(ast.kind, ast.left, ast.right)})`;
|
|
4356
4404
|
case "and":
|
|
4357
4405
|
case "or":
|
|
@@ -4701,6 +4749,15 @@ var renderBinaryExpression = (functionName, operator, left, right, state, dialec
|
|
|
4701
4749
|
const [leftExpression, rightExpression] = expectBinaryExpressions(functionName, left, right);
|
|
4702
4750
|
return `(${renderExpression2(leftExpression, state, dialect)} ${operator} ${renderExpression2(rightExpression, state, dialect)})`;
|
|
4703
4751
|
};
|
|
4752
|
+
var renderNumericExpression = (expression, state, dialect) => {
|
|
4753
|
+
const rendered = renderExpression2(expression, state, dialect);
|
|
4754
|
+
const ast = expression[TypeId3];
|
|
4755
|
+
return dialect.name === "postgres" && ast.kind === "literal" ? `cast(${rendered} as ${renderCastType(dialect, expression[TypeId2].dbType)})` : rendered;
|
|
4756
|
+
};
|
|
4757
|
+
var renderNumericBinaryExpression = (functionName, operator, left, right, state, dialect) => {
|
|
4758
|
+
const [leftExpression, rightExpression] = expectBinaryExpressions(functionName, left, right);
|
|
4759
|
+
return `(${renderNumericExpression(leftExpression, state, dialect)} ${operator} ${renderNumericExpression(rightExpression, state, dialect)})`;
|
|
4760
|
+
};
|
|
4704
4761
|
var postgresRangeSubtypeByKind = {
|
|
4705
4762
|
int4range: "int4",
|
|
4706
4763
|
int8range: "int8",
|
|
@@ -5735,6 +5792,8 @@ var renderExpression2 = (expression, state, dialect) => {
|
|
|
5735
5792
|
return `(${renderExpression2(expectValueExpression("collate", ast.value), state, dialect)} collate ${renderCollation(ast.collation)})`;
|
|
5736
5793
|
case "function":
|
|
5737
5794
|
return renderFunctionCall(ast.name, ast.args, state, dialect);
|
|
5795
|
+
case "customSql":
|
|
5796
|
+
return renderCustomSql(ast, state, dialect, renderExpression2);
|
|
5738
5797
|
case "eq":
|
|
5739
5798
|
return renderBinaryExpression("eq", "=", ast.left, ast.right, state, dialect);
|
|
5740
5799
|
case "neq":
|
|
@@ -5747,6 +5806,16 @@ var renderExpression2 = (expression, state, dialect) => {
|
|
|
5747
5806
|
return renderBinaryExpression("gt", ">", ast.left, ast.right, state, dialect);
|
|
5748
5807
|
case "gte":
|
|
5749
5808
|
return renderBinaryExpression("gte", ">=", ast.left, ast.right, state, dialect);
|
|
5809
|
+
case "add":
|
|
5810
|
+
return renderNumericBinaryExpression("add", "+", ast.left, ast.right, state, dialect);
|
|
5811
|
+
case "subtract":
|
|
5812
|
+
return renderNumericBinaryExpression("subtract", "-", ast.left, ast.right, state, dialect);
|
|
5813
|
+
case "multiply":
|
|
5814
|
+
return renderNumericBinaryExpression("multiply", "*", ast.left, ast.right, state, dialect);
|
|
5815
|
+
case "divide":
|
|
5816
|
+
return renderNumericBinaryExpression("divide", "/", ast.left, ast.right, state, dialect);
|
|
5817
|
+
case "modulo":
|
|
5818
|
+
return renderNumericBinaryExpression("modulo", "%", ast.left, ast.right, state, dialect);
|
|
5750
5819
|
case "like":
|
|
5751
5820
|
return renderBinaryExpression("like", "like", ast.left, ast.right, state, dialect);
|
|
5752
5821
|
case "ilike": {
|
|
@@ -5840,6 +5909,16 @@ var renderExpression2 = (expression, state, dialect) => {
|
|
|
5840
5909
|
return `lower(${renderExpression2(expectValueExpression("lower", ast.value), state, dialect)})`;
|
|
5841
5910
|
case "count":
|
|
5842
5911
|
return `count(${renderExpression2(expectValueExpression("count", ast.value), state, dialect)})`;
|
|
5912
|
+
case "sum":
|
|
5913
|
+
return `sum(${renderNumericExpression(expectValueExpression("sum", ast.value), state, dialect)})`;
|
|
5914
|
+
case "avg":
|
|
5915
|
+
return `avg(${renderNumericExpression(expectValueExpression("avg", ast.value), state, dialect)})`;
|
|
5916
|
+
case "abs":
|
|
5917
|
+
return `abs(${renderNumericExpression(expectValueExpression("abs", ast.value), state, dialect)})`;
|
|
5918
|
+
case "round":
|
|
5919
|
+
return `round(${renderNumericExpression(expectValueExpression("round", ast.value), state, dialect)})`;
|
|
5920
|
+
case "negate":
|
|
5921
|
+
return `(-${renderNumericExpression(expectValueExpression("negate", ast.value), state, dialect)})`;
|
|
5843
5922
|
case "max":
|
|
5844
5923
|
return `max(${renderExpression2(expectValueExpression("max", ast.value), state, dialect)})`;
|
|
5845
5924
|
case "min":
|
|
@@ -5885,23 +5964,43 @@ var renderExpression2 = (expression, state, dialect) => {
|
|
|
5885
5964
|
case "window": {
|
|
5886
5965
|
const partitionBy = ast.partitionBy;
|
|
5887
5966
|
const orderBy = ast.orderBy;
|
|
5888
|
-
const
|
|
5889
|
-
|
|
5890
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
5895
|
-
|
|
5967
|
+
const renderSpecification = () => {
|
|
5968
|
+
const clauses = [];
|
|
5969
|
+
if (partitionBy.length > 0) {
|
|
5970
|
+
clauses.push(`partition by ${partitionBy.map((value) => renderExpression2(value, state, dialect)).join(", ")}`);
|
|
5971
|
+
}
|
|
5972
|
+
if (orderBy.length > 0) {
|
|
5973
|
+
clauses.push(`order by ${orderBy.map((entry) => `${renderExpression2(entry.value, state, dialect)} ${entry.direction}`).join(", ")}`);
|
|
5974
|
+
}
|
|
5975
|
+
if (ast.frame !== undefined) {
|
|
5976
|
+
clauses.push(renderWindowFrame(ast.frame));
|
|
5977
|
+
}
|
|
5978
|
+
return clauses.join(" ");
|
|
5979
|
+
};
|
|
5896
5980
|
switch (ast.function) {
|
|
5897
5981
|
case "rowNumber":
|
|
5898
|
-
return `row_number() over (${
|
|
5982
|
+
return `row_number() over (${renderSpecification()})`;
|
|
5899
5983
|
case "rank":
|
|
5900
|
-
return `rank() over (${
|
|
5984
|
+
return `rank() over (${renderSpecification()})`;
|
|
5901
5985
|
case "denseRank":
|
|
5902
|
-
return `dense_rank() over (${
|
|
5986
|
+
return `dense_rank() over (${renderSpecification()})`;
|
|
5903
5987
|
case "over":
|
|
5904
|
-
return `${renderExpression2(ast.value, state, dialect)} over (${
|
|
5988
|
+
return `${renderExpression2(ast.value, state, dialect)} over (${renderSpecification()})`;
|
|
5989
|
+
case "lag":
|
|
5990
|
+
case "lead": {
|
|
5991
|
+
const args = [renderExpression2(ast.value, state, dialect)];
|
|
5992
|
+
if (ast.offset !== undefined) {
|
|
5993
|
+
args.push(renderExpression2(ast.offset, state, dialect));
|
|
5994
|
+
}
|
|
5995
|
+
if (ast.defaultValue !== undefined) {
|
|
5996
|
+
args.push(renderExpression2(ast.defaultValue, state, dialect));
|
|
5997
|
+
}
|
|
5998
|
+
return `${ast.function}(${args.join(", ")}) over (${renderSpecification()})`;
|
|
5999
|
+
}
|
|
6000
|
+
case "firstValue":
|
|
6001
|
+
return `first_value(${renderExpression2(ast.value, state, dialect)}) over (${renderSpecification()})`;
|
|
6002
|
+
case "lastValue":
|
|
6003
|
+
return `last_value(${renderExpression2(ast.value, state, dialect)}) over (${renderSpecification()})`;
|
|
5905
6004
|
}
|
|
5906
6005
|
break;
|
|
5907
6006
|
}
|