pqb 0.73.2 → 0.73.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.js CHANGED
@@ -349,6 +349,17 @@ const templateLiteralSQLToCode = (sql) => {
349
349
  code += parts[i];
350
350
  return code + "`";
351
351
  };
352
+ var ValExpression = class extends Expression {
353
+ constructor(value) {
354
+ super();
355
+ this.value = value;
356
+ this.result = { value: emptyObject };
357
+ this.q = { expr: this };
358
+ }
359
+ makeSQL(ctx) {
360
+ return addValue(ctx.values, this.value);
361
+ }
362
+ };
352
363
  var SqlJoinExpression = class extends Expression {
353
364
  constructor(items, separator) {
354
365
  super();
@@ -499,6 +510,7 @@ const sqlFn = ((...args) => {
499
510
  sqlFn.ref = (name) => new SqlRefExpression(name);
500
511
  sqlFn.join = (items, separator) => new SqlJoinExpression(items, separator);
501
512
  sqlFn.unsafe = (sql) => new UnsafeSqlExpression(sql);
513
+ sqlFn.val = (value) => new ValExpression(value);
502
514
  var UnsafeSqlExpression = class extends Expression {
503
515
  constructor(sql) {
504
516
  super();
@@ -4124,6 +4136,81 @@ const getResetSetConfigSql = (parentSetConfig, options) => {
4124
4136
  const setConfigSql = (key, value) => {
4125
4137
  return `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value === void 0 ? "" : value}', true)`;
4126
4138
  };
4139
+ var Rollback = class extends Error {};
4140
+ const trxForTest = Symbol("trxForTest");
4141
+ const argToDb = (arg) => "$qb" in arg ? arg.$qb : arg;
4142
+ const testTransaction = {
4143
+ /**
4144
+ * Start a test transaction.
4145
+ * The returned promise is resolved immediately when transaction starts, not waiting for it to end.
4146
+ *
4147
+ * @param arg - ORM instance or a queryable instance (such as db.someTable).
4148
+ */
4149
+ start(arg) {
4150
+ const db = argToDb(arg);
4151
+ const { asyncStorage } = db.internal;
4152
+ const { getStore } = asyncStorage;
4153
+ const { adapter } = db.baseQuery.q;
4154
+ const data = { adapter: {
4155
+ query: adapter.query,
4156
+ arrays: adapter.arrays,
4157
+ transaction: adapter.transaction
4158
+ } };
4159
+ (db.internal[trxForTest] ??= []).push(data);
4160
+ return new Promise((resolve) => {
4161
+ data.promise = db.transaction(() => {
4162
+ resolve();
4163
+ return new Promise((_, rej) => {
4164
+ const state = asyncStorage.getStore();
4165
+ db.internal.asyncStorage.getStore = () => state;
4166
+ const t = state?.transactionAdapter;
4167
+ if (t) {
4168
+ adapter.query = t.query.bind(t);
4169
+ adapter.arrays = t.arrays.bind(t);
4170
+ adapter.transaction = t.transaction.bind(t);
4171
+ state.testTransactionCount = state.testTransactionCount ? state.testTransactionCount + 1 : 1;
4172
+ }
4173
+ data.reject = rej;
4174
+ });
4175
+ }).catch((err) => {
4176
+ if (!(err instanceof Rollback)) throw err;
4177
+ }).finally(() => {
4178
+ const state = db.internal.asyncStorage.getStore();
4179
+ if (state?.testTransactionCount) state.testTransactionCount--;
4180
+ db.internal.asyncStorage.getStore = getStore;
4181
+ });
4182
+ });
4183
+ },
4184
+ /**
4185
+ * Rollback a test transaction.
4186
+ *
4187
+ * @param arg - the same ORM or query argument passed into the `testTransaction.start`.
4188
+ */
4189
+ rollback(arg) {
4190
+ const db = argToDb(arg);
4191
+ const data = db.internal[trxForTest];
4192
+ const last = data?.pop();
4193
+ if (!last) return;
4194
+ if (!data?.length) Object.assign(db.baseQuery.q.adapter, last.adapter);
4195
+ last.reject?.(new Rollback());
4196
+ return last.promise;
4197
+ },
4198
+ /**
4199
+ * Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),
4200
+ * and if there's no nested test transactions left, it will close the db connection.
4201
+ *
4202
+ * @param arg - the same ORM or query argument passed into the `testTransaction.start`.
4203
+ */
4204
+ async close(arg) {
4205
+ const db = argToDb(arg);
4206
+ await this.rollback(db);
4207
+ if (db.internal[trxForTest]?.length === 0) return db.q.adapter.close();
4208
+ }
4209
+ };
4210
+ const logSavepointRollback = (log, error, rollbackSql, rollbackLogData) => {
4211
+ if (error instanceof Rollback) log.afterQuery(rollbackSql, rollbackLogData);
4212
+ else if (error) log.onError(error, rollbackSql, rollbackLogData);
4213
+ };
4127
4214
  /**
4128
4215
  * Shared runtime adapter orchestrator over a driver-specific adapter implementation.
4129
4216
  */
@@ -4149,11 +4236,11 @@ var AdapterClass = class AdapterClass {
4149
4236
  this.pool = this.driverAdapter.configure(this.config);
4150
4237
  this.errorClass = this.driverAdapter.errorClass;
4151
4238
  }
4152
- query(text, values, sqlSessionState) {
4153
- return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState);
4239
+ query(text, values, sqlSessionState, prepare) {
4240
+ return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, void 0, prepare);
4154
4241
  }
4155
- arrays(text, values, sqlSessionState) {
4156
- return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, true);
4242
+ arrays(text, values, sqlSessionState, prepare) {
4243
+ return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, true, prepare);
4157
4244
  }
4158
4245
  clone(params) {
4159
4246
  return new AdapterClass({
@@ -4197,13 +4284,13 @@ var TransactionAdapterClass = class {
4197
4284
  this.driverAdapter = adapter.driverAdapter;
4198
4285
  this.errorClass = this.adapter.errorClass;
4199
4286
  }
4200
- query(text, values, sqlSessionState) {
4287
+ query(text, values, sqlSessionState, prepare) {
4201
4288
  const setup = sqlSessionContextComputeSetup(sqlSessionState);
4202
- return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup);
4289
+ return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, void 0, prepare);
4203
4290
  }
4204
- arrays(text, values, sqlSessionState) {
4291
+ arrays(text, values, sqlSessionState, prepare) {
4205
4292
  const setup = sqlSessionContextComputeSetup(sqlSessionState);
4206
- return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, true);
4293
+ return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, true, prepare);
4207
4294
  }
4208
4295
  clone(params) {
4209
4296
  return this.adapter.clone(params);
@@ -4256,13 +4343,13 @@ var TransactionAdapterClass = class {
4256
4343
  rollbackSql = { text: `ROLLBACK TO SAVEPOINT "${name}"` };
4257
4344
  rollbackLogData = log.beforeQuery(rollbackSql);
4258
4345
  }, () => {
4259
- if (error) log.onError(error, rollbackSql, rollbackLogData);
4346
+ logSavepointRollback(log, error, rollbackSql, rollbackLogData);
4260
4347
  });
4261
4348
  }
4262
- hackySavepoint(state, text, values, arraysMode, log) {
4349
+ hackySavepoint(state, text, values, arraysMode, prepare, log) {
4263
4350
  if (!log) return this.driverAdapter.hackySavepoint(this.client, (client) => {
4264
4351
  this.client = client;
4265
- }, state, text, values, arraysMode);
4352
+ }, state, text, values, arraysMode, prepare);
4266
4353
  const savepointSql = { text: `SAVEPOINT "${state.name}"` };
4267
4354
  const savepointLogData = log.beforeQuery(savepointSql);
4268
4355
  let releaseSql;
@@ -4272,14 +4359,14 @@ var TransactionAdapterClass = class {
4272
4359
  let error;
4273
4360
  const result = this.driverAdapter.hackySavepoint(this.client, (client) => {
4274
4361
  this.client = client;
4275
- }, state, text, values, arraysMode, () => log.afterQuery(savepointSql, savepointLogData), () => {
4362
+ }, state, text, values, arraysMode, prepare, () => log.afterQuery(savepointSql, savepointLogData), () => {
4276
4363
  releaseSql = { text: `RELEASE SAVEPOINT "${state.name}"` };
4277
4364
  releaseLogData = log.beforeQuery(releaseSql);
4278
4365
  }, () => log.afterQuery(releaseSql, releaseLogData), () => {
4279
4366
  rollbackSql = { text: `ROLLBACK TO SAVEPOINT "${state.name}"` };
4280
4367
  rollbackLogData = log.beforeQuery(rollbackSql);
4281
4368
  }, () => {
4282
- if (error) log.onError(error, rollbackSql, rollbackLogData);
4369
+ logSavepointRollback(log, error, rollbackSql, rollbackLogData);
4283
4370
  });
4284
4371
  const activeSavepoint = state.activeSavepoint;
4285
4372
  if (activeSavepoint) {
@@ -4447,18 +4534,18 @@ const runAfterCommit = (afterCommit, result) => {
4447
4534
  }
4448
4535
  });
4449
4536
  };
4450
- const runQueryHandlePool = async (pool, driverAdapter, text, values, sqlSessionState, arraysMode, client) => {
4537
+ const runQueryHandlePool = async (pool, driverAdapter, text, values, sqlSessionState, arraysMode, prepare, client) => {
4451
4538
  const setup = sqlSessionContextComputeSetup(sqlSessionState);
4452
- if (client || !driverAdapter.manualPool && !setup) return runQueryHandleSetupAndCleanup(driverAdapter, client || pool, text, values, setup, arraysMode);
4539
+ if (client || !driverAdapter.manualPool && !setup) return runQueryHandleSetupAndCleanup(driverAdapter, client || pool, text, values, setup, arraysMode, prepare);
4453
4540
  client = await driverAdapter.borrow(pool);
4454
4541
  try {
4455
- return await runQueryHandleSetupAndCleanup(driverAdapter, client, text, values, setup, arraysMode);
4542
+ return await runQueryHandleSetupAndCleanup(driverAdapter, client, text, values, setup, arraysMode, prepare);
4456
4543
  } finally {
4457
4544
  driverAdapter.release(client);
4458
4545
  }
4459
4546
  };
4460
- const runQueryHandleSetupAndCleanup = (driverAdapter, client, text, values, setup, arraysMode) => {
4461
- const mainQuery = () => driverAdapter.queryClient(client, text, values, arraysMode);
4547
+ const runQueryHandleSetupAndCleanup = (driverAdapter, client, text, values, setup, arraysMode, prepare) => {
4548
+ const mainQuery = () => driverAdapter.queryClient(client, text, values, arraysMode, prepare);
4462
4549
  if (setup) return sqlSessionContextExecute((text, values) => driverAdapter.queryClient(client, text, values, true), setup, mainQuery);
4463
4550
  return mainQuery();
4464
4551
  };
@@ -4773,8 +4860,6 @@ function maybeWrappedThen(resolve, reject, parentSavepoint) {
4773
4860
  })).then(resolve, reject);
4774
4861
  else return then(this, state?.transactionAdapter || this.q.adapter, state, beforeHooks, afterHooks, afterSaveHooks, afterCommitHooks, afterSaveCommitHooks, resolve, reject, shouldCatch, parentSavepoint);
4775
4862
  }
4776
- const queriesNames = {};
4777
- let nameI = 0;
4778
4863
  const callAfterHook = function(cb) {
4779
4864
  return cb(this[0], this[1]);
4780
4865
  };
@@ -4806,7 +4891,7 @@ const then = async (q, adapter, state, beforeHooks, afterHooks, afterSaveHooks,
4806
4891
  const startingSavepoint = setCatchingSavepoint(!parentSavepoint && shouldCatch && state);
4807
4892
  const releasingSavepoint = checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations(sql) || parentSavepoint ? void 0 : parentSavepoint || startingSavepoint;
4808
4893
  if ("text" in sql) {
4809
- if (query.autoPreparedStatements) sql.name = queriesNames[sql.text] || (queriesNames[sql.text] = (nameI++).toString(36));
4894
+ if (query.autoPreparedStatements) sql.prepare = true;
4810
4895
  if (log) logData = log.beforeQuery(sql);
4811
4896
  const method = queryMethodByReturnType[tempReturnType];
4812
4897
  queryResult = await execQuery(adapter, method, sql, log, startingSavepoint, releasingSavepoint, sqlSessionContextGetStateFromAsyncState(state));
@@ -5040,12 +5125,13 @@ const setCatchingSavepoint = (catchTrx) => {
5040
5125
  * because user might expect empty objects to be returned for an empty select.
5041
5126
  */
5042
5127
  const execQuery = (adapter, method, sql, log, startingSavepoint, releasingSavepoint, sqlSessionState) => {
5128
+ const prepare = sql.prepare;
5043
5129
  let promise;
5044
5130
  if (startingSavepoint) if (releasingSavepoint) promise = startingSavepoint.transactionAdapter.savepoint(startingSavepoint.name, log, () => {
5045
- return promise = adapter[method](sql.text, sql.values, sqlSessionState);
5131
+ return prepare ? promise = adapter[method](sql.text, sql.values, sqlSessionState, prepare) : promise = adapter[method](sql.text, sql.values, sqlSessionState);
5046
5132
  });
5047
- else promise = startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", log);
5048
- else promise = adapter[method](sql.text, sql.values, sqlSessionState);
5133
+ else promise = prepare ? startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", prepare, log) : startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", void 0, log);
5134
+ else promise = prepare ? adapter[method](sql.text, sql.values, sqlSessionState, prepare) : adapter[method](sql.text, sql.values, sqlSessionState);
5049
5135
  if (!startingSavepoint && releasingSavepoint) promise = promise.then(async (res) => {
5050
5136
  await releasingSavepoint.activeSavepoint?.release();
5051
5137
  return res;
@@ -6861,6 +6947,7 @@ const _get = (query, returnType, arg) => {
6861
6947
  const q = query.q;
6862
6948
  if (q.returning) q.returning = void 0;
6863
6949
  q.returnType = returnType;
6950
+ q.batchParsers = void 0;
6864
6951
  let value = arg;
6865
6952
  const selectAs = {};
6866
6953
  let column;
@@ -11051,8 +11138,7 @@ const addParserForSelectItem = (query, as, key, arg, columnAlias, joinQuery) =>
11051
11138
  }
11052
11139
  return arg;
11053
11140
  }
11054
- const joinedAs = query.q.valuesJoinedAs?.[arg];
11055
- return setParserForSelectedString(query, joinedAs ? joinedAs + "." + arg : arg, as, key, columnAlias);
11141
+ return setParserForSelectedString(query, arg, as, key, columnAlias);
11056
11142
  };
11057
11143
  const collectNestedSelectBatches = (batches, rows, path) => {
11058
11144
  const last = path.length - 1;
@@ -11099,7 +11185,8 @@ const processSelectAsArg = (q, selectAs, as, key, arg, columnAlias, outerReturnT
11099
11185
  if (isExpression(value)) column = value.result.value;
11100
11186
  else {
11101
11187
  const isSelfReferencingQuery = value.q.subQuery === 1;
11102
- if (isRelationQuery(value) && !isSelfReferencingQuery) {
11188
+ const isSelectingRelation = value.q.subQuery && value.q.subQuery > 1;
11189
+ if (isRelationQuery(value) && isSelectingRelation) {
11103
11190
  joinQuery = true;
11104
11191
  setSelectRelation(query.q);
11105
11192
  value = value.joinQuery(value, q);
@@ -11144,6 +11231,12 @@ const processSelectAsArg = (q, selectAs, as, key, arg, columnAlias, outerReturnT
11144
11231
  };
11145
11232
  const setParserForSelectedString = (query, arg, as, columnAs, columnAlias) => {
11146
11233
  const { q } = query;
11234
+ const joinedAs = q.valuesJoinedAs?.[arg];
11235
+ if (joinedAs) {
11236
+ const parser = q.joinedParsers?.[joinedAs]?.v;
11237
+ if (parser) setParserToQuery(q, columnAs || arg, parser);
11238
+ return joinedAs + "." + arg;
11239
+ }
11147
11240
  const index = arg.indexOf(".");
11148
11241
  if (index === -1) return selectColumn(query, q, arg, columnAs, columnAlias);
11149
11242
  const table = getFullColumnTable(query, arg, index, as);
@@ -12433,17 +12526,6 @@ var OrExpression = class extends Expression {
12433
12526
  }
12434
12527
  };
12435
12528
  Object.assign(OrExpression.prototype, Operators.boolean);
12436
- var ValExpression = class extends Expression {
12437
- constructor(value) {
12438
- super();
12439
- this.value = value;
12440
- this.result = { value: emptyObject };
12441
- this.q = { expr: this };
12442
- }
12443
- makeSQL(ctx) {
12444
- return addValue(ctx.values, this.value);
12445
- }
12446
- };
12447
12529
  var QueryExpressions = class {
12448
12530
  /**
12449
12531
  * `column` references a table column, this can be used in raw SQL or when building a column expression.
@@ -12513,9 +12595,6 @@ var QueryExpressions = class {
12513
12595
  q.q.returnType = void 0;
12514
12596
  return new RefExpression(column || UnknownColumn.instance, q, arg);
12515
12597
  }
12516
- val(value) {
12517
- return new ValExpression(value);
12518
- }
12519
12598
  /**
12520
12599
  * `fn` allows to call an arbitrary SQL function.
12521
12600
  *
@@ -13104,6 +13183,7 @@ var QueryPluck = class {
13104
13183
  pluck(select) {
13105
13184
  const q = _clone(this);
13106
13185
  q.q.returnType = "pluck";
13186
+ q.q.batchParsers = void 0;
13107
13187
  let selected;
13108
13188
  const selectAs = {};
13109
13189
  const item = processSelectAsArg(q, selectAs, q.q.as || q.table, "pluck", select, void 0, "value");
@@ -14418,6 +14498,7 @@ function _createDbSqlMethod(columnTypes) {
14418
14498
  fn.ref = sqlFn.ref;
14419
14499
  fn.join = sqlFn.join;
14420
14500
  fn.unsafe = sqlFn.unsafe;
14501
+ fn.val = sqlFn.val;
14421
14502
  return fn;
14422
14503
  }
14423
14504
  const _initQueryBuilder = (adapter, columnTypes, asyncStorage, commonOptions, options) => {
@@ -14585,77 +14666,6 @@ function copyTableData(query, arg) {
14585
14666
  q.toSQL = () => makeCopySql(q, arg);
14586
14667
  return q;
14587
14668
  }
14588
- var Rollback = class extends Error {};
14589
- const trxForTest = Symbol("trxForTest");
14590
- const argToDb = (arg) => "$qb" in arg ? arg.$qb : arg;
14591
- const testTransaction = {
14592
- /**
14593
- * Start a test transaction.
14594
- * The returned promise is resolved immediately when transaction starts, not waiting for it to end.
14595
- *
14596
- * @param arg - ORM instance or a queryable instance (such as db.someTable).
14597
- */
14598
- start(arg) {
14599
- const db = argToDb(arg);
14600
- const { asyncStorage } = db.internal;
14601
- const { getStore } = asyncStorage;
14602
- const { adapter } = db.baseQuery.q;
14603
- const data = { adapter: {
14604
- query: adapter.query,
14605
- arrays: adapter.arrays,
14606
- transaction: adapter.transaction
14607
- } };
14608
- (db.internal[trxForTest] ??= []).push(data);
14609
- return new Promise((resolve) => {
14610
- data.promise = db.transaction(() => {
14611
- resolve();
14612
- return new Promise((_, rej) => {
14613
- const state = asyncStorage.getStore();
14614
- db.internal.asyncStorage.getStore = () => state;
14615
- const t = state?.transactionAdapter;
14616
- if (t) {
14617
- adapter.query = t.query.bind(t);
14618
- adapter.arrays = t.arrays.bind(t);
14619
- adapter.transaction = t.transaction.bind(t);
14620
- state.testTransactionCount = state.testTransactionCount ? state.testTransactionCount + 1 : 1;
14621
- }
14622
- data.reject = rej;
14623
- });
14624
- }).catch((err) => {
14625
- if (!(err instanceof Rollback)) throw err;
14626
- }).finally(() => {
14627
- const state = db.internal.asyncStorage.getStore();
14628
- if (state?.testTransactionCount) state.testTransactionCount--;
14629
- db.internal.asyncStorage.getStore = getStore;
14630
- });
14631
- });
14632
- },
14633
- /**
14634
- * Rollback a test transaction.
14635
- *
14636
- * @param arg - the same ORM or query argument passed into the `testTransaction.start`.
14637
- */
14638
- rollback(arg) {
14639
- const db = argToDb(arg);
14640
- const data = db.internal[trxForTest];
14641
- const last = data?.pop();
14642
- if (!last) return;
14643
- if (!data?.length) Object.assign(db.baseQuery.q.adapter, last.adapter);
14644
- last.reject?.(new Rollback());
14645
- return last.promise;
14646
- },
14647
- /**
14648
- * Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),
14649
- * and if there's no nested test transactions left, it will close the db connection.
14650
- *
14651
- * @param arg - the same ORM or query argument passed into the `testTransaction.start`.
14652
- */
14653
- async close(arg) {
14654
- const db = argToDb(arg);
14655
- await this.rollback(db);
14656
- if (db.internal[trxForTest]?.length === 0) return db.q.adapter.close();
14657
- }
14658
- };
14659
14669
  exports.AdapterClass = AdapterClass;
14660
14670
  exports.ArrayColumn = ArrayColumn;
14661
14671
  exports.BigIntColumn = BigIntColumn;
@@ -14721,6 +14731,7 @@ exports.TsQueryColumn = TsQueryColumn;
14721
14731
  exports.TsVectorColumn = TsVectorColumn;
14722
14732
  exports.UUIDColumn = UUIDColumn;
14723
14733
  exports.UnknownColumn = UnknownColumn;
14734
+ exports.ValExpression = ValExpression;
14724
14735
  exports.VarCharColumn = VarCharColumn;
14725
14736
  exports.VirtualColumn = VirtualColumn;
14726
14737
  exports.XMLColumn = XMLColumn;