effect-qb 0.14.0 → 0.15.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 (141) hide show
  1. package/dist/mysql.js +61270 -4259
  2. package/dist/postgres/metadata.js +176 -82
  3. package/dist/postgres.js +5903 -3316
  4. package/package.json +14 -1
  5. package/src/internal/aggregation-validation.ts +3 -3
  6. package/src/internal/case-analysis.d.ts +18 -0
  7. package/src/internal/case-analysis.ts +4 -4
  8. package/src/internal/coercion/analysis.d.ts +7 -0
  9. package/src/internal/{coercion-analysis.ts → coercion/analysis.ts} +3 -3
  10. package/src/internal/coercion/errors.d.ts +17 -0
  11. package/src/internal/{coercion-errors.ts → coercion/errors.ts} +1 -1
  12. package/src/internal/coercion/kind.d.ts +4 -0
  13. package/src/internal/{coercion-kind.ts → coercion/kind.ts} +2 -2
  14. package/src/internal/{coercion-normalize.ts → coercion/normalize.ts} +1 -1
  15. package/src/internal/coercion/rules.d.ts +6 -0
  16. package/src/internal/{coercion-rules.ts → coercion/rules.ts} +2 -2
  17. package/src/internal/column-state.d.ts +190 -0
  18. package/src/internal/column-state.ts +36 -47
  19. package/src/internal/column.ts +21 -305
  20. package/src/internal/datatypes/define.d.ts +17 -0
  21. package/src/internal/datatypes/define.ts +18 -4
  22. package/src/internal/datatypes/lookup.d.ts +44 -0
  23. package/src/internal/datatypes/lookup.ts +61 -152
  24. package/src/internal/datatypes/shape.d.ts +16 -0
  25. package/src/internal/datatypes/shape.ts +1 -1
  26. package/src/internal/derived-table.d.ts +4 -0
  27. package/src/internal/derived-table.ts +21 -16
  28. package/src/internal/dsl-mutation-runtime.ts +378 -0
  29. package/src/internal/dsl-plan-runtime.ts +387 -0
  30. package/src/internal/dsl-query-runtime.ts +160 -0
  31. package/src/internal/dsl-transaction-ddl-runtime.ts +263 -0
  32. package/src/internal/executor.ts +132 -31
  33. package/src/internal/expression-ast.ts +15 -5
  34. package/src/internal/grouping-key.d.ts +3 -0
  35. package/src/internal/grouping-key.ts +1 -1
  36. package/src/internal/implication-runtime.d.ts +15 -0
  37. package/src/internal/implication-runtime.ts +4 -4
  38. package/src/internal/json/ast.d.ts +30 -0
  39. package/src/internal/json/ast.ts +1 -1
  40. package/src/internal/json/errors.d.ts +8 -0
  41. package/src/internal/json/path.d.ts +75 -0
  42. package/src/internal/json/path.ts +1 -1
  43. package/src/internal/json/types.d.ts +62 -0
  44. package/src/internal/predicate/analysis.d.ts +20 -0
  45. package/src/internal/{predicate-analysis.ts → predicate/analysis.ts} +3 -3
  46. package/src/internal/predicate/atom.d.ts +28 -0
  47. package/src/internal/{predicate-branches.ts → predicate/branches.ts} +2 -2
  48. package/src/internal/predicate/context.d.ts +67 -0
  49. package/src/internal/{predicate-context.ts → predicate/context.ts} +8 -5
  50. package/src/internal/predicate/formula.d.ts +35 -0
  51. package/src/internal/{predicate-formula.ts → predicate/formula.ts} +1 -1
  52. package/src/internal/predicate/key.d.ts +11 -0
  53. package/src/internal/{predicate-key.ts → predicate/key.ts} +2 -2
  54. package/src/internal/{predicate-nnf.ts → predicate/nnf.ts} +2 -2
  55. package/src/internal/predicate/normalize.d.ts +53 -0
  56. package/src/internal/{predicate-normalize.ts → predicate/normalize.ts} +19 -19
  57. package/src/internal/predicate/runtime.d.ts +31 -0
  58. package/src/internal/{predicate-runtime.ts → predicate/runtime.ts} +9 -6
  59. package/src/internal/projection-alias.d.ts +13 -0
  60. package/src/internal/projections.d.ts +31 -0
  61. package/src/internal/projections.ts +1 -1
  62. package/src/internal/query-ast.d.ts +217 -0
  63. package/src/internal/query-ast.ts +1 -1
  64. package/src/internal/query-requirements.d.ts +20 -0
  65. package/src/internal/query.d.ts +775 -0
  66. package/src/internal/query.ts +389 -313
  67. package/src/internal/renderer.ts +7 -21
  68. package/src/internal/row-set.d.ts +53 -0
  69. package/src/internal/{plan.ts → row-set.ts} +11 -9
  70. package/src/internal/{runtime-normalize.ts → runtime/normalize.ts} +9 -31
  71. package/src/internal/{runtime-schema.ts → runtime/schema.ts} +13 -38
  72. package/src/internal/runtime/value.d.ts +22 -0
  73. package/src/internal/{runtime-value.ts → runtime/value.ts} +2 -2
  74. package/src/internal/scalar.d.ts +107 -0
  75. package/src/internal/scalar.ts +191 -0
  76. package/src/internal/schema-derivation.d.ts +105 -0
  77. package/src/internal/schema-expression.d.ts +18 -0
  78. package/src/internal/schema-expression.ts +38 -7
  79. package/src/internal/table-options.d.ts +94 -0
  80. package/src/internal/table-options.ts +8 -2
  81. package/src/internal/table.d.ts +173 -0
  82. package/src/internal/table.ts +32 -14
  83. package/src/mysql/column.ts +94 -18
  84. package/src/mysql/datatypes/index.ts +47 -7
  85. package/src/mysql/errors/generated.ts +57336 -0
  86. package/src/mysql/errors/index.ts +1 -0
  87. package/src/mysql/errors/normalize.ts +55 -53
  88. package/src/mysql/errors/types.ts +74 -0
  89. package/src/mysql/executor.ts +69 -7
  90. package/src/mysql/function/aggregate.ts +1 -5
  91. package/src/mysql/function/core.ts +1 -4
  92. package/src/mysql/function/index.ts +0 -1
  93. package/src/mysql/function/string.ts +1 -5
  94. package/src/mysql/function/temporal.ts +12 -15
  95. package/src/mysql/function/window.ts +1 -6
  96. package/src/{internal/mysql-dialect.ts → mysql/internal/dialect.ts} +1 -1
  97. package/src/{internal/mysql-query.ts → mysql/internal/dsl.ts} +1024 -2082
  98. package/src/{internal/mysql-renderer.ts → mysql/internal/renderer.ts} +6 -6
  99. package/src/mysql/internal/sql-expression-renderer.ts +1455 -0
  100. package/src/mysql/json.ts +2 -0
  101. package/src/mysql/query.ts +111 -91
  102. package/src/mysql/renderer.ts +1 -1
  103. package/src/mysql/table.ts +1 -1
  104. package/src/mysql.ts +6 -4
  105. package/src/postgres/cast.ts +11 -12
  106. package/src/postgres/column.ts +178 -46
  107. package/src/postgres/datatypes/index.d.ts +515 -0
  108. package/src/postgres/datatypes/index.ts +22 -13
  109. package/src/postgres/datatypes/spec.d.ts +412 -0
  110. package/src/postgres/errors/generated.ts +2636 -0
  111. package/src/postgres/errors/index.ts +1 -0
  112. package/src/postgres/errors/normalize.ts +47 -62
  113. package/src/postgres/errors/types.ts +92 -34
  114. package/src/postgres/executor.ts +37 -5
  115. package/src/postgres/function/aggregate.ts +1 -5
  116. package/src/postgres/function/core.ts +12 -6
  117. package/src/postgres/function/index.ts +0 -1
  118. package/src/postgres/function/string.ts +1 -5
  119. package/src/postgres/function/temporal.ts +12 -15
  120. package/src/postgres/function/window.ts +1 -6
  121. package/src/{internal/postgres-dialect.ts → postgres/internal/dialect.ts} +1 -1
  122. package/src/{internal/postgres-query.ts → postgres/internal/dsl.ts} +1085 -2089
  123. package/src/{internal/postgres-renderer.ts → postgres/internal/renderer.ts} +6 -6
  124. package/src/postgres/internal/schema-ddl.ts +108 -0
  125. package/src/{internal/postgres-schema-model.ts → postgres/internal/schema-model.ts} +12 -6
  126. package/src/{internal → postgres/internal}/sql-expression-renderer.ts +19 -17
  127. package/src/postgres/{function/json.ts → json.ts} +77 -85
  128. package/src/postgres/metadata.ts +2 -2
  129. package/src/postgres/query.ts +113 -89
  130. package/src/postgres/renderer.ts +3 -13
  131. package/src/postgres/schema-expression.ts +2 -1
  132. package/src/postgres/schema-management.ts +1 -1
  133. package/src/postgres/table.ts +12 -4
  134. package/src/postgres/type.ts +29 -2
  135. package/src/postgres.ts +6 -4
  136. package/src/internal/expression.ts +0 -327
  137. package/src/internal/schema-ddl.ts +0 -55
  138. package/src/mysql/function/json.ts +0 -4
  139. package/src/mysql/private/query.ts +0 -1
  140. package/src/postgres/private/query.ts +0 -1
  141. /package/src/internal/{predicate-atom.ts → predicate/atom.ts} +0 -0
