effect-qb 0.20.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.
Files changed (58) hide show
  1. package/dist/index.js +663 -261
  2. package/dist/mysql.js +2840 -492
  3. package/dist/postgres/metadata.js +113 -14
  4. package/dist/postgres.js +2596 -285
  5. package/dist/sqlite.js +2783 -450
  6. package/dist/standard.js +663 -261
  7. package/package.json +2 -3
  8. package/src/internal/analytics.ts +264 -0
  9. package/src/internal/coercion/errors.d.ts +1 -1
  10. package/src/internal/coercion/errors.ts +1 -1
  11. package/src/internal/custom-sql-renderer.ts +20 -0
  12. package/src/internal/dialect-numeric.ts +332 -0
  13. package/src/internal/dialect-renderers/mysql.ts +68 -13
  14. package/src/internal/dialect-renderers/postgres.ts +83 -13
  15. package/src/internal/dialect-renderers/sqlite.ts +57 -13
  16. package/src/internal/dynamic.ts +131 -0
  17. package/src/internal/executor.ts +198 -7
  18. package/src/internal/expression-ast.ts +62 -1
  19. package/src/internal/fragment.ts +120 -0
  20. package/src/internal/function-constraints.ts +105 -0
  21. package/src/internal/grouping-key.ts +26 -0
  22. package/src/internal/numeric.ts +204 -0
  23. package/src/internal/query.ts +13 -1
  24. package/src/internal/runtime/normalize.ts +5 -2
  25. package/src/internal/runtime/schema.ts +2 -1
  26. package/src/internal/standard-dsl.ts +43 -20
  27. package/src/internal/window-frame.ts +30 -0
  28. package/src/internal/window-renderer.ts +25 -0
  29. package/src/mysql/executor.ts +126 -45
  30. package/src/mysql/function/aggregate.ts +87 -1
  31. package/src/mysql/function/index.ts +5 -2
  32. package/src/mysql/function/numeric.ts +185 -0
  33. package/src/mysql/function/temporal.ts +6 -6
  34. package/src/mysql/function/window.ts +12 -0
  35. package/src/mysql/internal/dsl.ts +38 -20
  36. package/src/mysql.ts +2 -0
  37. package/src/postgres/executor.ts +111 -45
  38. package/src/postgres/function/aggregate.ts +124 -1
  39. package/src/postgres/function/core.ts +2 -1
  40. package/src/postgres/function/index.ts +19 -1
  41. package/src/postgres/function/numeric.ts +246 -0
  42. package/src/postgres/function/window.ts +12 -0
  43. package/src/postgres/internal/dsl.ts +38 -20
  44. package/src/sqlite/executor.ts +96 -45
  45. package/src/sqlite/function/aggregate.ts +90 -1
  46. package/src/sqlite/function/index.ts +5 -2
  47. package/src/sqlite/function/numeric.ts +139 -0
  48. package/src/sqlite/function/window.ts +12 -0
  49. package/src/sqlite/internal/dsl.ts +38 -20
  50. package/src/sqlite.ts +2 -0
  51. package/src/standard/function/core.ts +8 -1
  52. package/src/standard/function/index.ts +18 -11
  53. package/src/standard/function/string.ts +1 -1
  54. package/src/standard/function/window.ts +10 -1
  55. package/src/standard/query.ts +19 -7
  56. package/src/standard/type.ts +16 -0
  57. package/src/standard.ts +4 -0
  58. 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
- if (isValidOffsetTimeString(raw)) {
3808
- return raw;
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 clauses = [];
5889
- if (partitionBy.length > 0) {
5890
- clauses.push(`partition by ${partitionBy.map((value) => renderExpression2(value, state, dialect)).join(", ")}`);
5891
- }
5892
- if (orderBy.length > 0) {
5893
- clauses.push(`order by ${orderBy.map((entry) => `${renderExpression2(entry.value, state, dialect)} ${entry.direction}`).join(", ")}`);
5894
- }
5895
- const specification = clauses.join(" ");
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 (${specification})`;
5982
+ return `row_number() over (${renderSpecification()})`;
5899
5983
  case "rank":
5900
- return `rank() over (${specification})`;
5984
+ return `rank() over (${renderSpecification()})`;
5901
5985
  case "denseRank":
5902
- return `dense_rank() over (${specification})`;
5986
+ return `dense_rank() over (${renderSpecification()})`;
5903
5987
  case "over":
5904
- return `${renderExpression2(ast.value, state, dialect)} over (${specification})`;
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
  }