@prisma/client-engine-runtime 7.3.0-dev.14 → 7.3.0-dev.16

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 CHANGED
@@ -249,30 +249,24 @@ export declare type QueryEvent = {
249
249
 
250
250
  export declare class QueryInterpreter {
251
251
  #private;
252
- constructor({ transactionManager, placeholderValues, onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, sqlCommenter, }: QueryInterpreterOptions);
252
+ constructor({ onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, }: QueryInterpreterOptions);
253
253
  static forSql(options: {
254
- transactionManager: QueryInterpreterTransactionManager;
255
- placeholderValues: Record<string, unknown>;
256
254
  onQuery?: (event: QueryEvent) => void;
257
255
  tracingHelper: TracingHelper;
258
256
  provider?: SchemaProvider;
259
257
  connectionInfo?: ConnectionInfo;
260
- sqlCommenter?: QueryInterpreterSqlCommenter;
261
258
  }): QueryInterpreter;
262
- run(queryPlan: QueryPlanNode, queryable: SqlQueryable): Promise<unknown>;
259
+ run(queryPlan: QueryPlanNode, options: QueryRuntimeOptions): Promise<unknown>;
263
260
  private interpretNode;
264
261
  }
265
262
 
266
263
  export declare type QueryInterpreterOptions = {
267
- transactionManager: QueryInterpreterTransactionManager;
268
- placeholderValues: Record<string, unknown>;
269
264
  onQuery?: (event: QueryEvent) => void;
270
265
  tracingHelper: TracingHelper;
271
266
  serializer: (results: SqlResultSet) => Value;
272
267
  rawSerializer?: (results: SqlResultSet) => Value;
273
268
  provider?: SchemaProvider;
274
269
  connectionInfo?: ConnectionInfo;
275
- sqlCommenter?: QueryInterpreterSqlCommenter;
276
270
  };
277
271
 
278
272
  export declare type QueryInterpreterSqlCommenter = {
@@ -414,6 +408,13 @@ export declare type QueryPlanNode = {
414
408
  };
415
409
  };
416
410
 
411
+ declare type QueryRuntimeOptions = {
412
+ queryable: SqlQueryable;
413
+ transactionManager: QueryInterpreterTransactionManager;
414
+ scope: Record<string, unknown>;
415
+ sqlCommenter?: QueryInterpreterSqlCommenter;
416
+ };
417
+
417
418
  export declare type RawResponse = {
418
419
  columns: string[];
419
420
  types: string[];
package/dist/index.d.ts CHANGED
@@ -249,30 +249,24 @@ export declare type QueryEvent = {
249
249
 
250
250
  export declare class QueryInterpreter {
251
251
  #private;
252
- constructor({ transactionManager, placeholderValues, onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, sqlCommenter, }: QueryInterpreterOptions);
252
+ constructor({ onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, }: QueryInterpreterOptions);
253
253
  static forSql(options: {
254
- transactionManager: QueryInterpreterTransactionManager;
255
- placeholderValues: Record<string, unknown>;
256
254
  onQuery?: (event: QueryEvent) => void;
257
255
  tracingHelper: TracingHelper;
258
256
  provider?: SchemaProvider;
259
257
  connectionInfo?: ConnectionInfo;
260
- sqlCommenter?: QueryInterpreterSqlCommenter;
261
258
  }): QueryInterpreter;
262
- run(queryPlan: QueryPlanNode, queryable: SqlQueryable): Promise<unknown>;
259
+ run(queryPlan: QueryPlanNode, options: QueryRuntimeOptions): Promise<unknown>;
263
260
  private interpretNode;
264
261
  }
265
262
 
266
263
  export declare type QueryInterpreterOptions = {
267
- transactionManager: QueryInterpreterTransactionManager;
268
- placeholderValues: Record<string, unknown>;
269
264
  onQuery?: (event: QueryEvent) => void;
270
265
  tracingHelper: TracingHelper;
271
266
  serializer: (results: SqlResultSet) => Value;
272
267
  rawSerializer?: (results: SqlResultSet) => Value;
273
268
  provider?: SchemaProvider;
274
269
  connectionInfo?: ConnectionInfo;
275
- sqlCommenter?: QueryInterpreterSqlCommenter;
276
270
  };
277
271
 
278
272
  export declare type QueryInterpreterSqlCommenter = {
@@ -414,6 +408,13 @@ export declare type QueryPlanNode = {
414
408
  };
415
409
  };
416
410
 
411
+ declare type QueryRuntimeOptions = {
412
+ queryable: SqlQueryable;
413
+ transactionManager: QueryInterpreterTransactionManager;
414
+ scope: Record<string, unknown>;
415
+ sqlCommenter?: QueryInterpreterSqlCommenter;
416
+ };
417
+
417
418
  export declare type RawResponse = {
418
419
  columns: string[];
419
420
  types: string[];
package/dist/index.js CHANGED
@@ -1485,8 +1485,6 @@ function getErrorCode2(error) {
1485
1485
 
1486
1486
  // src/interpreter/query-interpreter.ts
1487
1487
  var QueryInterpreter = class _QueryInterpreter {
1488
- #transactionManager;
1489
- #placeholderValues;
1490
1488
  #onQuery;
1491
1489
  #generators = new GeneratorRegistry();
1492
1490
  #tracingHelper;
@@ -1494,76 +1492,66 @@ var QueryInterpreter = class _QueryInterpreter {
1494
1492
  #rawSerializer;
1495
1493
  #provider;
1496
1494
  #connectionInfo;
1497
- #sqlCommenter;
1498
1495
  constructor({
1499
- transactionManager,
1500
- placeholderValues,
1501
1496
  onQuery,
1502
1497
  tracingHelper,
1503
1498
  serializer,
1504
1499
  rawSerializer,
1505
1500
  provider,
1506
- connectionInfo,
1507
- sqlCommenter
1501
+ connectionInfo
1508
1502
  }) {
1509
- this.#transactionManager = transactionManager;
1510
- this.#placeholderValues = placeholderValues;
1511
1503
  this.#onQuery = onQuery;
1512
1504
  this.#tracingHelper = tracingHelper;
1513
1505
  this.#serializer = serializer;
1514
1506
  this.#rawSerializer = rawSerializer ?? serializer;
1515
1507
  this.#provider = provider;
1516
1508
  this.#connectionInfo = connectionInfo;
1517
- this.#sqlCommenter = sqlCommenter;
1518
1509
  }
1519
1510
  static forSql(options) {
1520
1511
  return new _QueryInterpreter({
1521
- transactionManager: options.transactionManager,
1522
- placeholderValues: options.placeholderValues,
1523
1512
  onQuery: options.onQuery,
1524
1513
  tracingHelper: options.tracingHelper,
1525
1514
  serializer: serializeSql,
1526
1515
  rawSerializer: serializeRawSql,
1527
1516
  provider: options.provider,
1528
- connectionInfo: options.connectionInfo,
1529
- sqlCommenter: options.sqlCommenter
1517
+ connectionInfo: options.connectionInfo
1530
1518
  });
1531
1519
  }
1532
- async run(queryPlan, queryable) {
1533
- const { value } = await this.interpretNode(
1534
- queryPlan,
1535
- queryable,
1536
- this.#placeholderValues,
1537
- this.#generators.snapshot()
1538
- ).catch((e) => rethrowAsUserFacing(e));
1520
+ async run(queryPlan, options) {
1521
+ const { value } = await this.interpretNode(queryPlan, {
1522
+ ...options,
1523
+ generators: this.#generators.snapshot()
1524
+ }).catch((e) => rethrowAsUserFacing(e));
1539
1525
  return value;
1540
1526
  }
1541
- async interpretNode(node, queryable, scope, generators) {
1527
+ async interpretNode(node, context) {
1542
1528
  switch (node.type) {
1543
1529
  case "value": {
1544
- return { value: evaluateArg(node.args, scope, generators) };
1530
+ return {
1531
+ value: evaluateArg(node.args, context.scope, context.generators)
1532
+ };
1545
1533
  }
1546
1534
  case "seq": {
1547
1535
  let result;
1548
1536
  for (const arg of node.args) {
1549
- result = await this.interpretNode(arg, queryable, scope, generators);
1537
+ result = await this.interpretNode(arg, context);
1550
1538
  }
1551
1539
  return result ?? { value: void 0 };
1552
1540
  }
1553
1541
  case "get": {
1554
- return { value: scope[node.args.name] };
1542
+ return { value: context.scope[node.args.name] };
1555
1543
  }
1556
1544
  case "let": {
1557
- const nestedScope = Object.create(scope);
1545
+ const nestedScope = Object.create(context.scope);
1558
1546
  for (const binding of node.args.bindings) {
1559
- const { value } = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
1547
+ const { value } = await this.interpretNode(binding.expr, { ...context, scope: nestedScope });
1560
1548
  nestedScope[binding.name] = value;
1561
1549
  }
1562
- return this.interpretNode(node.args.expr, queryable, nestedScope, generators);
1550
+ return this.interpretNode(node.args.expr, { ...context, scope: nestedScope });
1563
1551
  }
1564
1552
  case "getFirstNonEmpty": {
1565
1553
  for (const name of node.args.names) {
1566
- const value = scope[name];
1554
+ const value = context.scope[name];
1567
1555
  if (!isEmpty(value)) {
1568
1556
  return { value };
1569
1557
  }
@@ -1572,7 +1560,7 @@ var QueryInterpreter = class _QueryInterpreter {
1572
1560
  }
1573
1561
  case "concat": {
1574
1562
  const parts = await Promise.all(
1575
- node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
1563
+ node.args.map((arg) => this.interpretNode(arg, context).then((res) => res.value))
1576
1564
  );
1577
1565
  return {
1578
1566
  value: parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : []
@@ -1580,21 +1568,21 @@ var QueryInterpreter = class _QueryInterpreter {
1580
1568
  }
1581
1569
  case "sum": {
1582
1570
  const parts = await Promise.all(
1583
- node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
1571
+ node.args.map((arg) => this.interpretNode(arg, context).then((res) => res.value))
1584
1572
  );
1585
1573
  return {
1586
1574
  value: parts.length > 0 ? parts.reduce((acc, part) => asNumber2(acc) + asNumber2(part)) : 0
1587
1575
  };
1588
1576
  }
1589
1577
  case "execute": {
1590
- const queries = renderQuery(node.args, scope, generators, this.#maxChunkSize());
1578
+ const queries = renderQuery(node.args, context.scope, context.generators, this.#maxChunkSize());
1591
1579
  let sum = 0;
1592
1580
  for (const query of queries) {
1593
- const commentedQuery = this.#applyComments(query);
1581
+ const commentedQuery = applyComments(query, context.sqlCommenter);
1594
1582
  sum += await this.#withQuerySpanAndEvent(
1595
1583
  commentedQuery,
1596
- queryable,
1597
- () => queryable.executeRaw(commentedQuery).catch(
1584
+ context.queryable,
1585
+ () => context.queryable.executeRaw(commentedQuery).catch(
1598
1586
  (err) => node.args.type === "rawSql" ? rethrowAsUserFacingRawError(err) : rethrowAsUserFacing(err)
1599
1587
  )
1600
1588
  );
@@ -1602,14 +1590,14 @@ var QueryInterpreter = class _QueryInterpreter {
1602
1590
  return { value: sum };
1603
1591
  }
1604
1592
  case "query": {
1605
- const queries = renderQuery(node.args, scope, generators, this.#maxChunkSize());
1593
+ const queries = renderQuery(node.args, context.scope, context.generators, this.#maxChunkSize());
1606
1594
  let results;
1607
1595
  for (const query of queries) {
1608
- const commentedQuery = this.#applyComments(query);
1596
+ const commentedQuery = applyComments(query, context.sqlCommenter);
1609
1597
  const result = await this.#withQuerySpanAndEvent(
1610
1598
  commentedQuery,
1611
- queryable,
1612
- () => queryable.queryRaw(commentedQuery).catch(
1599
+ context.queryable,
1600
+ () => context.queryable.queryRaw(commentedQuery).catch(
1613
1601
  (err) => node.args.type === "rawSql" ? rethrowAsUserFacingRawError(err) : rethrowAsUserFacing(err)
1614
1602
  )
1615
1603
  );
@@ -1626,11 +1614,11 @@ var QueryInterpreter = class _QueryInterpreter {
1626
1614
  };
1627
1615
  }
1628
1616
  case "reverse": {
1629
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1617
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1630
1618
  return { value: Array.isArray(value) ? value.reverse() : value, lastInsertId };
1631
1619
  }
1632
1620
  case "unique": {
1633
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1621
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1634
1622
  if (!Array.isArray(value)) {
1635
1623
  return { value, lastInsertId };
1636
1624
  }
@@ -1640,38 +1628,38 @@ var QueryInterpreter = class _QueryInterpreter {
1640
1628
  return { value: value[0] ?? null, lastInsertId };
1641
1629
  }
1642
1630
  case "required": {
1643
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1631
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1644
1632
  if (isEmpty(value)) {
1645
1633
  throw new Error("Required value is empty");
1646
1634
  }
1647
1635
  return { value, lastInsertId };
1648
1636
  }
1649
1637
  case "mapField": {
1650
- const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
1638
+ const { value, lastInsertId } = await this.interpretNode(node.args.records, context);
1651
1639
  return { value: mapField2(value, node.args.field), lastInsertId };
1652
1640
  }
1653
1641
  case "join": {
1654
- const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
1642
+ const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, context);
1655
1643
  if (parent === null) {
1656
1644
  return { value: null, lastInsertId };
1657
1645
  }
1658
1646
  const children = await Promise.all(
1659
1647
  node.args.children.map(async (joinExpr) => ({
1660
1648
  joinExpr,
1661
- childRecords: (await this.interpretNode(joinExpr.child, queryable, scope, generators)).value
1649
+ childRecords: (await this.interpretNode(joinExpr.child, context)).value
1662
1650
  }))
1663
1651
  );
1664
1652
  return { value: attachChildrenToParents(parent, children), lastInsertId };
1665
1653
  }
1666
1654
  case "transaction": {
1667
- if (!this.#transactionManager.enabled) {
1668
- return this.interpretNode(node.args, queryable, scope, generators);
1655
+ if (!context.transactionManager.enabled) {
1656
+ return this.interpretNode(node.args, context);
1669
1657
  }
1670
- const transactionManager = this.#transactionManager.manager;
1658
+ const transactionManager = context.transactionManager.manager;
1671
1659
  const transactionInfo = await transactionManager.startInternalTransaction();
1672
1660
  const transaction = await transactionManager.getTransaction(transactionInfo, "query");
1673
1661
  try {
1674
- const value = await this.interpretNode(node.args, transaction, scope, generators);
1662
+ const value = await this.interpretNode(node.args, { ...context, queryable: transaction });
1675
1663
  await transactionManager.commitTransaction(transactionInfo.id);
1676
1664
  return value;
1677
1665
  } catch (e) {
@@ -1680,49 +1668,49 @@ var QueryInterpreter = class _QueryInterpreter {
1680
1668
  }
1681
1669
  }
1682
1670
  case "dataMap": {
1683
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1671
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1684
1672
  return { value: applyDataMap(value, node.args.structure, node.args.enums), lastInsertId };
1685
1673
  }
1686
1674
  case "validate": {
1687
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1675
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1688
1676
  performValidation(value, node.args.rules, node.args);
1689
1677
  return { value, lastInsertId };
1690
1678
  }
1691
1679
  case "if": {
1692
- const { value } = await this.interpretNode(node.args.value, queryable, scope, generators);
1680
+ const { value } = await this.interpretNode(node.args.value, context);
1693
1681
  if (doesSatisfyRule(value, node.args.rule)) {
1694
- return await this.interpretNode(node.args.then, queryable, scope, generators);
1682
+ return await this.interpretNode(node.args.then, context);
1695
1683
  } else {
1696
- return await this.interpretNode(node.args.else, queryable, scope, generators);
1684
+ return await this.interpretNode(node.args.else, context);
1697
1685
  }
1698
1686
  }
1699
1687
  case "unit": {
1700
1688
  return { value: void 0 };
1701
1689
  }
1702
1690
  case "diff": {
1703
- const { value: from } = await this.interpretNode(node.args.from, queryable, scope, generators);
1704
- const { value: to } = await this.interpretNode(node.args.to, queryable, scope, generators);
1691
+ const { value: from } = await this.interpretNode(node.args.from, context);
1692
+ const { value: to } = await this.interpretNode(node.args.to, context);
1705
1693
  const keyGetter = (item) => item !== null ? getRecordKey(asRecord(item), node.args.fields) : null;
1706
1694
  const toSet = new Set(asList(to).map(keyGetter));
1707
1695
  return { value: asList(from).filter((item) => !toSet.has(keyGetter(item))) };
1708
1696
  }
1709
1697
  case "process": {
1710
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1698
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1711
1699
  return { value: processRecords(value, node.args.operations), lastInsertId };
1712
1700
  }
1713
1701
  case "initializeRecord": {
1714
- const { lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1702
+ const { lastInsertId } = await this.interpretNode(node.args.expr, context);
1715
1703
  const record = {};
1716
1704
  for (const [key, initializer] of Object.entries(node.args.fields)) {
1717
- record[key] = evalFieldInitializer(initializer, lastInsertId, scope, generators);
1705
+ record[key] = evalFieldInitializer(initializer, lastInsertId, context.scope, context.generators);
1718
1706
  }
1719
1707
  return { value: record, lastInsertId };
1720
1708
  }
1721
1709
  case "mapRecord": {
1722
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1710
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1723
1711
  const record = value === null ? {} : asRecord(value);
1724
1712
  for (const [key, entry] of Object.entries(node.args.fields)) {
1725
- record[key] = evalFieldOperation(entry, record[key], scope, generators);
1713
+ record[key] = evalFieldOperation(entry, record[key], context.scope, context.generators);
1726
1714
  }
1727
1715
  return { value: record, lastInsertId };
1728
1716
  }
@@ -1767,22 +1755,6 @@ var QueryInterpreter = class _QueryInterpreter {
1767
1755
  onQuery: this.#onQuery
1768
1756
  });
1769
1757
  }
1770
- #applyComments(query) {
1771
- if (!this.#sqlCommenter || this.#sqlCommenter.plugins.length === 0) {
1772
- return query;
1773
- }
1774
- const comment = buildSqlComment(this.#sqlCommenter.plugins, {
1775
- query: this.#sqlCommenter.queryInfo,
1776
- sql: query.sql
1777
- });
1778
- if (!comment) {
1779
- return query;
1780
- }
1781
- return {
1782
- ...query,
1783
- sql: appendSqlComment(query.sql, comment)
1784
- };
1785
- }
1786
1758
  };
1787
1759
  function isEmpty(value) {
1788
1760
  if (Array.isArray(value)) {
@@ -1883,6 +1855,22 @@ function evalFieldOperation(op, value, scope, generators) {
1883
1855
  assertNever(op, `Unexpected field operation type: ${op["type"]}`);
1884
1856
  }
1885
1857
  }
1858
+ function applyComments(query, sqlCommenter) {
1859
+ if (!sqlCommenter || sqlCommenter.plugins.length === 0) {
1860
+ return query;
1861
+ }
1862
+ const comment = buildSqlComment(sqlCommenter.plugins, {
1863
+ query: sqlCommenter.queryInfo,
1864
+ sql: query.sql
1865
+ });
1866
+ if (!comment) {
1867
+ return query;
1868
+ }
1869
+ return {
1870
+ ...query,
1871
+ sql: appendSqlComment(query.sql, comment)
1872
+ };
1873
+ }
1886
1874
 
1887
1875
  // src/raw-json-protocol.ts
1888
1876
  var import_client_runtime_utils4 = require("@prisma/client-runtime-utils");
package/dist/index.mjs CHANGED
@@ -1434,8 +1434,6 @@ function getErrorCode2(error) {
1434
1434
 
1435
1435
  // src/interpreter/query-interpreter.ts
1436
1436
  var QueryInterpreter = class _QueryInterpreter {
1437
- #transactionManager;
1438
- #placeholderValues;
1439
1437
  #onQuery;
1440
1438
  #generators = new GeneratorRegistry();
1441
1439
  #tracingHelper;
@@ -1443,76 +1441,66 @@ var QueryInterpreter = class _QueryInterpreter {
1443
1441
  #rawSerializer;
1444
1442
  #provider;
1445
1443
  #connectionInfo;
1446
- #sqlCommenter;
1447
1444
  constructor({
1448
- transactionManager,
1449
- placeholderValues,
1450
1445
  onQuery,
1451
1446
  tracingHelper,
1452
1447
  serializer,
1453
1448
  rawSerializer,
1454
1449
  provider,
1455
- connectionInfo,
1456
- sqlCommenter
1450
+ connectionInfo
1457
1451
  }) {
1458
- this.#transactionManager = transactionManager;
1459
- this.#placeholderValues = placeholderValues;
1460
1452
  this.#onQuery = onQuery;
1461
1453
  this.#tracingHelper = tracingHelper;
1462
1454
  this.#serializer = serializer;
1463
1455
  this.#rawSerializer = rawSerializer ?? serializer;
1464
1456
  this.#provider = provider;
1465
1457
  this.#connectionInfo = connectionInfo;
1466
- this.#sqlCommenter = sqlCommenter;
1467
1458
  }
1468
1459
  static forSql(options) {
1469
1460
  return new _QueryInterpreter({
1470
- transactionManager: options.transactionManager,
1471
- placeholderValues: options.placeholderValues,
1472
1461
  onQuery: options.onQuery,
1473
1462
  tracingHelper: options.tracingHelper,
1474
1463
  serializer: serializeSql,
1475
1464
  rawSerializer: serializeRawSql,
1476
1465
  provider: options.provider,
1477
- connectionInfo: options.connectionInfo,
1478
- sqlCommenter: options.sqlCommenter
1466
+ connectionInfo: options.connectionInfo
1479
1467
  });
1480
1468
  }
1481
- async run(queryPlan, queryable) {
1482
- const { value } = await this.interpretNode(
1483
- queryPlan,
1484
- queryable,
1485
- this.#placeholderValues,
1486
- this.#generators.snapshot()
1487
- ).catch((e) => rethrowAsUserFacing(e));
1469
+ async run(queryPlan, options) {
1470
+ const { value } = await this.interpretNode(queryPlan, {
1471
+ ...options,
1472
+ generators: this.#generators.snapshot()
1473
+ }).catch((e) => rethrowAsUserFacing(e));
1488
1474
  return value;
1489
1475
  }
1490
- async interpretNode(node, queryable, scope, generators) {
1476
+ async interpretNode(node, context) {
1491
1477
  switch (node.type) {
1492
1478
  case "value": {
1493
- return { value: evaluateArg(node.args, scope, generators) };
1479
+ return {
1480
+ value: evaluateArg(node.args, context.scope, context.generators)
1481
+ };
1494
1482
  }
1495
1483
  case "seq": {
1496
1484
  let result;
1497
1485
  for (const arg of node.args) {
1498
- result = await this.interpretNode(arg, queryable, scope, generators);
1486
+ result = await this.interpretNode(arg, context);
1499
1487
  }
1500
1488
  return result ?? { value: void 0 };
1501
1489
  }
1502
1490
  case "get": {
1503
- return { value: scope[node.args.name] };
1491
+ return { value: context.scope[node.args.name] };
1504
1492
  }
1505
1493
  case "let": {
1506
- const nestedScope = Object.create(scope);
1494
+ const nestedScope = Object.create(context.scope);
1507
1495
  for (const binding of node.args.bindings) {
1508
- const { value } = await this.interpretNode(binding.expr, queryable, nestedScope, generators);
1496
+ const { value } = await this.interpretNode(binding.expr, { ...context, scope: nestedScope });
1509
1497
  nestedScope[binding.name] = value;
1510
1498
  }
1511
- return this.interpretNode(node.args.expr, queryable, nestedScope, generators);
1499
+ return this.interpretNode(node.args.expr, { ...context, scope: nestedScope });
1512
1500
  }
1513
1501
  case "getFirstNonEmpty": {
1514
1502
  for (const name of node.args.names) {
1515
- const value = scope[name];
1503
+ const value = context.scope[name];
1516
1504
  if (!isEmpty(value)) {
1517
1505
  return { value };
1518
1506
  }
@@ -1521,7 +1509,7 @@ var QueryInterpreter = class _QueryInterpreter {
1521
1509
  }
1522
1510
  case "concat": {
1523
1511
  const parts = await Promise.all(
1524
- node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
1512
+ node.args.map((arg) => this.interpretNode(arg, context).then((res) => res.value))
1525
1513
  );
1526
1514
  return {
1527
1515
  value: parts.length > 0 ? parts.reduce((acc, part) => acc.concat(asList(part)), []) : []
@@ -1529,21 +1517,21 @@ var QueryInterpreter = class _QueryInterpreter {
1529
1517
  }
1530
1518
  case "sum": {
1531
1519
  const parts = await Promise.all(
1532
- node.args.map((arg) => this.interpretNode(arg, queryable, scope, generators).then((res) => res.value))
1520
+ node.args.map((arg) => this.interpretNode(arg, context).then((res) => res.value))
1533
1521
  );
1534
1522
  return {
1535
1523
  value: parts.length > 0 ? parts.reduce((acc, part) => asNumber2(acc) + asNumber2(part)) : 0
1536
1524
  };
1537
1525
  }
1538
1526
  case "execute": {
1539
- const queries = renderQuery(node.args, scope, generators, this.#maxChunkSize());
1527
+ const queries = renderQuery(node.args, context.scope, context.generators, this.#maxChunkSize());
1540
1528
  let sum = 0;
1541
1529
  for (const query of queries) {
1542
- const commentedQuery = this.#applyComments(query);
1530
+ const commentedQuery = applyComments(query, context.sqlCommenter);
1543
1531
  sum += await this.#withQuerySpanAndEvent(
1544
1532
  commentedQuery,
1545
- queryable,
1546
- () => queryable.executeRaw(commentedQuery).catch(
1533
+ context.queryable,
1534
+ () => context.queryable.executeRaw(commentedQuery).catch(
1547
1535
  (err) => node.args.type === "rawSql" ? rethrowAsUserFacingRawError(err) : rethrowAsUserFacing(err)
1548
1536
  )
1549
1537
  );
@@ -1551,14 +1539,14 @@ var QueryInterpreter = class _QueryInterpreter {
1551
1539
  return { value: sum };
1552
1540
  }
1553
1541
  case "query": {
1554
- const queries = renderQuery(node.args, scope, generators, this.#maxChunkSize());
1542
+ const queries = renderQuery(node.args, context.scope, context.generators, this.#maxChunkSize());
1555
1543
  let results;
1556
1544
  for (const query of queries) {
1557
- const commentedQuery = this.#applyComments(query);
1545
+ const commentedQuery = applyComments(query, context.sqlCommenter);
1558
1546
  const result = await this.#withQuerySpanAndEvent(
1559
1547
  commentedQuery,
1560
- queryable,
1561
- () => queryable.queryRaw(commentedQuery).catch(
1548
+ context.queryable,
1549
+ () => context.queryable.queryRaw(commentedQuery).catch(
1562
1550
  (err) => node.args.type === "rawSql" ? rethrowAsUserFacingRawError(err) : rethrowAsUserFacing(err)
1563
1551
  )
1564
1552
  );
@@ -1575,11 +1563,11 @@ var QueryInterpreter = class _QueryInterpreter {
1575
1563
  };
1576
1564
  }
1577
1565
  case "reverse": {
1578
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1566
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1579
1567
  return { value: Array.isArray(value) ? value.reverse() : value, lastInsertId };
1580
1568
  }
1581
1569
  case "unique": {
1582
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1570
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1583
1571
  if (!Array.isArray(value)) {
1584
1572
  return { value, lastInsertId };
1585
1573
  }
@@ -1589,38 +1577,38 @@ var QueryInterpreter = class _QueryInterpreter {
1589
1577
  return { value: value[0] ?? null, lastInsertId };
1590
1578
  }
1591
1579
  case "required": {
1592
- const { value, lastInsertId } = await this.interpretNode(node.args, queryable, scope, generators);
1580
+ const { value, lastInsertId } = await this.interpretNode(node.args, context);
1593
1581
  if (isEmpty(value)) {
1594
1582
  throw new Error("Required value is empty");
1595
1583
  }
1596
1584
  return { value, lastInsertId };
1597
1585
  }
1598
1586
  case "mapField": {
1599
- const { value, lastInsertId } = await this.interpretNode(node.args.records, queryable, scope, generators);
1587
+ const { value, lastInsertId } = await this.interpretNode(node.args.records, context);
1600
1588
  return { value: mapField2(value, node.args.field), lastInsertId };
1601
1589
  }
1602
1590
  case "join": {
1603
- const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, queryable, scope, generators);
1591
+ const { value: parent, lastInsertId } = await this.interpretNode(node.args.parent, context);
1604
1592
  if (parent === null) {
1605
1593
  return { value: null, lastInsertId };
1606
1594
  }
1607
1595
  const children = await Promise.all(
1608
1596
  node.args.children.map(async (joinExpr) => ({
1609
1597
  joinExpr,
1610
- childRecords: (await this.interpretNode(joinExpr.child, queryable, scope, generators)).value
1598
+ childRecords: (await this.interpretNode(joinExpr.child, context)).value
1611
1599
  }))
1612
1600
  );
1613
1601
  return { value: attachChildrenToParents(parent, children), lastInsertId };
1614
1602
  }
1615
1603
  case "transaction": {
1616
- if (!this.#transactionManager.enabled) {
1617
- return this.interpretNode(node.args, queryable, scope, generators);
1604
+ if (!context.transactionManager.enabled) {
1605
+ return this.interpretNode(node.args, context);
1618
1606
  }
1619
- const transactionManager = this.#transactionManager.manager;
1607
+ const transactionManager = context.transactionManager.manager;
1620
1608
  const transactionInfo = await transactionManager.startInternalTransaction();
1621
1609
  const transaction = await transactionManager.getTransaction(transactionInfo, "query");
1622
1610
  try {
1623
- const value = await this.interpretNode(node.args, transaction, scope, generators);
1611
+ const value = await this.interpretNode(node.args, { ...context, queryable: transaction });
1624
1612
  await transactionManager.commitTransaction(transactionInfo.id);
1625
1613
  return value;
1626
1614
  } catch (e) {
@@ -1629,49 +1617,49 @@ var QueryInterpreter = class _QueryInterpreter {
1629
1617
  }
1630
1618
  }
1631
1619
  case "dataMap": {
1632
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1620
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1633
1621
  return { value: applyDataMap(value, node.args.structure, node.args.enums), lastInsertId };
1634
1622
  }
1635
1623
  case "validate": {
1636
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1624
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1637
1625
  performValidation(value, node.args.rules, node.args);
1638
1626
  return { value, lastInsertId };
1639
1627
  }
1640
1628
  case "if": {
1641
- const { value } = await this.interpretNode(node.args.value, queryable, scope, generators);
1629
+ const { value } = await this.interpretNode(node.args.value, context);
1642
1630
  if (doesSatisfyRule(value, node.args.rule)) {
1643
- return await this.interpretNode(node.args.then, queryable, scope, generators);
1631
+ return await this.interpretNode(node.args.then, context);
1644
1632
  } else {
1645
- return await this.interpretNode(node.args.else, queryable, scope, generators);
1633
+ return await this.interpretNode(node.args.else, context);
1646
1634
  }
1647
1635
  }
1648
1636
  case "unit": {
1649
1637
  return { value: void 0 };
1650
1638
  }
1651
1639
  case "diff": {
1652
- const { value: from } = await this.interpretNode(node.args.from, queryable, scope, generators);
1653
- const { value: to } = await this.interpretNode(node.args.to, queryable, scope, generators);
1640
+ const { value: from } = await this.interpretNode(node.args.from, context);
1641
+ const { value: to } = await this.interpretNode(node.args.to, context);
1654
1642
  const keyGetter = (item) => item !== null ? getRecordKey(asRecord(item), node.args.fields) : null;
1655
1643
  const toSet = new Set(asList(to).map(keyGetter));
1656
1644
  return { value: asList(from).filter((item) => !toSet.has(keyGetter(item))) };
1657
1645
  }
1658
1646
  case "process": {
1659
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1647
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1660
1648
  return { value: processRecords(value, node.args.operations), lastInsertId };
1661
1649
  }
1662
1650
  case "initializeRecord": {
1663
- const { lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1651
+ const { lastInsertId } = await this.interpretNode(node.args.expr, context);
1664
1652
  const record = {};
1665
1653
  for (const [key, initializer] of Object.entries(node.args.fields)) {
1666
- record[key] = evalFieldInitializer(initializer, lastInsertId, scope, generators);
1654
+ record[key] = evalFieldInitializer(initializer, lastInsertId, context.scope, context.generators);
1667
1655
  }
1668
1656
  return { value: record, lastInsertId };
1669
1657
  }
1670
1658
  case "mapRecord": {
1671
- const { value, lastInsertId } = await this.interpretNode(node.args.expr, queryable, scope, generators);
1659
+ const { value, lastInsertId } = await this.interpretNode(node.args.expr, context);
1672
1660
  const record = value === null ? {} : asRecord(value);
1673
1661
  for (const [key, entry] of Object.entries(node.args.fields)) {
1674
- record[key] = evalFieldOperation(entry, record[key], scope, generators);
1662
+ record[key] = evalFieldOperation(entry, record[key], context.scope, context.generators);
1675
1663
  }
1676
1664
  return { value: record, lastInsertId };
1677
1665
  }
@@ -1716,22 +1704,6 @@ var QueryInterpreter = class _QueryInterpreter {
1716
1704
  onQuery: this.#onQuery
1717
1705
  });
1718
1706
  }
1719
- #applyComments(query) {
1720
- if (!this.#sqlCommenter || this.#sqlCommenter.plugins.length === 0) {
1721
- return query;
1722
- }
1723
- const comment = buildSqlComment(this.#sqlCommenter.plugins, {
1724
- query: this.#sqlCommenter.queryInfo,
1725
- sql: query.sql
1726
- });
1727
- if (!comment) {
1728
- return query;
1729
- }
1730
- return {
1731
- ...query,
1732
- sql: appendSqlComment(query.sql, comment)
1733
- };
1734
- }
1735
1707
  };
1736
1708
  function isEmpty(value) {
1737
1709
  if (Array.isArray(value)) {
@@ -1832,6 +1804,22 @@ function evalFieldOperation(op, value, scope, generators) {
1832
1804
  assertNever(op, `Unexpected field operation type: ${op["type"]}`);
1833
1805
  }
1834
1806
  }
1807
+ function applyComments(query, sqlCommenter) {
1808
+ if (!sqlCommenter || sqlCommenter.plugins.length === 0) {
1809
+ return query;
1810
+ }
1811
+ const comment = buildSqlComment(sqlCommenter.plugins, {
1812
+ query: sqlCommenter.queryInfo,
1813
+ sql: query.sql
1814
+ });
1815
+ if (!comment) {
1816
+ return query;
1817
+ }
1818
+ return {
1819
+ ...query,
1820
+ sql: appendSqlComment(query.sql, comment)
1821
+ };
1822
+ }
1835
1823
 
1836
1824
  // src/raw-json-protocol.ts
1837
1825
  import { Decimal as Decimal4 } from "@prisma/client-runtime-utils";
@@ -13,14 +13,17 @@ export type QueryInterpreterTransactionManager = {
13
13
  enabled: false;
14
14
  };
15
15
  export type QueryInterpreterOptions = {
16
- transactionManager: QueryInterpreterTransactionManager;
17
- placeholderValues: Record<string, unknown>;
18
16
  onQuery?: (event: QueryEvent) => void;
19
17
  tracingHelper: TracingHelper;
20
18
  serializer: (results: SqlResultSet) => Value;
21
19
  rawSerializer?: (results: SqlResultSet) => Value;
22
20
  provider?: SchemaProvider;
23
21
  connectionInfo?: ConnectionInfo;
22
+ };
23
+ export type QueryRuntimeOptions = {
24
+ queryable: SqlQueryable;
25
+ transactionManager: QueryInterpreterTransactionManager;
26
+ scope: Record<string, unknown>;
24
27
  sqlCommenter?: QueryInterpreterSqlCommenter;
25
28
  };
26
29
  export type QueryInterpreterSqlCommenter = {
@@ -29,16 +32,13 @@ export type QueryInterpreterSqlCommenter = {
29
32
  };
30
33
  export declare class QueryInterpreter {
31
34
  #private;
32
- constructor({ transactionManager, placeholderValues, onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, sqlCommenter, }: QueryInterpreterOptions);
35
+ constructor({ onQuery, tracingHelper, serializer, rawSerializer, provider, connectionInfo, }: QueryInterpreterOptions);
33
36
  static forSql(options: {
34
- transactionManager: QueryInterpreterTransactionManager;
35
- placeholderValues: Record<string, unknown>;
36
37
  onQuery?: (event: QueryEvent) => void;
37
38
  tracingHelper: TracingHelper;
38
39
  provider?: SchemaProvider;
39
40
  connectionInfo?: ConnectionInfo;
40
- sqlCommenter?: QueryInterpreterSqlCommenter;
41
41
  }): QueryInterpreter;
42
- run(queryPlan: QueryPlanNode, queryable: SqlQueryable): Promise<unknown>;
42
+ run(queryPlan: QueryPlanNode, options: QueryRuntimeOptions): Promise<unknown>;
43
43
  private interpretNode;
44
44
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma/client-engine-runtime",
3
- "version": "7.3.0-dev.14",
3
+ "version": "7.3.0-dev.16",
4
4
  "description": "This package is intended for Prisma's internal use",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -31,10 +31,10 @@
31
31
  "nanoid": "5.1.5",
32
32
  "ulid": "3.0.0",
33
33
  "uuid": "11.1.0",
34
- "@prisma/client-runtime-utils": "7.3.0-dev.14",
35
- "@prisma/driver-adapter-utils": "7.3.0-dev.14",
36
- "@prisma/sqlcommenter": "7.3.0-dev.14",
37
- "@prisma/debug": "7.3.0-dev.14"
34
+ "@prisma/debug": "7.3.0-dev.16",
35
+ "@prisma/client-runtime-utils": "7.3.0-dev.16",
36
+ "@prisma/driver-adapter-utils": "7.3.0-dev.16",
37
+ "@prisma/sqlcommenter": "7.3.0-dev.16"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@codspeed/benchmark.js-plugin": "4.0.0",