@@ -27,9 +27,9 @@ __export(exports_metadata, {
27
27
  // src/internal/table.ts
28
28
  import { pipeArguments as pipeArguments2 } from "effect/Pipeable";
29
29
 
30
- // src/internal/plan.ts
31
- var exports_plan = {};
32
- __export(exports_plan, {
30
+ // src/internal/row-set.ts
31
+ var exports_row_set = {};
32
+ __export(exports_row_set, {
33
33
  TypeId: () => TypeId
34
34
  });
35
35
  var TypeId = Symbol.for("effect-qb/Plan");
@@ -38,9 +38,9 @@ var TypeId = Symbol.for("effect-qb/Plan");
38
38
  import { pipeArguments } from "effect/Pipeable";
39
39
  import * as Schema from "effect/Schema";
40
40
 
41
- // src/internal/expression.ts
42
- var exports_expression = {};
43
- __export(exports_expression, {
41
+ // src/internal/scalar.ts
42
+ var exports_scalar = {};
43
+ __export(exports_scalar, {
44
44
  TypeId: () => TypeId2
45
45
  });
46
46
  var TypeId2 = Symbol.for("effect-qb/Expression");
@@ -56,8 +56,18 @@ var ColumnProto = {
56
56
  return pipeArguments(this, arguments);
57
57
  }
58
58
  };
59
+ var attachPipe = (value) => {
60
+ Object.defineProperty(value, "pipe", {
61
+ configurable: true,
62
+ writable: true,
63
+ value: function() {
64
+ return pipeArguments(value, arguments);
65
+ }
66
+ });
67
+ return value;
68
+ };
59
69
  var makeColumnDefinition = (schema, metadata) => {
60
- const column = Object.create(ColumnProto);
70
+ const column = attachPipe(Object.create(ColumnProto));
61
71
  column.schema = schema;
62
72
  column.metadata = metadata;
63
73
  column[TypeId2] = {
@@ -66,9 +76,7 @@ var makeColumnDefinition = (schema, metadata) => {
66
76
  runtimeSchema: schema,
67
77
  nullability: metadata.nullable ? "maybe" : "never",
68
78
  dialect: metadata.dbType.dialect,
69
- aggregation: "scalar",
70
- source: undefined,
71
- sourceNullability: "propagate",
79
+ kind: "scalar",
72
80
  dependencies: {}
73
81
  };
74
82
  column[ColumnTypeId] = {
@@ -86,16 +94,14 @@ var makeColumnDefinition = (schema, metadata) => {
86
94
  generatedValue: metadata.generatedValue,
87
95
  ddlType: metadata.ddlType,
88
96
  identity: metadata.identity,
89
- enum: metadata.enum,
90
- source: undefined,
91
- dependencies: {}
97
+ enum: metadata.enum
92
98
  };
93
99
  return column;
94
100
  };
95
101
  var remapColumnDefinition = (column, options = {}) => {
96
102
  const schema = options.schema ?? column.schema;
97
103
  const metadata = options.metadata ?? column.metadata;
98
- const next = Object.create(ColumnProto);
104
+ const next = attachPipe(Object.create(ColumnProto));
99
105
  next.schema = schema;
100
106
  next.metadata = metadata;
101
107
  next[TypeId2] = {
@@ -135,7 +141,7 @@ var remapColumnDefinition = (column, options = {}) => {
135
141
  var bindColumn = (tableName, columnName, column, baseTableName, schemaName) => {
136
142
  const brandName = `${tableName}.${columnName}`;
137
143
  const schema = column.metadata.brand === true ? Schema.brand(brandName)(column.schema) : column.schema;
138
- const bound = Object.create(ColumnProto);
144
+ const bound = attachPipe(Object.create(ColumnProto));
139
145
  bound.schema = schema;
140
146
  bound.metadata = column.metadata;
141
147
  bound[TypeId2] = {
@@ -144,13 +150,7 @@ var bindColumn = (tableName, columnName, column, baseTableName, schemaName) => {
144
150
  runtimeSchema: schema,
145
151
  nullability: column.metadata.nullable ? "maybe" : "never",
146
152
  dialect: column.metadata.dbType.dialect,
147
- aggregation: "scalar",
148
- source: {
149
- tableName,
150
- columnName,
151
- baseTableName
152
- },
153
- sourceNullability: "propagate",
153
+ kind: "scalar",
154
154
  dependencies: {
155
155
  [tableName]: true
156
156
  }
@@ -225,7 +225,9 @@ var collectInlineOptions = (fields) => {
225
225
  kind: "column",
226
226
  column: columnName,
227
227
  order: column.metadata.index.order,
228
- nulls: column.metadata.index.nulls
228
+ nulls: column.metadata.index.nulls,
229
+ operatorClass: column.metadata.index.operatorClass,
230
+ collation: column.metadata.index.collation
229
231
  }],
230
232
  name: column.metadata.index.name,
231
233
  method: column.metadata.index.method,
@@ -379,6 +381,16 @@ var TableProto = {
379
381
  return pipeArguments2(this, arguments);
380
382
  }
381
383
  };
384
+ var attachPipe2 = (value) => {
385
+ Object.defineProperty(value, "pipe", {
386
+ configurable: true,
387
+ writable: true,
388
+ value: function() {
389
+ return pipeArguments2(value, arguments);
390
+ }
391
+ });
392
+ return value;
393
+ };
382
394
  var buildArtifacts = (name, fields, declaredOptions, schemaName) => {
383
395
  const normalizedOptions = [...collectInlineOptions(fields), ...declaredOptions];
384
396
  validateFieldDialects(name, fields);
@@ -397,7 +409,7 @@ var makeTable = (name, fields, declaredOptions, baseName = name, kind = "schema"
397
409
  const resolvedSchemaName = schemaMode === "explicit" ? schemaName : "public";
398
410
  const artifacts = buildArtifacts(name, fields, declaredOptions, resolvedSchemaName);
399
411
  const dialect = resolveFieldDialect(fields);
400
- const table = Object.create(TableProto);
412
+ const table = attachPipe2(Object.create(TableProto));
401
413
  table.name = name;
402
414
  table.columns = artifacts.columns;
403
415
  table.schemas = artifacts.schemas;
@@ -448,7 +460,7 @@ var validateClassOptions = (declaredOptions) => {
448
460
  var resolveFieldDialect = (fields) => {
449
461
  const dialects = [...new Set(Object.values(fields).map((field) => field.metadata.dbType.dialect))];
450
462
  if (dialects.length === 0) {
451
- return "postgres";
463
+ throw new Error("Cannot infer table dialect from an empty field set");
452
464
  }
453
465
  if (dialects.length > 1) {
454
466
  throw new Error(`Mixed table dialects are not supported: ${dialects.join(", ")}`);
@@ -507,7 +519,7 @@ var schema = (schemaName) => ({
507
519
  var alias = (table, aliasName) => {
508
520
  const state = table[TypeId4];
509
521
  const columns = Object.fromEntries(Object.entries(state.fields).map(([key, column]) => [key, bindColumn(aliasName, key, column, state.baseName, state.schemaName)]));
510
- const aliased = Object.create(TableProto);
522
+ const aliased = attachPipe2(Object.create(TableProto));
511
523
  aliased.name = aliasName;
512
524
  aliased.columns = columns;
513
525
  aliased.schemas = deriveSchemas(aliasName, state.fields, state.primaryKey);
@@ -627,31 +639,6 @@ var check = (name, predicate) => makeOption({
627
639
  predicate
628
640
  });
629
641
 
630
- // src/internal/postgres-dialect.ts
631
- var quoteIdentifier = (value) => `"${value.replaceAll('"', '""')}"`;
632
- var renderLiteral = (value, state) => {
633
- if (value === null) {
634
- return "null";
635
- }
636
- if (typeof value === "boolean") {
637
- return value ? "true" : "false";
638
- }
639
- state.params.push(value);
640
- return `$${state.params.length}`;
641
- };
642
- var postgresDialect = {
643
- name: "postgres",
644
- quoteIdentifier,
645
- renderLiteral,
646
- renderTableReference(tableName, baseTableName, schemaName) {
647
- const renderedBase = schemaName ? `${quoteIdentifier(schemaName)}.${quoteIdentifier(baseTableName)}` : quoteIdentifier(baseTableName);
648
- return tableName === baseTableName ? renderedBase : `${renderedBase} as ${quoteIdentifier(tableName)}`;
649
- },
650
- renderConcat(values) {
651
- return `(${values.join(" || ")})`;
652
- }
653
- };
654
-
655
642
  // src/internal/schema-expression.ts
656
643
  import { parse, toSql } from "pgsql-ast-parser";
657
644
  import { pipeArguments as pipeArguments3 } from "effect/Pipeable";
@@ -661,19 +648,48 @@ var SchemaExpressionProto = {
661
648
  return pipeArguments3(this, arguments);
662
649
  }
663
650
  };
651
+ var attachPipe3 = (value) => {
652
+ Object.defineProperty(value, "pipe", {
653
+ configurable: true,
654
+ writable: true,
655
+ value: function() {
656
+ return pipeArguments3(value, arguments);
657
+ }
658
+ });
659
+ return value;
660
+ };
664
661
  var isSchemaExpression = (value) => typeof value === "object" && value !== null && (TypeId5 in value);
665
662
  var fromAst = (ast) => {
666
- const expression = Object.create(SchemaExpressionProto);
663
+ const expression = attachPipe3(Object.create(SchemaExpressionProto));
667
664
  expression[TypeId5] = {
668
- dialect: "postgres",
669
665
  ast
670
666
  };
671
667
  return expression;
672
668
  };
669
+ var fromSql = (sql) => {
670
+ const expression = attachPipe3(Object.create(SchemaExpressionProto));
671
+ expression[TypeId5] = {
672
+ sql: sql.trim()
673
+ };
674
+ return expression;
675
+ };
673
676
  var parseExpression = (sql) => fromAst(parse(sql, "expr"));
674
- var toAst = (expression) => expression[TypeId5].ast;
675
- var render = (expression) => toSql.expr(expression[TypeId5].ast);
676
- var normalize = (expression) => parseExpression(render(expression));
677
+ var toAst = (expression) => {
678
+ const ast = expression[TypeId5].ast;
679
+ if (ast !== undefined) {
680
+ return ast;
681
+ }
682
+ return parse(render(expression), "expr");
683
+ };
684
+ var render = (expression) => expression[TypeId5].sql ?? toSql.expr(toAst(expression));
685
+ var normalize = (expression) => (() => {
686
+ const sql = render(expression);
687
+ try {
688
+ return parseExpression(sql);
689
+ } catch {
690
+ return fromSql(sql);
691
+ }
692
+ })();
677
693
 
678
694
  // src/internal/query.ts
679
695
  import { pipeArguments as pipeArguments4 } from "effect/Pipeable";
@@ -681,7 +697,7 @@ import { pipeArguments as pipeArguments4 } from "effect/Pipeable";
681
697
  // src/internal/query-ast.ts
682
698
  var TypeId6 = Symbol.for("effect-qb/QueryAst");
683
699
 
684
- // src/internal/predicate-runtime.ts
700
+ // src/internal/predicate/runtime.ts
685
701
  var trueFormula = () => ({ kind: "true" });
686
702
  var falseFormula = () => ({ kind: "false" });
687
703
  var atomFormula = (atom) => ({ kind: "atom", atom });
@@ -1184,7 +1200,7 @@ var formulaOfExpression = (value) => {
1184
1200
  }
1185
1201
  case "notIn": {
1186
1202
  const [left, ...rest] = ast.values;
1187
- return left === undefined ? trueFormula() : allFormula(rest.map((value2) => formulaOfNeq(left, value2)));
1203
+ return left === undefined ? trueFormula() : combineFacts(nonNullFactsOfExpression(left), allFormula(rest.map((value2) => formulaOfNeq(left, value2))));
1188
1204
  }
1189
1205
  case "between":
1190
1206
  return combineFacts(ast.values.reduce((current, entry) => combineFacts(current, nonNullFactsOfExpression(entry)), undefined), unknownTag("variadic:between"));
@@ -1226,35 +1242,45 @@ var PlanProto = {
1226
1242
  }
1227
1243
  };
1228
1244
  var QueryTypeId = Symbol.for("effect-qb/Query/internal");
1229
- var normalizeSources = (source) => source === undefined ? [] : Array.isArray(source) ? source : [source];
1230
- var mergeSources = (left, right) => {
1231
- const values = [...normalizeSources(left), ...normalizeSources(right)];
1232
- if (values.length === 0) {
1233
- return;
1234
- }
1235
- if (values.length === 1) {
1236
- return values[0];
1237
- }
1238
- return values;
1239
- };
1240
- var mergeDependencies = (left, right = {}) => ({
1241
- ...left,
1242
- ...right
1245
+ var mergeDependencies = (left, right = undefined) => ({
1246
+ ...left ?? {},
1247
+ ...right ?? {}
1243
1248
  });
1244
1249
  var mergeAggregationRuntime = (left, right = "scalar") => left === "window" || right === "window" ? "window" : left === "aggregate" || right === "aggregate" ? "aggregate" : "scalar";
1245
- var mergeAggregationManyRuntime = (values) => values.reduce((current, value) => mergeAggregationRuntime(current, value[TypeId2].aggregation), "scalar");
1250
+ var mergeAggregationManyRuntime = (values) => values.reduce((current, value) => mergeAggregationRuntime(current, value[TypeId2].kind), "scalar");
1246
1251
  var mergeNullabilityRuntime = (left, right = "never") => left === "always" || right === "always" ? "always" : left === "maybe" || right === "maybe" ? "maybe" : "never";
1247
1252
  var mergeNullabilityManyRuntime = (values) => values.reduce((current, value) => mergeNullabilityRuntime(current, value[TypeId2].nullability), "never");
1248
- var mergeManySources = (values) => values.reduce((current, value) => mergeSources(current, value[TypeId2].source), undefined);
1249
1253
  var mergeManyDependencies = (values) => values.reduce((current, value) => mergeDependencies(current, value[TypeId2].dependencies), {});
1250
1254
  var makeExpression = (state, ast) => {
1251
1255
  const expression = Object.create(ExpressionProto);
1252
- expression[TypeId2] = state;
1256
+ Object.defineProperty(expression, "pipe", {
1257
+ configurable: true,
1258
+ writable: true,
1259
+ value: function() {
1260
+ return pipeArguments4(expression, arguments);
1261
+ }
1262
+ });
1263
+ expression[TypeId2] = {
1264
+ runtime: state.runtime,
1265
+ dbType: state.dbType,
1266
+ runtimeSchema: state.runtimeSchema,
1267
+ nullability: state.nullability,
1268
+ dialect: state.dialect,
1269
+ kind: state.kind ?? "scalar",
1270
+ dependencies: state.dependencies ?? {}
1271
+ };
1253
1272
  expression[TypeId3] = ast;
1254
1273
  return expression;
1255
1274
  };
1256
1275
  var makePlan = (state, ast, _assumptions, _capabilities, _statement, _target, _insertState) => {
1257
1276
  const plan = Object.create(PlanProto);
1277
+ Object.defineProperty(plan, "pipe", {
1278
+ configurable: true,
1279
+ writable: true,
1280
+ value: function() {
1281
+ return pipeArguments4(plan, arguments);
1282
+ }
1283
+ });
1258
1284
  plan[TypeId] = state;
1259
1285
  plan[TypeId6] = ast;
1260
1286
  plan[QueryTypeId] = {
@@ -1475,13 +1501,13 @@ var dedupeGroupedExpressions = (values) => {
1475
1501
  var isExpression2 = (value) => typeof value === "object" && value !== null && (TypeId2 in value);
1476
1502
  var selectionHasAggregate = (selection) => {
1477
1503
  if (isExpression2(selection)) {
1478
- return selection[TypeId2].aggregation === "aggregate";
1504
+ return selection[TypeId2].kind === "aggregate";
1479
1505
  }
1480
1506
  return Object.values(selection).some((value) => selectionHasAggregate(value));
1481
1507
  };
1482
1508
  var isGroupedSelectionValid = (selection, groupedExpressions) => {
1483
1509
  if (isExpression2(selection)) {
1484
- const aggregation = selection[TypeId2].aggregation;
1510
+ const aggregation = selection[TypeId2].kind;
1485
1511
  if (aggregation === "aggregate") {
1486
1512
  return true;
1487
1513
  }
@@ -1504,7 +1530,7 @@ var validateAggregationSelection = (selection, grouped) => {
1504
1530
  }
1505
1531
  };
1506
1532
 
1507
- // src/internal/sql-expression-renderer.ts
1533
+ // src/postgres/internal/sql-expression-renderer.ts
1508
1534
  var renderDbType = (dialect, dbType) => {
1509
1535
  if (dialect.name === "mysql" && dbType.dialect === "mysql" && dbType.kind === "uuid") {
1510
1536
  return "char(36)";
@@ -2392,6 +2418,8 @@ var renderExpression = (expression, state, dialect) => {
2392
2418
  return dialect.name === "mysql" ? `values(${dialect.quoteIdentifier(ast.columnName)})` : `excluded.${dialect.quoteIdentifier(ast.columnName)}`;
2393
2419
  case "cast":
2394
2420
  return `cast(${renderExpression(ast.value, state, dialect)} as ${renderCastType(dialect, ast.target)})`;
2421
+ case "collate":
2422
+ return `(${renderExpression(ast.value, state, dialect)} collate ${ast.collation.map((segment) => dialect.quoteIdentifier(segment)).join(".")})`;
2395
2423
  case "function":
2396
2424
  return renderFunctionCall(ast.name, Array.isArray(ast.args) ? ast.args : [], state, dialect);
2397
2425
  case "eq":
@@ -2522,8 +2550,35 @@ var renderExpression = (expression, state, dialect) => {
2522
2550
  throw new Error("Unsupported expression for SQL rendering");
2523
2551
  };
2524
2552
 
2525
- // src/internal/schema-ddl.ts
2553
+ // src/postgres/internal/schema-ddl.ts
2526
2554
  import { parse as parse2, toSql as toSql2 } from "pgsql-ast-parser";
2555
+
2556
+ // src/postgres/internal/dialect.ts
2557
+ var quoteIdentifier = (value) => `"${value.replaceAll('"', '""')}"`;
2558
+ var renderLiteral = (value, state) => {
2559
+ if (value === null) {
2560
+ return "null";
2561
+ }
2562
+ if (typeof value === "boolean") {
2563
+ return value ? "true" : "false";
2564
+ }
2565
+ state.params.push(value);
2566
+ return `$${state.params.length}`;
2567
+ };
2568
+ var postgresDialect = {
2569
+ name: "postgres",
2570
+ quoteIdentifier,
2571
+ renderLiteral,
2572
+ renderTableReference(tableName, baseTableName, schemaName) {
2573
+ const renderedBase = schemaName ? `${quoteIdentifier(schemaName)}.${quoteIdentifier(baseTableName)}` : quoteIdentifier(baseTableName);
2574
+ return tableName === baseTableName ? renderedBase : `${renderedBase} as ${quoteIdentifier(tableName)}`;
2575
+ },
2576
+ renderConcat(values) {
2577
+ return `(${values.join(" || ")})`;
2578
+ }
2579
+ };
2580
+
2581
+ // src/postgres/internal/schema-ddl.ts
2527
2582
  var escapeString = (value) => `'${value.replaceAll("'", "''")}'`;
2528
2583
  var inlineLiteralDialect = {
2529
2584
  ...postgresDialect,
@@ -2548,12 +2603,51 @@ var renderDdlExpressionSql = (expression) => isSchemaExpression(expression) ? re
2548
2603
  ctes: [],
2549
2604
  cteNames: new Set
2550
2605
  }, inlineLiteralDialect);
2606
+ var stripRedundantOuterParens = (value) => {
2607
+ let current = value.trim();
2608
+ while (current.startsWith("(") && current.endsWith(")")) {
2609
+ let depth = 0;
2610
+ let wrapsWholeExpression = true;
2611
+ let inSingleQuote = false;
2612
+ let inDoubleQuote = false;
2613
+ for (let index3 = 0;index3 < current.length; index3++) {
2614
+ const char = current[index3];
2615
+ const previous = index3 > 0 ? current[index3 - 1] : undefined;
2616
+ if (char === "'" && !inDoubleQuote && previous !== "\\") {
2617
+ inSingleQuote = !inSingleQuote;
2618
+ continue;
2619
+ }
2620
+ if (char === '"' && !inSingleQuote && previous !== "\\") {
2621
+ inDoubleQuote = !inDoubleQuote;
2622
+ continue;
2623
+ }
2624
+ if (inSingleQuote || inDoubleQuote) {
2625
+ continue;
2626
+ }
2627
+ if (char === "(") {
2628
+ depth += 1;
2629
+ } else if (char === ")") {
2630
+ depth -= 1;
2631
+ if (depth === 0 && index3 < current.length - 1) {
2632
+ wrapsWholeExpression = false;
2633
+ break;
2634
+ }
2635
+ }
2636
+ }
2637
+ if (!wrapsWholeExpression) {
2638
+ break;
2639
+ }
2640
+ current = current.slice(1, -1).trim();
2641
+ }
2642
+ return current;
2643
+ };
2644
+ var canonicalizeDdlExpressionSql = (value) => stripRedundantOuterParens(value.trim().replace(/\s+/g, " ").replace(/"[^"]+"\./g, "").replace(/"([A-Za-z_][A-Za-z0-9_]*)"/g, "$1").replace(/\bCOLLATE\b/g, "collate").replace(/cast\(((?:'(?:[^']|'')*'|"[^"]+"|[a-zA-Z_][a-zA-Z0-9_]*|\([^()]+\))) as ([^)]+)\)/gi, (_, expression, target) => `${expression}::${target.trim()}`));
2551
2645
  var normalizeDdlExpressionSql = (expression) => {
2552
2646
  const rendered = renderDdlExpressionSql(expression);
2553
2647
  try {
2554
- return toSql2.expr(parse2(rendered, "expr"));
2648
+ return canonicalizeDdlExpressionSql(toSql2.expr(parse2(rendered, "expr")));
2555
2649
  } catch {
2556
- return rendered.trim();
2650
+ return canonicalizeDdlExpressionSql(rendered);
2557
2651
  }
2558
2652
  };
2559
2653
 
@@ -2630,7 +2724,7 @@ function sequence(name, schemaName) {
2630
2724
  }
2631
2725
  var isSequenceDefinition = (value) => typeof value === "object" && value !== null && (SequenceTypeId in value);
2632
2726
 
2633
- // src/internal/postgres-schema-model.ts
2727
+ // src/postgres/internal/schema-model.ts
2634
2728
  var isTableDefinition = (value) => value !== null && (typeof value === "object" || typeof value === "function") && (TypeId4 in value);
2635
2729
  var isEnumDefinition = (value) => typeof value === "object" && value !== null && (EnumTypeId in value);
2636
2730
  var toTableModel = (table) => {