@prisma/client-engine-runtime 6.15.0-dev.3 → 6.15.0-dev.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +27 -53
- package/dist/index.d.ts +27 -53
- package/dist/index.js +126 -148
- package/dist/index.mjs +126 -146
- package/dist/interpreter/generators.d.ts +1 -2
- package/dist/interpreter/render-query.d.ts +2 -2
- package/dist/query-plan.d.ts +23 -48
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -39,8 +39,6 @@ __export(index_exports, {
|
|
|
39
39
|
deserializeJsonResponse: () => deserializeJsonResponse,
|
|
40
40
|
doKeysMatch: () => doKeysMatch,
|
|
41
41
|
isDeepStrictEqual: () => isDeepStrictEqual,
|
|
42
|
-
isPrismaValueBigInt: () => isPrismaValueBigInt,
|
|
43
|
-
isPrismaValueBytes: () => isPrismaValueBytes,
|
|
44
42
|
isPrismaValueGenerator: () => isPrismaValueGenerator,
|
|
45
43
|
isPrismaValuePlaceholder: () => isPrismaValuePlaceholder,
|
|
46
44
|
noopTracingHelper: () => noopTracingHelper,
|
|
@@ -447,15 +445,15 @@ var DataMapperError = class extends Error {
|
|
|
447
445
|
};
|
|
448
446
|
function applyDataMap(data, structure, enums) {
|
|
449
447
|
switch (structure.type) {
|
|
450
|
-
case "
|
|
448
|
+
case "affectedRows":
|
|
451
449
|
if (typeof data !== "number") {
|
|
452
450
|
throw new DataMapperError(`Expected an affected rows count, got: ${typeof data} (${data})`);
|
|
453
451
|
}
|
|
454
452
|
return { count: data };
|
|
455
|
-
case "
|
|
453
|
+
case "object":
|
|
456
454
|
return mapArrayOrObject(data, structure.fields, enums, structure.skipNulls);
|
|
457
|
-
case "
|
|
458
|
-
return mapValue(data, "<result>", structure.
|
|
455
|
+
case "field":
|
|
456
|
+
return mapValue(data, "<result>", structure.fieldType, enums);
|
|
459
457
|
default:
|
|
460
458
|
assertNever(structure, `Invalid data mapping type: '${structure.type}'`);
|
|
461
459
|
}
|
|
@@ -493,10 +491,10 @@ function mapObject(data, fields, enums) {
|
|
|
493
491
|
const result = {};
|
|
494
492
|
for (const [name, node] of Object.entries(fields)) {
|
|
495
493
|
switch (node.type) {
|
|
496
|
-
case "
|
|
494
|
+
case "affectedRows": {
|
|
497
495
|
throw new DataMapperError(`Unexpected 'AffectedRows' node in data mapping for field '${name}'`);
|
|
498
496
|
}
|
|
499
|
-
case "
|
|
497
|
+
case "object": {
|
|
500
498
|
if (node.serializedName !== null && !Object.hasOwn(data, node.serializedName)) {
|
|
501
499
|
throw new DataMapperError(
|
|
502
500
|
`Missing data field (Object): '${name}'; node: ${JSON.stringify(node)}; data: ${JSON.stringify(data)}`
|
|
@@ -506,11 +504,11 @@ function mapObject(data, fields, enums) {
|
|
|
506
504
|
result[name] = mapArrayOrObject(target, node.fields, enums, node.skipNulls);
|
|
507
505
|
break;
|
|
508
506
|
}
|
|
509
|
-
case "
|
|
507
|
+
case "field":
|
|
510
508
|
{
|
|
511
509
|
const dbName = node.dbName;
|
|
512
510
|
if (Object.hasOwn(data, dbName)) {
|
|
513
|
-
result[name] =
|
|
511
|
+
result[name] = mapField(data[dbName], dbName, node.fieldType, enums);
|
|
514
512
|
} else {
|
|
515
513
|
throw new DataMapperError(
|
|
516
514
|
`Missing data field (Value): '${dbName}'; node: ${JSON.stringify(node)}; data: ${JSON.stringify(data)}`
|
|
@@ -524,20 +522,27 @@ function mapObject(data, fields, enums) {
|
|
|
524
522
|
}
|
|
525
523
|
return result;
|
|
526
524
|
}
|
|
527
|
-
function
|
|
525
|
+
function mapField(value, columnName, fieldType, enums) {
|
|
528
526
|
if (value === null) {
|
|
529
|
-
return
|
|
527
|
+
return fieldType.arity === "list" ? [] : null;
|
|
530
528
|
}
|
|
531
|
-
|
|
532
|
-
|
|
529
|
+
if (fieldType.arity === "list") {
|
|
530
|
+
const values = value;
|
|
531
|
+
return values.map((v, i) => mapValue(v, `${columnName}[${i}]`, fieldType, enums));
|
|
532
|
+
}
|
|
533
|
+
return mapValue(value, columnName, fieldType, enums);
|
|
534
|
+
}
|
|
535
|
+
function mapValue(value, columnName, scalarType, enums) {
|
|
536
|
+
switch (scalarType.type) {
|
|
537
|
+
case "unsupported":
|
|
533
538
|
return value;
|
|
534
|
-
case "
|
|
539
|
+
case "string": {
|
|
535
540
|
if (typeof value !== "string") {
|
|
536
541
|
throw new DataMapperError(`Expected a string in column '${columnName}', got ${typeof value}: ${value}`);
|
|
537
542
|
}
|
|
538
543
|
return value;
|
|
539
544
|
}
|
|
540
|
-
case "
|
|
545
|
+
case "int": {
|
|
541
546
|
switch (typeof value) {
|
|
542
547
|
case "number": {
|
|
543
548
|
return Math.trunc(value);
|
|
@@ -558,13 +563,13 @@ function mapValue(value, columnName, resultType, enums) {
|
|
|
558
563
|
throw new DataMapperError(`Expected an integer in column '${columnName}', got ${typeof value}: ${value}`);
|
|
559
564
|
}
|
|
560
565
|
}
|
|
561
|
-
case "
|
|
566
|
+
case "bigint": {
|
|
562
567
|
if (typeof value !== "number" && typeof value !== "string") {
|
|
563
568
|
throw new DataMapperError(`Expected a bigint in column '${columnName}', got ${typeof value}: ${value}`);
|
|
564
569
|
}
|
|
565
570
|
return { $type: "BigInt", value };
|
|
566
571
|
}
|
|
567
|
-
case "
|
|
572
|
+
case "float": {
|
|
568
573
|
if (typeof value === "number") return value;
|
|
569
574
|
if (typeof value === "string") {
|
|
570
575
|
const parsedValue = Number(value);
|
|
@@ -575,7 +580,7 @@ function mapValue(value, columnName, resultType, enums) {
|
|
|
575
580
|
}
|
|
576
581
|
throw new DataMapperError(`Expected a float in column '${columnName}', got ${typeof value}: ${value}`);
|
|
577
582
|
}
|
|
578
|
-
case "
|
|
583
|
+
case "boolean": {
|
|
579
584
|
if (typeof value === "boolean") return value;
|
|
580
585
|
if (typeof value === "number") return value === 1;
|
|
581
586
|
if (typeof value === "string") {
|
|
@@ -587,7 +592,7 @@ function mapValue(value, columnName, resultType, enums) {
|
|
|
587
592
|
throw new DataMapperError(`Expected a boolean in column '${columnName}', got ${typeof value}: ${value}`);
|
|
588
593
|
}
|
|
589
594
|
}
|
|
590
|
-
if (value
|
|
595
|
+
if (Array.isArray(value)) {
|
|
591
596
|
for (const byte of value) {
|
|
592
597
|
if (byte !== 0) return true;
|
|
593
598
|
}
|
|
@@ -595,37 +600,27 @@ function mapValue(value, columnName, resultType, enums) {
|
|
|
595
600
|
}
|
|
596
601
|
throw new DataMapperError(`Expected a boolean in column '${columnName}', got ${typeof value}: ${value}`);
|
|
597
602
|
}
|
|
598
|
-
case "
|
|
603
|
+
case "decimal":
|
|
599
604
|
if (typeof value !== "number" && typeof value !== "string" && !import_decimal3.default.isDecimal(value)) {
|
|
600
605
|
throw new DataMapperError(`Expected a decimal in column '${columnName}', got ${typeof value}: ${value}`);
|
|
601
606
|
}
|
|
602
607
|
return { $type: "Decimal", value };
|
|
603
|
-
case "
|
|
608
|
+
case "datetime": {
|
|
604
609
|
if (typeof value === "string") {
|
|
605
|
-
return { $type: "DateTime", value:
|
|
610
|
+
return { $type: "DateTime", value: normalizeDateTime(value) };
|
|
606
611
|
}
|
|
607
612
|
if (typeof value === "number" || value instanceof Date) {
|
|
608
613
|
return { $type: "DateTime", value };
|
|
609
614
|
}
|
|
610
615
|
throw new DataMapperError(`Expected a date in column '${columnName}', got ${typeof value}: ${value}`);
|
|
611
616
|
}
|
|
612
|
-
case "
|
|
613
|
-
if (typeof value === "string") {
|
|
614
|
-
return { $type: "DateTime", value: `1970-01-01T${ensureTimezoneInIsoString(value)}` };
|
|
615
|
-
}
|
|
616
|
-
throw new DataMapperError(`Expected a time in column '${columnName}', got ${typeof value}: ${value}`);
|
|
617
|
-
}
|
|
618
|
-
case "Array": {
|
|
619
|
-
const values = value;
|
|
620
|
-
return values.map((v, i) => mapValue(v, `${columnName}[${i}]`, resultType.inner, enums));
|
|
621
|
-
}
|
|
622
|
-
case "Object": {
|
|
617
|
+
case "object": {
|
|
623
618
|
return { $type: "Json", value: safeJsonStringify(value) };
|
|
624
619
|
}
|
|
625
|
-
case "
|
|
620
|
+
case "json": {
|
|
626
621
|
return { $type: "Json", value: `${value}` };
|
|
627
622
|
}
|
|
628
|
-
case "
|
|
623
|
+
case "bytes": {
|
|
629
624
|
if (typeof value === "string" && value.startsWith("\\x")) {
|
|
630
625
|
return { $type: "Bytes", value: Buffer.from(value.slice(2), "hex").toString("base64") };
|
|
631
626
|
}
|
|
@@ -637,31 +632,38 @@ function mapValue(value, columnName, resultType, enums) {
|
|
|
637
632
|
}
|
|
638
633
|
throw new DataMapperError(`Expected a byte array in column '${columnName}', got ${typeof value}: ${value}`);
|
|
639
634
|
}
|
|
640
|
-
case "
|
|
641
|
-
const enumDef = enums[
|
|
635
|
+
case "enum": {
|
|
636
|
+
const enumDef = enums[scalarType.name];
|
|
642
637
|
if (enumDef === void 0) {
|
|
643
|
-
throw new DataMapperError(`Unknown enum '${
|
|
638
|
+
throw new DataMapperError(`Unknown enum '${scalarType.name}'`);
|
|
644
639
|
}
|
|
645
640
|
const enumValue = enumDef[`${value}`];
|
|
646
641
|
if (enumValue === void 0) {
|
|
647
|
-
throw new DataMapperError(`Value '${value}' not found in enum '${
|
|
642
|
+
throw new DataMapperError(`Value '${value}' not found in enum '${scalarType.name}'`);
|
|
648
643
|
}
|
|
649
644
|
return enumValue;
|
|
650
645
|
}
|
|
651
646
|
default:
|
|
652
|
-
assertNever(
|
|
647
|
+
assertNever(scalarType, `DataMapper: Unknown result type: ${scalarType["type"]}`);
|
|
653
648
|
}
|
|
654
649
|
}
|
|
655
|
-
var
|
|
656
|
-
function
|
|
657
|
-
const
|
|
658
|
-
if (
|
|
650
|
+
var TIME_TZ_PATTERN = /\d{2}:\d{2}:\d{2}(?:\.\d+)?(Z|[+-]\d{2}(:?\d{2})?)?$/;
|
|
651
|
+
function normalizeDateTime(dt) {
|
|
652
|
+
const matches = TIME_TZ_PATTERN.exec(dt);
|
|
653
|
+
if (matches === null) {
|
|
659
654
|
return `${dt}Z`;
|
|
660
|
-
} else if (results[0] !== "Z" && results[1] === void 0) {
|
|
661
|
-
return `${dt}:00`;
|
|
662
|
-
} else {
|
|
663
|
-
return dt;
|
|
664
655
|
}
|
|
656
|
+
let dtWithTz = dt;
|
|
657
|
+
const [timeTz, tz, tzMinuteOffset] = matches;
|
|
658
|
+
if (tz !== void 0 && tz !== "Z" && tzMinuteOffset === void 0) {
|
|
659
|
+
dtWithTz = `${dt}:00`;
|
|
660
|
+
} else if (tz === void 0) {
|
|
661
|
+
dtWithTz = `${dt}Z`;
|
|
662
|
+
}
|
|
663
|
+
if (timeTz.length === dt.length) {
|
|
664
|
+
return `1970-01-01T${dtWithTz}`;
|
|
665
|
+
}
|
|
666
|
+
return dtWithTz;
|
|
665
667
|
}
|
|
666
668
|
|
|
667
669
|
// src/tracing.ts
|
|
@@ -740,10 +742,10 @@ var GeneratorRegistry = class {
|
|
|
740
742
|
* method being called, meaning that the built-in time-based generators will always return
|
|
741
743
|
* the same value on repeated calls as long as the same snapshot is used.
|
|
742
744
|
*/
|
|
743
|
-
snapshot(
|
|
745
|
+
snapshot() {
|
|
744
746
|
return Object.create(this.#generators, {
|
|
745
747
|
now: {
|
|
746
|
-
value:
|
|
748
|
+
value: new NowGenerator()
|
|
747
749
|
}
|
|
748
750
|
});
|
|
749
751
|
}
|
|
@@ -760,12 +762,6 @@ var NowGenerator = class {
|
|
|
760
762
|
return this.#now.toISOString();
|
|
761
763
|
}
|
|
762
764
|
};
|
|
763
|
-
var MysqlNowGenerator = class {
|
|
764
|
-
#now = /* @__PURE__ */ new Date();
|
|
765
|
-
generate() {
|
|
766
|
-
return this.#now.toISOString().replace("T", " ").replace("Z", "");
|
|
767
|
-
}
|
|
768
|
-
};
|
|
769
765
|
var UuidGenerator = class {
|
|
770
766
|
generate(arg) {
|
|
771
767
|
if (arg === 4) {
|
|
@@ -919,74 +915,82 @@ function isPrismaValuePlaceholder(value) {
|
|
|
919
915
|
function isPrismaValueGenerator(value) {
|
|
920
916
|
return typeof value === "object" && value !== null && value["prisma__type"] === "generatorCall";
|
|
921
917
|
}
|
|
922
|
-
function isPrismaValueBytes(value) {
|
|
923
|
-
return typeof value === "object" && value !== null && value["prisma__type"] === "bytes";
|
|
924
|
-
}
|
|
925
|
-
function isPrismaValueBigInt(value) {
|
|
926
|
-
return typeof value === "object" && value !== null && value["prisma__type"] === "bigint";
|
|
927
|
-
}
|
|
928
918
|
|
|
929
919
|
// src/interpreter/render-query.ts
|
|
930
920
|
function renderQuery(dbQuery, scope, generators, maxChunkSize) {
|
|
931
|
-
const
|
|
932
|
-
|
|
933
|
-
switch (queryType) {
|
|
921
|
+
const args = dbQuery.args.map((arg) => evaluateArg(arg, scope, generators));
|
|
922
|
+
switch (dbQuery.type) {
|
|
934
923
|
case "rawSql":
|
|
935
|
-
return [renderRawSql(dbQuery.sql,
|
|
924
|
+
return [renderRawSql(dbQuery.sql, args, dbQuery.argTypes)];
|
|
936
925
|
case "templateSql": {
|
|
937
|
-
const chunks = dbQuery.chunkable ? chunkParams(dbQuery.fragments,
|
|
938
|
-
return chunks.map((
|
|
939
|
-
if (maxChunkSize !== void 0 &&
|
|
926
|
+
const chunks = dbQuery.chunkable ? chunkParams(dbQuery.fragments, args, maxChunkSize) : [args];
|
|
927
|
+
return chunks.map((params) => {
|
|
928
|
+
if (maxChunkSize !== void 0 && params.length > maxChunkSize) {
|
|
940
929
|
throw new UserFacingError("The query parameter limit supported by your database is exceeded.", "P2029");
|
|
941
930
|
}
|
|
942
|
-
return renderTemplateSql(dbQuery.fragments, dbQuery.placeholderFormat,
|
|
931
|
+
return renderTemplateSql(dbQuery.fragments, dbQuery.placeholderFormat, params, dbQuery.argTypes);
|
|
943
932
|
});
|
|
944
933
|
}
|
|
945
934
|
default:
|
|
946
|
-
assertNever(
|
|
935
|
+
assertNever(dbQuery["type"], `Invalid query type`);
|
|
947
936
|
}
|
|
948
937
|
}
|
|
949
|
-
function
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
let value = param;
|
|
954
|
-
while (doesRequireEvaluation(value)) {
|
|
955
|
-
if (isPrismaValuePlaceholder(value)) {
|
|
956
|
-
const found = scope[value.prisma__value.name];
|
|
938
|
+
function evaluateArg(arg, scope, generators) {
|
|
939
|
+
while (doesRequireEvaluation(arg)) {
|
|
940
|
+
if (isPrismaValuePlaceholder(arg)) {
|
|
941
|
+
const found = scope[arg.prisma__value.name];
|
|
957
942
|
if (found === void 0) {
|
|
958
|
-
throw new Error(`Missing value for query variable ${
|
|
943
|
+
throw new Error(`Missing value for query variable ${arg.prisma__value.name}`);
|
|
959
944
|
}
|
|
960
|
-
|
|
961
|
-
} else if (isPrismaValueGenerator(
|
|
962
|
-
const { name, args } =
|
|
945
|
+
arg = found;
|
|
946
|
+
} else if (isPrismaValueGenerator(arg)) {
|
|
947
|
+
const { name, args } = arg.prisma__value;
|
|
963
948
|
const generator = generators[name];
|
|
964
949
|
if (!generator) {
|
|
965
950
|
throw new Error(`Encountered an unknown generator '${name}'`);
|
|
966
951
|
}
|
|
967
|
-
|
|
952
|
+
arg = generator.generate(...args.map((arg2) => evaluateArg(arg2, scope, generators)));
|
|
968
953
|
} else {
|
|
969
|
-
assertNever(
|
|
954
|
+
assertNever(arg, `Unexpected unevaluated value type: ${arg}`);
|
|
970
955
|
}
|
|
971
956
|
}
|
|
972
|
-
if (Array.isArray(
|
|
973
|
-
|
|
974
|
-
} else if (isPrismaValueBytes(value)) {
|
|
975
|
-
value = Buffer.from(value.prisma__value, "base64");
|
|
976
|
-
} else if (isPrismaValueBigInt(value)) {
|
|
977
|
-
value = BigInt(value.prisma__value);
|
|
957
|
+
if (Array.isArray(arg)) {
|
|
958
|
+
arg = arg.map((el) => evaluateArg(el, scope, generators));
|
|
978
959
|
}
|
|
979
|
-
return
|
|
960
|
+
return arg;
|
|
980
961
|
}
|
|
981
|
-
function renderTemplateSql(fragments, placeholderFormat, params) {
|
|
962
|
+
function renderTemplateSql(fragments, placeholderFormat, params, argTypes) {
|
|
982
963
|
let sql = "";
|
|
983
964
|
const ctx = { placeholderNumber: 1 };
|
|
984
965
|
const flattenedParams = [];
|
|
985
|
-
|
|
986
|
-
|
|
966
|
+
const flattenedArgTypes = [];
|
|
967
|
+
for (const fragment of pairFragmentsWithParams(fragments, params, argTypes)) {
|
|
987
968
|
sql += renderFragment(fragment, placeholderFormat, ctx);
|
|
969
|
+
if (fragment.type === "stringChunk") {
|
|
970
|
+
continue;
|
|
971
|
+
}
|
|
972
|
+
const length = flattenedParams.length;
|
|
973
|
+
const added = flattenedParams.push(...flattenedFragmentParams(fragment)) - length;
|
|
974
|
+
if (fragment.argType.arity === "tuple") {
|
|
975
|
+
if (added % fragment.argType.elements.length !== 0) {
|
|
976
|
+
throw new Error(
|
|
977
|
+
`Malformed query template. Expected the number of parameters to match the tuple arity, but got ${added} parameters for a tuple of arity ${fragment.argType.elements.length}.`
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
for (let i = 0; i < added / fragment.argType.elements.length; i++) {
|
|
981
|
+
flattenedArgTypes.push(...fragment.argType.elements);
|
|
982
|
+
}
|
|
983
|
+
} else {
|
|
984
|
+
for (let i = 0; i < added; i++) {
|
|
985
|
+
flattenedArgTypes.push(fragment.argType);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
988
|
}
|
|
989
|
-
return
|
|
989
|
+
return {
|
|
990
|
+
sql,
|
|
991
|
+
args: flattenedParams,
|
|
992
|
+
argTypes: flattenedArgTypes
|
|
993
|
+
};
|
|
990
994
|
}
|
|
991
995
|
function renderFragment(fragment, placeholderFormat, ctx) {
|
|
992
996
|
const fragmentType = fragment.type;
|
|
@@ -1012,36 +1016,17 @@ function renderFragment(fragment, placeholderFormat, ctx) {
|
|
|
1012
1016
|
function formatPlaceholder(placeholderFormat, placeholderNumber) {
|
|
1013
1017
|
return placeholderFormat.hasNumbering ? `${placeholderFormat.prefix}${placeholderNumber}` : placeholderFormat.prefix;
|
|
1014
1018
|
}
|
|
1015
|
-
function renderRawSql(sql,
|
|
1016
|
-
const argTypes = params.map((param) => toArgType(param));
|
|
1019
|
+
function renderRawSql(sql, args, argTypes) {
|
|
1017
1020
|
return {
|
|
1018
1021
|
sql,
|
|
1019
|
-
args
|
|
1022
|
+
args,
|
|
1020
1023
|
argTypes
|
|
1021
1024
|
};
|
|
1022
1025
|
}
|
|
1023
|
-
function toArgType(value) {
|
|
1024
|
-
if (typeof value === "string") {
|
|
1025
|
-
return "Text";
|
|
1026
|
-
}
|
|
1027
|
-
if (typeof value === "number") {
|
|
1028
|
-
return "Numeric";
|
|
1029
|
-
}
|
|
1030
|
-
if (typeof value === "boolean") {
|
|
1031
|
-
return "Boolean";
|
|
1032
|
-
}
|
|
1033
|
-
if (Array.isArray(value)) {
|
|
1034
|
-
return "Array";
|
|
1035
|
-
}
|
|
1036
|
-
if (Buffer.isBuffer(value)) {
|
|
1037
|
-
return "Bytes";
|
|
1038
|
-
}
|
|
1039
|
-
return "Unknown";
|
|
1040
|
-
}
|
|
1041
1026
|
function doesRequireEvaluation(param) {
|
|
1042
1027
|
return isPrismaValuePlaceholder(param) || isPrismaValueGenerator(param);
|
|
1043
1028
|
}
|
|
1044
|
-
function* pairFragmentsWithParams(fragments, params) {
|
|
1029
|
+
function* pairFragmentsWithParams(fragments, params, argTypes) {
|
|
1045
1030
|
let index = 0;
|
|
1046
1031
|
for (const fragment of fragments) {
|
|
1047
1032
|
switch (fragment.type) {
|
|
@@ -1049,7 +1034,8 @@ function* pairFragmentsWithParams(fragments, params) {
|
|
|
1049
1034
|
if (index >= params.length) {
|
|
1050
1035
|
throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
|
|
1051
1036
|
}
|
|
1052
|
-
yield { ...fragment, value: params[index
|
|
1037
|
+
yield { ...fragment, value: params[index], argType: argTypes?.[index] };
|
|
1038
|
+
index++;
|
|
1053
1039
|
break;
|
|
1054
1040
|
}
|
|
1055
1041
|
case "stringChunk": {
|
|
@@ -1060,15 +1046,16 @@ function* pairFragmentsWithParams(fragments, params) {
|
|
|
1060
1046
|
if (index >= params.length) {
|
|
1061
1047
|
throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
|
|
1062
1048
|
}
|
|
1063
|
-
const value = params[index
|
|
1064
|
-
yield { ...fragment, value: Array.isArray(value) ? value : [value] };
|
|
1049
|
+
const value = params[index];
|
|
1050
|
+
yield { ...fragment, value: Array.isArray(value) ? value : [value], argType: argTypes?.[index] };
|
|
1051
|
+
index++;
|
|
1065
1052
|
break;
|
|
1066
1053
|
}
|
|
1067
1054
|
case "parameterTupleList": {
|
|
1068
1055
|
if (index >= params.length) {
|
|
1069
1056
|
throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
|
|
1070
1057
|
}
|
|
1071
|
-
const value = params[index
|
|
1058
|
+
const value = params[index];
|
|
1072
1059
|
if (!Array.isArray(value)) {
|
|
1073
1060
|
throw new Error(`Malformed query template. Tuple list expected.`);
|
|
1074
1061
|
}
|
|
@@ -1080,7 +1067,8 @@ function* pairFragmentsWithParams(fragments, params) {
|
|
|
1080
1067
|
throw new Error(`Malformed query template. Tuple expected.`);
|
|
1081
1068
|
}
|
|
1082
1069
|
}
|
|
1083
|
-
yield { ...fragment, value };
|
|
1070
|
+
yield { ...fragment, value, argType: argTypes?.[index] };
|
|
1071
|
+
index++;
|
|
1084
1072
|
break;
|
|
1085
1073
|
}
|
|
1086
1074
|
}
|
|
@@ -1106,7 +1094,7 @@ function* flattenedFragmentParams(fragment) {
|
|
|
1106
1094
|
function chunkParams(fragments, params, maxChunkSize) {
|
|
1107
1095
|
let totalParamCount = 0;
|
|
1108
1096
|
let maxParamsPerFragment = 0;
|
|
1109
|
-
for (const fragment of pairFragmentsWithParams(fragments, params)) {
|
|
1097
|
+
for (const fragment of pairFragmentsWithParams(fragments, params, void 0)) {
|
|
1110
1098
|
let paramSize = 0;
|
|
1111
1099
|
for (const _ of flattenedFragmentParams(fragment)) {
|
|
1112
1100
|
void _;
|
|
@@ -1116,7 +1104,7 @@ function chunkParams(fragments, params, maxChunkSize) {
|
|
|
1116
1104
|
totalParamCount += paramSize;
|
|
1117
1105
|
}
|
|
1118
1106
|
let chunkedParams = [[]];
|
|
1119
|
-
for (const fragment of pairFragmentsWithParams(fragments, params)) {
|
|
1107
|
+
for (const fragment of pairFragmentsWithParams(fragments, params, void 0)) {
|
|
1120
1108
|
switch (fragment.type) {
|
|
1121
1109
|
case "parameter": {
|
|
1122
1110
|
for (const params2 of chunkedParams) {
|
|
@@ -1182,16 +1170,8 @@ function chunkArray(array, chunkSize) {
|
|
|
1182
1170
|
// src/interpreter/serialize-sql.ts
|
|
1183
1171
|
var import_driver_adapter_utils2 = require("@prisma/driver-adapter-utils");
|
|
1184
1172
|
function serializeSql(resultSet) {
|
|
1185
|
-
const mappers = resultSet.columnTypes.map((type) => {
|
|
1186
|
-
switch (type) {
|
|
1187
|
-
case import_driver_adapter_utils2.ColumnTypeEnum.Bytes:
|
|
1188
|
-
return (value) => Array.isArray(value) ? new Uint8Array(value) : value;
|
|
1189
|
-
default:
|
|
1190
|
-
return (value) => value;
|
|
1191
|
-
}
|
|
1192
|
-
});
|
|
1193
1173
|
return resultSet.rows.map(
|
|
1194
|
-
(row) => row.
|
|
1174
|
+
(row) => row.reduce((acc, value, index) => {
|
|
1195
1175
|
const splitByDot = resultSet.columnNames[index].split(".");
|
|
1196
1176
|
let nested = acc;
|
|
1197
1177
|
for (let i = 0; i < splitByDot.length; i++) {
|
|
@@ -1485,14 +1465,14 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1485
1465
|
queryPlan,
|
|
1486
1466
|
queryable,
|
|
1487
1467
|
this.#placeholderValues,
|
|
1488
|
-
this.#generators.snapshot(
|
|
1468
|
+
this.#generators.snapshot()
|
|
1489
1469
|
).catch((e) => rethrowAsUserFacing(e));
|
|
1490
1470
|
return value;
|
|
1491
1471
|
}
|
|
1492
1472
|
async interpretNode(node, queryable, scope, generators) {
|
|
1493
1473
|
switch (node.type) {
|
|
1494
1474
|
case "value": {
|
|
1495
|
-
return { value:
|
|
1475
|
+
return { value: evaluateArg(node.args, scope, generators) };
|
|
1496
1476
|
}
|
|
1497
1477
|
case "seq": {
|
|
1498
1478
|
let result;
|
|
@@ -1597,7 +1577,7 @@ var QueryInterpreter = class _QueryInterpreter {
|
|
|
1597
1577
|
}
|
|
1598
1578
|
case "mapField": {
|
|
1599
1579
|
const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
|
|
1600
|
-
return { value:
|
|
1580
|
+
return { value: mapField2(value, node.args.field), lastInsertId };
|
|
1601
1581
|
}
|
|
1602
1582
|
case "join": {
|
|
1603
1583
|
const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
|
|
@@ -1740,9 +1720,9 @@ function asRecord(value) {
|
|
|
1740
1720
|
}
|
|
1741
1721
|
throw new Error(`Expected object, got ${typeof value}`);
|
|
1742
1722
|
}
|
|
1743
|
-
function
|
|
1723
|
+
function mapField2(value, field) {
|
|
1744
1724
|
if (Array.isArray(value)) {
|
|
1745
|
-
return value.map((element) =>
|
|
1725
|
+
return value.map((element) => mapField2(element, field));
|
|
1746
1726
|
}
|
|
1747
1727
|
if (typeof value === "object" && value !== null) {
|
|
1748
1728
|
return value[field] ?? null;
|
|
@@ -1786,7 +1766,7 @@ function attachChildrenToParents(parentRecords, children) {
|
|
|
1786
1766
|
function evalFieldInitializer(initializer, lastInsertId, scope, generators) {
|
|
1787
1767
|
switch (initializer.type) {
|
|
1788
1768
|
case "value":
|
|
1789
|
-
return
|
|
1769
|
+
return evaluateArg(initializer.value, scope, generators);
|
|
1790
1770
|
case "lastInsertId":
|
|
1791
1771
|
return lastInsertId;
|
|
1792
1772
|
default:
|
|
@@ -1796,16 +1776,16 @@ function evalFieldInitializer(initializer, lastInsertId, scope, generators) {
|
|
|
1796
1776
|
function evalFieldOperation(op, value, scope, generators) {
|
|
1797
1777
|
switch (op.type) {
|
|
1798
1778
|
case "set":
|
|
1799
|
-
return
|
|
1779
|
+
return evaluateArg(op.value, scope, generators);
|
|
1800
1780
|
case "add":
|
|
1801
|
-
return asNumber2(value) + asNumber2(
|
|
1781
|
+
return asNumber2(value) + asNumber2(evaluateArg(op.value, scope, generators));
|
|
1802
1782
|
case "subtract":
|
|
1803
|
-
return asNumber2(value) - asNumber2(
|
|
1783
|
+
return asNumber2(value) - asNumber2(evaluateArg(op.value, scope, generators));
|
|
1804
1784
|
case "multiply":
|
|
1805
|
-
return asNumber2(value) * asNumber2(
|
|
1785
|
+
return asNumber2(value) * asNumber2(evaluateArg(op.value, scope, generators));
|
|
1806
1786
|
case "divide": {
|
|
1807
1787
|
const lhs = asNumber2(value);
|
|
1808
|
-
const rhs = asNumber2(
|
|
1788
|
+
const rhs = asNumber2(evaluateArg(op.value, scope, generators));
|
|
1809
1789
|
if (rhs === 0) {
|
|
1810
1790
|
return null;
|
|
1811
1791
|
}
|
|
@@ -2127,8 +2107,6 @@ var TransactionManager = class {
|
|
|
2127
2107
|
deserializeJsonResponse,
|
|
2128
2108
|
doKeysMatch,
|
|
2129
2109
|
isDeepStrictEqual,
|
|
2130
|
-
isPrismaValueBigInt,
|
|
2131
|
-
isPrismaValueBytes,
|
|
2132
2110
|
isPrismaValueGenerator,
|
|
2133
2111
|
isPrismaValuePlaceholder,
|
|
2134
2112
|
noopTracingHelper,
|