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.
- package/dist/mysql.js +362 -70
- package/dist/postgres/metadata.js +557 -27
- package/dist/postgres.js +5028 -4732
- package/package.json +2 -2
- package/src/internal/column-state.ts +7 -0
- package/src/internal/column.ts +22 -0
- package/src/internal/dialect.ts +12 -1
- package/src/internal/executor.ts +15 -4
- package/src/internal/predicate/analysis.ts +103 -1
- package/src/internal/predicate/atom.ts +7 -0
- package/src/internal/predicate/context.ts +156 -16
- package/src/internal/predicate/key.ts +46 -1
- package/src/internal/predicate/normalize.ts +115 -34
- package/src/internal/predicate/runtime.ts +118 -11
- package/src/internal/query.ts +328 -90
- package/src/internal/renderer.ts +4 -0
- package/src/internal/runtime/driver-value-mapping.ts +186 -0
- package/src/internal/scalar.ts +11 -0
- package/src/mysql/column.ts +1 -0
- package/src/mysql/executor.ts +20 -5
- package/src/mysql/internal/dialect.ts +12 -6
- package/src/mysql/internal/dsl.ts +268 -54
- package/src/mysql/internal/renderer.ts +11 -2
- package/src/mysql/internal/sql-expression-renderer.ts +54 -8
- package/src/mysql/renderer.ts +7 -2
- package/src/postgres/cast.ts +22 -7
- package/src/postgres/column.ts +1 -0
- package/src/postgres/executor.ts +20 -5
- package/src/postgres/internal/dialect.ts +12 -6
- package/src/postgres/internal/dsl.ts +285 -58
- package/src/postgres/internal/renderer.ts +11 -2
- package/src/postgres/internal/sql-expression-renderer.ts +60 -8
- package/src/postgres/renderer.ts +7 -2
- package/src/postgres/type.ts +4 -0
|
@@ -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 =
|
|
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 =
|
|
978
|
-
const rightKey =
|
|
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 =
|
|
1026
|
-
const rightKey =
|
|
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 =
|
|
1070
|
-
const rightKey =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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) =>
|
|
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(${
|
|
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(${
|
|
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
|
-
|
|
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
|
|
2563
|
-
return
|
|
3092
|
+
if (typeof driverValue === "boolean") {
|
|
3093
|
+
return driverValue ? "true" : "false";
|
|
2564
3094
|
}
|
|
2565
|
-
state.params.push(
|
|
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
|
|
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) =>
|
|
2675
|
-
return makeColumnDefinition(values.length === 1 ? values[0] :
|
|
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,
|