effect-qb 0.15.0 → 0.16.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.
@@ -74,6 +74,7 @@ var makeColumnDefinition = (schema, metadata) => {
74
74
  runtime: undefined,
75
75
  dbType: metadata.dbType,
76
76
  runtimeSchema: schema,
77
+ driverValueMapping: metadata.driverValueMapping,
77
78
  nullability: metadata.nullable ? "maybe" : "never",
78
79
  dialect: metadata.dbType.dialect,
79
80
  kind: "scalar",
@@ -93,6 +94,7 @@ var makeColumnDefinition = (schema, metadata) => {
93
94
  defaultValue: metadata.defaultValue,
94
95
  generatedValue: metadata.generatedValue,
95
96
  ddlType: metadata.ddlType,
97
+ driverValueMapping: metadata.driverValueMapping,
96
98
  identity: metadata.identity,
97
99
  enum: metadata.enum
98
100
  };
@@ -109,6 +111,7 @@ var remapColumnDefinition = (column, options = {}) => {
109
111
  runtime: undefined,
110
112
  dbType: metadata.dbType,
111
113
  runtimeSchema: schema,
114
+ driverValueMapping: metadata.driverValueMapping,
112
115
  nullability: metadata.nullable ? "maybe" : "never",
113
116
  dialect: metadata.dbType.dialect
114
117
  };
@@ -127,6 +130,7 @@ var remapColumnDefinition = (column, options = {}) => {
127
130
  defaultValue: metadata.defaultValue,
128
131
  generatedValue: metadata.generatedValue,
129
132
  ddlType: metadata.ddlType,
133
+ driverValueMapping: metadata.driverValueMapping,
130
134
  identity: metadata.identity,
131
135
  enum: metadata.enum
132
136
  };
@@ -148,6 +152,7 @@ var bindColumn = (tableName, columnName, column, baseTableName, schemaName) => {
148
152
  runtime: undefined,
149
153
  dbType: column.metadata.dbType,
150
154
  runtimeSchema: schema,
155
+ driverValueMapping: column.metadata.driverValueMapping,
151
156
  nullability: column.metadata.nullable ? "maybe" : "never",
152
157
  dialect: column.metadata.dbType.dialect,
153
158
  kind: "scalar",
@@ -711,6 +716,7 @@ var emptyContext = () => ({
711
716
  nullKeys: new Set,
712
717
  eqLiterals: new Map,
713
718
  neqLiterals: new Map,
719
+ literalSets: new Map,
714
720
  sourceNames: new Set,
715
721
  contradiction: false,
716
722
  unknown: false
@@ -720,6 +726,7 @@ var cloneContext = (context) => ({
720
726
  nullKeys: new Set(context.nullKeys),
721
727
  eqLiterals: new Map(context.eqLiterals),
722
728
  neqLiterals: new Map(Array.from(context.neqLiterals.entries(), ([key, values]) => [key, new Set(values)])),
729
+ literalSets: new Map(Array.from(context.literalSets.entries(), ([key, values]) => [key, new Set(values)])),
723
730
  sourceNames: new Set(context.sourceNames),
724
731
  contradiction: context.contradiction,
725
732
  unknown: context.unknown
@@ -753,7 +760,12 @@ var addEqLiteral = (context, key, value) => {
753
760
  if (neqValues?.has(value)) {
754
761
  context.contradiction = true;
755
762
  }
763
+ const existingSet = context.literalSets.get(key);
764
+ if (existingSet !== undefined && !existingSet.has(value)) {
765
+ context.contradiction = true;
766
+ }
756
767
  context.eqLiterals.set(key, value);
768
+ context.literalSets.set(key, new Set([value]));
757
769
  };
758
770
  var addNeqLiteral = (context, key, value) => {
759
771
  addNonNull(context, key);
@@ -764,6 +776,18 @@ var addNeqLiteral = (context, key, value) => {
764
776
  values.add(value);
765
777
  context.neqLiterals.set(key, values);
766
778
  };
779
+ var addLiteralSet = (context, key, values) => {
780
+ addNonNull(context, key);
781
+ const existingEq = context.eqLiterals.get(key);
782
+ if (existingEq !== undefined && !values.has(existingEq)) {
783
+ context.contradiction = true;
784
+ }
785
+ const existing = context.literalSets.get(key);
786
+ context.literalSets.set(key, existing === undefined ? new Set(values) : new Set(Array.from(existing).filter((value) => values.has(value))));
787
+ if (context.literalSets.get(key)?.size === 0) {
788
+ context.contradiction = true;
789
+ }
790
+ };
767
791
  var applyEqColumn = (context, left, right) => {
768
792
  const leftValue = context.eqLiterals.get(left);
769
793
  const rightValue = context.eqLiterals.get(right);
@@ -803,6 +827,9 @@ var applyAtom = (context, atom) => {
803
827
  case "neq-literal":
804
828
  addNeqLiteral(context, atom.key, atom.value);
805
829
  return;
830
+ case "literal-set":
831
+ addLiteralSet(context, atom.key, new Set(atom.values));
832
+ return;
806
833
  case "eq-column":
807
834
  applyEqColumn(context, atom.left, atom.right);
808
835
  return;
@@ -825,6 +852,9 @@ var applyNegativeAtom = (context, atom) => {
825
852
  case "neq-literal":
826
853
  addEqLiteral(context, atom.key, atom.value);
827
854
  return;
855
+ case "literal-set":
856
+ addNonNull(context, atom.key);
857
+ return;
828
858
  case "eq-column":
829
859
  addNonNull(context, atom.left);
830
860
  addNonNull(context, atom.right);
@@ -857,6 +887,17 @@ var intersectNeqLiterals = (left, right) => {
857
887
  }
858
888
  return result;
859
889
  };
890
+ var unionLiteralSets = (left, right) => {
891
+ const result = new Map;
892
+ for (const [key, leftValues] of left) {
893
+ const rightValues = right.get(key);
894
+ if (rightValues === undefined) {
895
+ continue;
896
+ }
897
+ result.set(key, new Set([...leftValues, ...rightValues]));
898
+ }
899
+ return result;
900
+ };
860
901
  var intersectContexts = (left, right) => {
861
902
  if (left.contradiction) {
862
903
  return cloneContext(right);
@@ -869,6 +910,7 @@ var intersectContexts = (left, right) => {
869
910
  nullKeys: new Set(Array.from(left.nullKeys).filter((key) => right.nullKeys.has(key))),
870
911
  eqLiterals: intersectEqLiterals(left.eqLiterals, right.eqLiterals),
871
912
  neqLiterals: intersectNeqLiterals(left.neqLiterals, right.neqLiterals),
913
+ literalSets: unionLiteralSets(left.literalSets, right.literalSets),
872
914
  sourceNames: new Set(Array.from(left.sourceNames).filter((name) => right.sourceNames.has(name))),
873
915
  contradiction: false,
874
916
  unknown: left.unknown || right.unknown
@@ -942,6 +984,45 @@ var columnKeyOfExpression = (value) => {
942
984
  const ast = astOf(value);
943
985
  return ast.kind === "column" ? `${ast.tableName}.${ast.columnName}` : undefined;
944
986
  };
987
+ var sameDbType = (left, right) => left.dialect === right.dialect && left.kind === right.kind;
988
+ var jsonPathPredicateKeyOfExpression = (value) => {
989
+ const ast = astOf(value);
990
+ switch (ast.kind) {
991
+ case "jsonGetText":
992
+ case "jsonPathText":
993
+ case "jsonAccessText":
994
+ case "jsonTraverseText": {
995
+ const jsonAst = ast;
996
+ const segments = jsonAst.segments;
997
+ if (segments.length === 0 || segments.length > 8) {
998
+ return;
999
+ }
1000
+ const path = [];
1001
+ for (const segment of segments) {
1002
+ if (typeof segment !== "object" || segment === null || segment.kind !== "key") {
1003
+ return;
1004
+ }
1005
+ path.push(segment.key);
1006
+ }
1007
+ if (path.length === 0) {
1008
+ return;
1009
+ }
1010
+ const baseKey = columnKeyOfExpression(jsonAst.base);
1011
+ return baseKey === undefined ? undefined : `${baseKey}#json:${path.join(".")}`;
1012
+ }
1013
+ default:
1014
+ return;
1015
+ }
1016
+ };
1017
+ var predicateKeyOfExpression = (value) => columnKeyOfExpression(value) ?? castPredicateKeyOfExpression(value) ?? jsonPathPredicateKeyOfExpression(value);
1018
+ var castPredicateKeyOfExpression = (value) => {
1019
+ const ast = astOf(value);
1020
+ if (ast.kind !== "cast") {
1021
+ return;
1022
+ }
1023
+ const source = ast.value;
1024
+ return sameDbType(source[TypeId2].dbType, ast.target) ? predicateKeyOfExpression(source) : undefined;
1025
+ };
945
1026
  var valueKeyOfLiteral = (value) => {
946
1027
  if (typeof value === "string") {
947
1028
  return `string:${value}`;
@@ -961,7 +1042,7 @@ var valueKeyOfLiteral = (value) => {
961
1042
  return "unknown";
962
1043
  };
963
1044
  var nonNullFactsOfExpression = (value) => {
964
- const key = columnKeyOfExpression(value);
1045
+ const key = predicateKeyOfExpression(value);
965
1046
  return key === undefined ? undefined : atomFormula({ kind: "is-not-null", key });
966
1047
  };
967
1048
  var combineFacts = (left, right) => {
@@ -974,8 +1055,8 @@ var combineFacts = (left, right) => {
974
1055
  return andFormula(left, right);
975
1056
  };
976
1057
  var formulaOfEq = (left, right) => {
977
- const leftKey = columnKeyOfExpression(left);
978
- const rightKey = columnKeyOfExpression(right);
1058
+ const leftKey = predicateKeyOfExpression(left);
1059
+ const rightKey = predicateKeyOfExpression(right);
979
1060
  const leftAst = astOf(left);
980
1061
  const rightAst = astOf(right);
981
1062
  const leftLiteral = leftAst.kind === "literal" ? leftAst.value : undefined;
@@ -1022,8 +1103,8 @@ var formulaOfEq = (left, right) => {
1022
1103
  });
1023
1104
  };
1024
1105
  var formulaOfNeq = (left, right) => {
1025
- const leftKey = columnKeyOfExpression(left);
1026
- const rightKey = columnKeyOfExpression(right);
1106
+ const leftKey = predicateKeyOfExpression(left);
1107
+ const rightKey = predicateKeyOfExpression(right);
1027
1108
  const leftAst = astOf(left);
1028
1109
  const rightAst = astOf(right);
1029
1110
  const leftLiteral = leftAst.kind === "literal" ? leftAst.value : undefined;
@@ -1066,8 +1147,8 @@ var formulaOfNeq = (left, right) => {
1066
1147
  return combineFacts(nonNullFactsOfExpression(left), nonNullFactsOfExpression(right));
1067
1148
  };
1068
1149
  var formulaOfIsNotDistinctFrom = (left, right) => {
1069
- const leftKey = columnKeyOfExpression(left);
1070
- const rightKey = columnKeyOfExpression(right);
1150
+ const leftKey = predicateKeyOfExpression(left);
1151
+ const rightKey = predicateKeyOfExpression(right);
1071
1152
  const leftAst = astOf(left);
1072
1153
  const rightAst = astOf(right);
1073
1154
  const leftLiteral = leftAst.kind === "literal" ? leftAst.value : undefined;
@@ -1173,11 +1254,11 @@ var formulaOfExpression = (value) => {
1173
1254
  }
1174
1255
  return unknownTag("literal:non-boolean");
1175
1256
  case "isNull": {
1176
- const key = columnKeyOfExpression(ast.value);
1257
+ const key = predicateKeyOfExpression(ast.value);
1177
1258
  return key === undefined ? unknownTag("isNull:unsupported") : atomFormula({ kind: "is-null", key });
1178
1259
  }
1179
1260
  case "isNotNull": {
1180
- const key = columnKeyOfExpression(ast.value);
1261
+ const key = predicateKeyOfExpression(ast.value);
1181
1262
  return key === undefined ? unknownTag("isNotNull:unsupported") : atomFormula({ kind: "is-not-null", key });
1182
1263
  }
1183
1264
  case "not":
@@ -1196,7 +1277,15 @@ var formulaOfExpression = (value) => {
1196
1277
  return anyFormula(ast.values.map((value2) => formulaOfExpression(value2)));
1197
1278
  case "in": {
1198
1279
  const [left, ...rest] = ast.values;
1199
- return left === undefined ? falseFormula() : anyFormula(rest.map((value2) => formulaOfEq(left, value2)));
1280
+ if (left === undefined) {
1281
+ return falseFormula();
1282
+ }
1283
+ const key = predicateKeyOfExpression(left);
1284
+ const literalValues = rest.map((entry) => {
1285
+ const entryAst = astOf(entry);
1286
+ return entryAst.kind === "literal" && entryAst.value !== null ? valueKeyOfLiteral(entryAst.value) : undefined;
1287
+ });
1288
+ return key !== undefined && literalValues.every((entry) => entry !== undefined) ? atomFormula({ kind: "literal-set", key, values: literalValues }) : anyFormula(rest.map((value2) => formulaOfEq(left, value2)));
1200
1289
  }
1201
1290
  case "notIn": {
1202
1291
  const [left, ...rest] = ast.values;
@@ -1264,6 +1353,7 @@ var makeExpression = (state, ast) => {
1264
1353
  runtime: state.runtime,
1265
1354
  dbType: state.dbType,
1266
1355
  runtimeSchema: state.runtimeSchema,
1356
+ driverValueMapping: state.driverValueMapping,
1267
1357
  nullability: state.nullability,
1268
1358
  dialect: state.dialect,
1269
1359
  kind: state.kind ?? "scalar",
@@ -1272,7 +1362,7 @@ var makeExpression = (state, ast) => {
1272
1362
  expression[TypeId3] = ast;
1273
1363
  return expression;
1274
1364
  };
1275
- var makePlan = (state, ast, _assumptions, _capabilities, _statement, _target, _insertState) => {
1365
+ var makePlan = (state, ast, _assumptions, _capabilities, _statement, _target, _insertState, _facts) => {
1276
1366
  const plan = Object.create(PlanProto);
1277
1367
  Object.defineProperty(plan, "pipe", {
1278
1368
  configurable: true,
@@ -1288,6 +1378,7 @@ var makePlan = (state, ast, _assumptions, _capabilities, _statement, _target, _i
1288
1378
  availableNames: undefined,
1289
1379
  grouped: undefined,
1290
1380
  assumptions: _assumptions ?? trueFormula(),
1381
+ facts: _facts ?? undefined,
1291
1382
  capabilities: undefined,
1292
1383
  statement: _statement ?? "select",
1293
1384
  target: _target ?? undefined,
@@ -1372,6 +1463,421 @@ var path = (...segments) => ({
1372
1463
  segments
1373
1464
  });
1374
1465
 
1466
+ // src/internal/runtime/driver-value-mapping.ts
1467
+ import * as Schema3 from "effect/Schema";
1468
+
1469
+ // src/internal/runtime/normalize.ts
1470
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
1471
+ var pad = (value, width = 2) => value.toString().padStart(width, "0");
1472
+ var formatLocalDate = (value) => `${value.getUTCFullYear()}-${pad(value.getUTCMonth() + 1)}-${pad(value.getUTCDate())}`;
1473
+ var formatLocalTime = (value) => {
1474
+ const milliseconds = value.getUTCMilliseconds();
1475
+ const base = `${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}`;
1476
+ return milliseconds === 0 ? base : `${base}.${pad(milliseconds, 3)}`;
1477
+ };
1478
+ var formatLocalDateTime = (value) => {
1479
+ const milliseconds = value.getUTCMilliseconds();
1480
+ const base = `${formatLocalDate(value)}T${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}`;
1481
+ return milliseconds === 0 ? base : `${base}.${pad(milliseconds, 3)}`;
1482
+ };
1483
+ var runtimeTagOfBaseDbType = (dbType) => {
1484
+ return dbType.runtime;
1485
+ };
1486
+ var expectString = (value, label) => {
1487
+ if (typeof value === "string") {
1488
+ return value;
1489
+ }
1490
+ throw new Error(`Expected ${label} as string`);
1491
+ };
1492
+ var normalizeNumber = (value) => {
1493
+ if (typeof value === "number" && Number.isFinite(value)) {
1494
+ return value;
1495
+ }
1496
+ if (typeof value === "string" && value.trim() !== "") {
1497
+ const parsed = Number(value);
1498
+ if (Number.isFinite(parsed)) {
1499
+ return parsed;
1500
+ }
1501
+ }
1502
+ if (typeof value === "bigint" && Number.isSafeInteger(Number(value))) {
1503
+ return Number(value);
1504
+ }
1505
+ throw new Error("Expected a finite numeric value");
1506
+ };
1507
+ var normalizeBoolean = (value) => {
1508
+ if (typeof value === "boolean") {
1509
+ return value;
1510
+ }
1511
+ if (typeof value === "number") {
1512
+ if (value === 1) {
1513
+ return true;
1514
+ }
1515
+ if (value === 0) {
1516
+ return false;
1517
+ }
1518
+ }
1519
+ if (typeof value === "string") {
1520
+ const normalized = value.trim().toLowerCase();
1521
+ if (normalized === "true" || normalized === "t" || normalized === "1") {
1522
+ return true;
1523
+ }
1524
+ if (normalized === "false" || normalized === "f" || normalized === "0") {
1525
+ return false;
1526
+ }
1527
+ }
1528
+ throw new Error("Expected a boolean-like value");
1529
+ };
1530
+ var normalizeBigIntString = (value) => {
1531
+ if (typeof value === "bigint") {
1532
+ return value.toString();
1533
+ }
1534
+ if (typeof value === "number" && Number.isSafeInteger(value)) {
1535
+ return BigInt(value).toString();
1536
+ }
1537
+ if (typeof value === "string" && /^-?\d+$/.test(value.trim())) {
1538
+ return BigInt(value.trim()).toString();
1539
+ }
1540
+ throw new Error("Expected an integer-like bigint value");
1541
+ };
1542
+ var canonicalizeDecimalString = (input) => {
1543
+ const trimmed = input.trim();
1544
+ const match = /^([+-]?)(\d+)(?:\.(\d+))?$/.exec(trimmed);
1545
+ if (match === null) {
1546
+ throw new Error("Expected a decimal string");
1547
+ }
1548
+ const sign = match[1] === "-" ? "-" : "";
1549
+ const integer = match[2].replace(/^0+(?=\d)/, "") || "0";
1550
+ const fraction = (match[3] ?? "").replace(/0+$/, "");
1551
+ if (fraction.length === 0) {
1552
+ return `${sign}${integer}`;
1553
+ }
1554
+ return `${sign}${integer}.${fraction}`;
1555
+ };
1556
+ var normalizeDecimalString = (value) => {
1557
+ if (typeof value === "string") {
1558
+ return canonicalizeDecimalString(value);
1559
+ }
1560
+ if (typeof value === "number" && Number.isFinite(value)) {
1561
+ const rendered = String(value);
1562
+ if (/[eE]/.test(rendered)) {
1563
+ throw new Error("Scientific notation is not a supported decimal runtime");
1564
+ }
1565
+ return canonicalizeDecimalString(rendered);
1566
+ }
1567
+ throw new Error("Expected a decimal-like value");
1568
+ };
1569
+ var normalizeLocalDate = (value) => {
1570
+ if (value instanceof Date) {
1571
+ return formatLocalDate(value);
1572
+ }
1573
+ const raw = expectString(value, "local date").trim();
1574
+ if (/^\d{4}-\d{2}-\d{2}$/.test(raw)) {
1575
+ return raw;
1576
+ }
1577
+ const parsed = new Date(raw);
1578
+ if (!Number.isNaN(parsed.getTime())) {
1579
+ return formatLocalDate(parsed);
1580
+ }
1581
+ throw new Error("Expected a local-date value");
1582
+ };
1583
+ var normalizeLocalTime = (value) => {
1584
+ if (value instanceof Date) {
1585
+ return formatLocalTime(value);
1586
+ }
1587
+ const raw = expectString(value, "local time").trim();
1588
+ if (/^\d{2}:\d{2}:\d{2}(?:\.\d+)?$/.test(raw)) {
1589
+ return raw;
1590
+ }
1591
+ throw new Error("Expected a local-time value");
1592
+ };
1593
+ var normalizeOffsetTime = (value) => {
1594
+ if (value instanceof Date) {
1595
+ return `${formatLocalTime(value)}Z`;
1596
+ }
1597
+ const raw = expectString(value, "offset time").trim();
1598
+ if (/^\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(raw)) {
1599
+ return raw;
1600
+ }
1601
+ throw new Error("Expected an offset-time value");
1602
+ };
1603
+ var normalizeLocalDateTime = (value) => {
1604
+ if (value instanceof Date) {
1605
+ return formatLocalDateTime(value);
1606
+ }
1607
+ const raw = expectString(value, "local datetime").trim();
1608
+ if (/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?$/.test(raw)) {
1609
+ return raw.replace(" ", "T");
1610
+ }
1611
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(raw)) {
1612
+ const parsed = new Date(raw);
1613
+ if (!Number.isNaN(parsed.getTime())) {
1614
+ return formatLocalDateTime(parsed);
1615
+ }
1616
+ }
1617
+ throw new Error("Expected a local-datetime value");
1618
+ };
1619
+ var normalizeInstant = (value) => {
1620
+ if (value instanceof Date) {
1621
+ return value.toISOString();
1622
+ }
1623
+ const raw = expectString(value, "instant").trim();
1624
+ if (!/[zZ]|[+-]\d{2}:\d{2}$/.test(raw)) {
1625
+ throw new Error("Instant values require a timezone offset");
1626
+ }
1627
+ const parsed = new Date(raw);
1628
+ if (Number.isNaN(parsed.getTime())) {
1629
+ throw new Error("Expected an ISO instant value");
1630
+ }
1631
+ return parsed.toISOString();
1632
+ };
1633
+ var normalizeYear = (value) => {
1634
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 9999) {
1635
+ return pad(value, 4);
1636
+ }
1637
+ const raw = expectString(value, "year").trim();
1638
+ if (/^\d{4}$/.test(raw)) {
1639
+ return raw;
1640
+ }
1641
+ throw new Error("Expected a four-digit year");
1642
+ };
1643
+ var normalizeBytes = (value) => {
1644
+ if (value instanceof Uint8Array) {
1645
+ return new Uint8Array(value);
1646
+ }
1647
+ const BufferConstructor = globalThis.Buffer;
1648
+ if (BufferConstructor !== undefined && value instanceof BufferConstructor) {
1649
+ return new Uint8Array(value);
1650
+ }
1651
+ throw new Error("Expected a byte array value");
1652
+ };
1653
+ var isJsonValue = (value) => {
1654
+ if (value === null) {
1655
+ return true;
1656
+ }
1657
+ switch (typeof value) {
1658
+ case "string":
1659
+ case "number":
1660
+ case "boolean":
1661
+ return true;
1662
+ case "object":
1663
+ if (Array.isArray(value)) {
1664
+ return value.every(isJsonValue);
1665
+ }
1666
+ return isRecord(value) && Object.values(value).every(isJsonValue);
1667
+ default:
1668
+ return false;
1669
+ }
1670
+ };
1671
+ var normalizeJson = (value) => {
1672
+ if (typeof value === "string") {
1673
+ const parsed = JSON.parse(value);
1674
+ if (isJsonValue(parsed)) {
1675
+ return parsed;
1676
+ }
1677
+ throw new Error("Parsed JSON value is not a valid JSON runtime");
1678
+ }
1679
+ if (isJsonValue(value)) {
1680
+ return value;
1681
+ }
1682
+ throw new Error("Expected a JSON value");
1683
+ };
1684
+ var normalizeDbValue = (dbType, value) => {
1685
+ if (value === null) {
1686
+ return null;
1687
+ }
1688
+ if ("base" in dbType) {
1689
+ return normalizeDbValue(dbType.base, value);
1690
+ }
1691
+ if ("element" in dbType) {
1692
+ if (!Array.isArray(value)) {
1693
+ throw new Error("Expected an array value");
1694
+ }
1695
+ return value.map((entry) => normalizeDbValue(dbType.element, entry));
1696
+ }
1697
+ if ("fields" in dbType) {
1698
+ if (!isRecord(value)) {
1699
+ throw new Error("Expected a record value");
1700
+ }
1701
+ const normalized = {};
1702
+ for (const [key2, fieldDbType] of Object.entries(dbType.fields)) {
1703
+ if (key2 in value) {
1704
+ normalized[key2] = normalizeDbValue(fieldDbType, value[key2]);
1705
+ }
1706
+ }
1707
+ return normalized;
1708
+ }
1709
+ if ("variant" in dbType && dbType.variant === "json") {
1710
+ return normalizeJson(value);
1711
+ }
1712
+ if ("variant" in dbType && (dbType.variant === "enum" || dbType.variant === "set")) {
1713
+ return expectString(value, "text");
1714
+ }
1715
+ switch (runtimeTagOfBaseDbType(dbType)) {
1716
+ case "string":
1717
+ return expectString(value, "text");
1718
+ case "number":
1719
+ return normalizeNumber(value);
1720
+ case "bigintString":
1721
+ return normalizeBigIntString(value);
1722
+ case "boolean":
1723
+ return normalizeBoolean(value);
1724
+ case "json":
1725
+ return normalizeJson(value);
1726
+ case "localDate":
1727
+ return normalizeLocalDate(value);
1728
+ case "localTime":
1729
+ return normalizeLocalTime(value);
1730
+ case "offsetTime":
1731
+ return normalizeOffsetTime(value);
1732
+ case "localDateTime":
1733
+ return normalizeLocalDateTime(value);
1734
+ case "instant":
1735
+ return normalizeInstant(value);
1736
+ case "year":
1737
+ return normalizeYear(value);
1738
+ case "decimalString":
1739
+ return normalizeDecimalString(value);
1740
+ case "bytes":
1741
+ return normalizeBytes(value);
1742
+ case "array":
1743
+ if (!Array.isArray(value)) {
1744
+ throw new Error("Expected an array value");
1745
+ }
1746
+ return value;
1747
+ case "record":
1748
+ if (!isRecord(value)) {
1749
+ throw new Error("Expected a record value");
1750
+ }
1751
+ return value;
1752
+ case "null":
1753
+ return null;
1754
+ case "unknown":
1755
+ case undefined:
1756
+ return value;
1757
+ }
1758
+ };
1759
+
1760
+ // src/internal/runtime/driver-value-mapping.ts
1761
+ var runtimeTagOfDbType = (dbType) => {
1762
+ if (dbType === undefined) {
1763
+ return;
1764
+ }
1765
+ if ("base" in dbType) {
1766
+ return runtimeTagOfDbType(dbType.base);
1767
+ }
1768
+ if ("element" in dbType) {
1769
+ return "array";
1770
+ }
1771
+ if ("fields" in dbType) {
1772
+ return "record";
1773
+ }
1774
+ if ("variant" in dbType && dbType.variant === "json") {
1775
+ return "json";
1776
+ }
1777
+ if ("variant" in dbType && (dbType.variant === "enum" || dbType.variant === "set")) {
1778
+ return "string";
1779
+ }
1780
+ return dbType.runtime;
1781
+ };
1782
+ var familyOfDbType = (dbType) => {
1783
+ if (dbType === undefined) {
1784
+ return;
1785
+ }
1786
+ if ("base" in dbType) {
1787
+ return familyOfDbType(dbType.base);
1788
+ }
1789
+ return dbType.family;
1790
+ };
1791
+ var mappingCandidates = (context) => {
1792
+ const dbType = context.dbType;
1793
+ const runtimeTag = runtimeTagOfDbType(dbType);
1794
+ const family = familyOfDbType(dbType);
1795
+ return [
1796
+ context.driverValueMapping,
1797
+ dbType?.driverValueMapping,
1798
+ dbType === undefined ? undefined : context.valueMappings?.[dbType.kind],
1799
+ family === undefined ? undefined : context.valueMappings?.[family],
1800
+ runtimeTag === undefined ? undefined : context.valueMappings?.[runtimeTag]
1801
+ ];
1802
+ };
1803
+ var findMapping = (context, key2) => {
1804
+ for (const candidate of mappingCandidates(context)) {
1805
+ const value = candidate?.[key2];
1806
+ if (value !== undefined) {
1807
+ return value;
1808
+ }
1809
+ }
1810
+ return;
1811
+ };
1812
+ var encodeWithSchema = (schema2, value) => {
1813
+ if (schema2 === undefined) {
1814
+ return { value, encoded: false };
1815
+ }
1816
+ if (!Schema3.is(schema2)(value)) {
1817
+ return { value, encoded: false };
1818
+ }
1819
+ return {
1820
+ value: Schema3.encodeUnknownSync(schema2)(value),
1821
+ encoded: true
1822
+ };
1823
+ };
1824
+ var toDriverValue = (value, context) => {
1825
+ if (value === null) {
1826
+ return null;
1827
+ }
1828
+ const dbType = context.dbType;
1829
+ const encoded = encodeWithSchema(context.runtimeSchema, value);
1830
+ let current = encoded.value;
1831
+ const custom = findMapping(context, "toDriver");
1832
+ if (custom !== undefined && dbType !== undefined) {
1833
+ return custom(current, dbType);
1834
+ }
1835
+ return dbType === undefined || !encoded.encoded ? current : normalizeDbValue(dbType, current);
1836
+ };
1837
+ var fromDriverValue = (value, context) => {
1838
+ if (value === null) {
1839
+ return null;
1840
+ }
1841
+ const dbType = context.dbType;
1842
+ const custom = findMapping(context, "fromDriver");
1843
+ if (custom !== undefined && dbType !== undefined) {
1844
+ return custom(value, dbType);
1845
+ }
1846
+ return dbType === undefined ? value : normalizeDbValue(dbType, value);
1847
+ };
1848
+ var textCast = (sql) => `(${sql})::text`;
1849
+ var postgresJsonSql = (sql, dbType) => {
1850
+ const runtimeTag = runtimeTagOfDbType(dbType);
1851
+ switch (runtimeTag) {
1852
+ case "bigintString":
1853
+ case "decimalString":
1854
+ case "localDate":
1855
+ case "localTime":
1856
+ case "offsetTime":
1857
+ case "localDateTime":
1858
+ case "instant":
1859
+ case "year":
1860
+ return textCast(sql);
1861
+ case "bytes":
1862
+ return `encode(${sql}, 'base64')`;
1863
+ default:
1864
+ return sql;
1865
+ }
1866
+ };
1867
+ var renderSelectSql = (sql, context) => {
1868
+ const dbType = context.dbType;
1869
+ const custom = findMapping(context, "selectSql");
1870
+ return custom !== undefined && dbType !== undefined ? custom(sql, dbType) : sql;
1871
+ };
1872
+ var renderJsonSelectSql = (sql, context) => {
1873
+ const dbType = context.dbType;
1874
+ const custom = findMapping(context, "jsonSelectSql");
1875
+ if (custom !== undefined && dbType !== undefined) {
1876
+ return custom(sql, dbType);
1877
+ }
1878
+ return context.dialect === "postgres" && dbType !== undefined ? postgresJsonSql(sql, dbType) : sql;
1879
+ };
1880
+
1375
1881
  // src/internal/projection-alias.ts
1376
1882
  var TypeId8 = Symbol.for("effect-qb/ProjectionAlias");
1377
1883
 
@@ -1714,8 +2220,27 @@ var renderPostgresJsonValue = (value, state, dialect) => {
1714
2220
  throw new Error("Expected a JSON expression");
1715
2221
  }
1716
2222
  const rendered = renderExpression(value, state, dialect);
2223
+ const ast = value[TypeId3];
2224
+ if (ast.kind === "literal") {
2225
+ return `cast(${rendered} as jsonb)`;
2226
+ }
1717
2227
  return value[TypeId2].dbType.kind === "jsonb" ? rendered : `cast(${rendered} as jsonb)`;
1718
2228
  };
2229
+ var expressionDriverContext = (expression, state, dialect) => ({
2230
+ dialect: dialect.name,
2231
+ valueMappings: state.valueMappings,
2232
+ dbType: expression[TypeId2].dbType,
2233
+ runtimeSchema: expression[TypeId2].runtimeSchema,
2234
+ driverValueMapping: expression[TypeId2].driverValueMapping
2235
+ });
2236
+ var renderJsonInputExpression = (expression, state, dialect) => renderJsonSelectSql(renderExpression(expression, state, dialect), expressionDriverContext(expression, state, dialect));
2237
+ var encodeArrayValues = (values, column, state, dialect) => values.map((value) => toDriverValue(value, {
2238
+ dialect: dialect.name,
2239
+ valueMappings: state.valueMappings,
2240
+ dbType: column.metadata.dbType,
2241
+ runtimeSchema: column.schema,
2242
+ driverValueMapping: column.metadata.driverValueMapping
2243
+ }));
1719
2244
  var renderPostgresJsonKind = (value) => value[TypeId2].dbType.kind === "jsonb" ? "jsonb" : "json";
1720
2245
  var renderJsonOpaquePath = (value, state, dialect) => {
1721
2246
  if (isJsonPathValue(value)) {
@@ -1844,7 +2369,7 @@ var renderJsonExpression = (expression, ast, state, dialect) => {
1844
2369
  const entries = Array.isArray(ast.entries) ? ast.entries : [];
1845
2370
  const renderedEntries = entries.flatMap((entry) => [
1846
2371
  dialect.renderLiteral(entry.key, state),
1847
- renderExpression(entry.value, state, dialect)
2372
+ renderJsonInputExpression(entry.value, state, dialect)
1848
2373
  ]);
1849
2374
  if (dialect.name === "postgres") {
1850
2375
  return `${postgresExpressionKind === "jsonb" ? "jsonb" : "json"}_build_object(${renderedEntries.join(", ")})`;
@@ -1856,7 +2381,7 @@ var renderJsonExpression = (expression, ast, state, dialect) => {
1856
2381
  }
1857
2382
  case "jsonBuildArray": {
1858
2383
  const values = Array.isArray(ast.values) ? ast.values : [];
1859
- const renderedValues = values.map((value) => renderExpression(value, state, dialect)).join(", ");
2384
+ const renderedValues = values.map((value) => renderJsonInputExpression(value, state, dialect)).join(", ");
1860
2385
  if (dialect.name === "postgres") {
1861
2386
  return `${postgresExpressionKind === "jsonb" ? "jsonb" : "json"}_build_array(${renderedValues})`;
1862
2387
  }
@@ -1870,7 +2395,7 @@ var renderJsonExpression = (expression, ast, state, dialect) => {
1870
2395
  return;
1871
2396
  }
1872
2397
  if (dialect.name === "postgres") {
1873
- return `to_json(${renderExpression(base, state, dialect)})`;
2398
+ return `to_json(${renderJsonInputExpression(base, state, dialect)})`;
1874
2399
  }
1875
2400
  if (dialect.name === "mysql") {
1876
2401
  return `cast(${renderExpression(base, state, dialect)} as json)`;
@@ -1881,7 +2406,7 @@ var renderJsonExpression = (expression, ast, state, dialect) => {
1881
2406
  return;
1882
2407
  }
1883
2408
  if (dialect.name === "postgres") {
1884
- return `to_jsonb(${renderExpression(base, state, dialect)})`;
2409
+ return `to_jsonb(${renderJsonInputExpression(base, state, dialect)})`;
1885
2410
  }
1886
2411
  if (dialect.name === "mysql") {
1887
2412
  return `cast(${renderExpression(base, state, dialect)} as json)`;
@@ -2068,7 +2593,7 @@ var renderSelectionList = (selection, state, dialect, validateAggregation) => {
2068
2593
  }
2069
2594
  const flattened = flattenSelection(selection);
2070
2595
  const projections = selectionProjections(selection);
2071
- const sql = flattened.map(({ expression, alias: alias2 }) => `${renderExpression(expression, state, dialect)} as ${dialect.quoteIdentifier(alias2)}`).join(", ");
2596
+ const sql = flattened.map(({ expression, alias: alias2 }) => `${renderSelectSql(renderExpression(expression, state, dialect), expressionDriverContext(expression, state, dialect))} as ${dialect.quoteIdentifier(alias2)}`).join(", ");
2072
2597
  return {
2073
2598
  sql,
2074
2599
  projections
@@ -2148,11 +2673,11 @@ var renderQueryAst = (ast, state, dialect) => {
2148
2673
  if (dialect.name === "postgres") {
2149
2674
  const table = targetSource.source;
2150
2675
  const fields = table[TypeId4].fields;
2151
- const rendered = unnestSource.values.map((entry) => `cast(${dialect.renderLiteral(entry.values, state)} as ${renderCastType(dialect, fields[entry.columnName].metadata.dbType)}[])`).join(", ");
2676
+ const rendered = unnestSource.values.map((entry) => `cast(${dialect.renderLiteral(encodeArrayValues(entry.values, fields[entry.columnName], state, dialect), state)} as ${renderCastType(dialect, fields[entry.columnName].metadata.dbType)}[])`).join(", ");
2152
2677
  sql += ` (${columns}) select * from unnest(${rendered})`;
2153
2678
  } else {
2154
2679
  const rowCount = unnestSource.values[0]?.values.length ?? 0;
2155
- const rows = Array.from({ length: rowCount }, (_, index3) => `(${unnestSource.values.map((entry) => dialect.renderLiteral(entry.values[index3], state)).join(", ")})`).join(", ");
2680
+ const rows = Array.from({ length: rowCount }, (_, index3) => `(${unnestSource.values.map((entry) => dialect.renderLiteral(entry.values[index3], state, targetSource.source[TypeId4].fields[entry.columnName][TypeId2])).join(", ")})`).join(", ");
2156
2681
  sql += ` (${columns}) values ${rows}`;
2157
2682
  }
2158
2683
  } else {
@@ -2413,7 +2938,7 @@ var renderExpression = (expression, state, dialect) => {
2413
2938
  case "column":
2414
2939
  return ast.tableName.length === 0 ? dialect.quoteIdentifier(ast.columnName) : `${dialect.quoteIdentifier(ast.tableName)}.${dialect.quoteIdentifier(ast.columnName)}`;
2415
2940
  case "literal":
2416
- return dialect.renderLiteral(ast.value, state);
2941
+ return dialect.renderLiteral(ast.value, state, expression[TypeId2]);
2417
2942
  case "excluded":
2418
2943
  return dialect.name === "mysql" ? `values(${dialect.quoteIdentifier(ast.columnName)})` : `excluded.${dialect.quoteIdentifier(ast.columnName)}`;
2419
2944
  case "cast":
@@ -2555,14 +3080,19 @@ import { parse as parse2, toSql as toSql2 } from "pgsql-ast-parser";
2555
3080
 
2556
3081
  // src/postgres/internal/dialect.ts
2557
3082
  var quoteIdentifier = (value) => `"${value.replaceAll('"', '""')}"`;
2558
- var renderLiteral = (value, state) => {
2559
- if (value === null) {
3083
+ var renderLiteral = (value, state, context = {}) => {
3084
+ const driverValue = toDriverValue(value, {
3085
+ dialect: "postgres",
3086
+ valueMappings: state.valueMappings,
3087
+ ...context
3088
+ });
3089
+ if (driverValue === null) {
2560
3090
  return "null";
2561
3091
  }
2562
- if (typeof value === "boolean") {
2563
- return value ? "true" : "false";
3092
+ if (typeof driverValue === "boolean") {
3093
+ return driverValue ? "true" : "false";
2564
3094
  }
2565
- state.params.push(value);
3095
+ state.params.push(driverValue);
2566
3096
  return `$${state.params.length}`;
2567
3097
  };
2568
3098
  var postgresDialect = {
@@ -2652,7 +3182,7 @@ var normalizeDdlExpressionSql = (expression) => {
2652
3182
  };
2653
3183
 
2654
3184
  // src/postgres/schema-management.ts
2655
- import * as Schema3 from "effect/Schema";
3185
+ import * as Schema4 from "effect/Schema";
2656
3186
  import { pipeArguments as pipeArguments5 } from "effect/Pipeable";
2657
3187
  var EnumTypeId = Symbol.for("effect-qb/SchemaManagement/Enum");
2658
3188
  var SequenceTypeId = Symbol.for("effect-qb/SchemaManagement/Sequence");
@@ -2671,8 +3201,8 @@ var EnumProto = {
2671
3201
  };
2672
3202
  },
2673
3203
  column() {
2674
- const values = this.values.map((value) => Schema3.Literal(value));
2675
- return makeColumnDefinition(values.length === 1 ? values[0] : Schema3.Union(...values), {
3204
+ const values = this.values.map((value) => Schema4.Literal(value));
3205
+ return makeColumnDefinition(values.length === 1 ? values[0] : Schema4.Union(...values), {
2676
3206
  dbType: this.type(),
2677
3207
  nullable: false,
2678
3208
  hasDefault: false,