@dbsp/adapter-pgsql 1.7.0 → 1.8.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/index.js CHANGED
@@ -4859,10 +4859,7 @@ var init_where = __esm({
4859
4859
  hasRelationHandler,
4860
4860
  hasNoRelationHandler
4861
4861
  ];
4862
- allWhereHandlers = [
4863
- ...simpleWhereHandlers,
4864
- ...complexWhereHandlers
4865
- ];
4862
+ allWhereHandlers = [...simpleWhereHandlers, ...complexWhereHandlers];
4866
4863
  }
4867
4864
  });
4868
4865
 
@@ -5385,10 +5382,6 @@ __export(handlers_exports, {
5385
5382
  LOGICAL_OPERATORS: () => LOGICAL_OPERATORS,
5386
5383
  NULL_OPERATORS: () => NULL_OPERATORS,
5387
5384
  PATTERN_OPERATORS: () => PATTERN_OPERATORS,
5388
- aggregateExpressionHandlers: () => aggregateExpressionHandlers,
5389
- allExpressionHandlers: () => allExpressionHandlers,
5390
- allIncludeHandlers: () => allIncludeHandlers,
5391
- allWhereHandlers: () => allWhereHandlers,
5392
5385
  andHandler: () => andHandler,
5393
5386
  anyHandler: () => anyHandler,
5394
5387
  arithmeticHandler: () => arithmeticHandler,
@@ -5399,12 +5392,9 @@ __export(handlers_exports, {
5399
5392
  clearHandlers: () => clearHandlers,
5400
5393
  coalesceHandler: () => coalesceHandler,
5401
5394
  columnAliasHandler: () => columnAliasHandler,
5402
- columnExpressionHandlers: () => columnExpressionHandlers,
5403
5395
  columnHandler: () => columnHandler,
5404
5396
  comparisonHandler: () => comparisonHandler,
5405
5397
  compileExpressionIntent: () => compileExpressionIntent,
5406
- complexWhereHandlers: () => complexWhereHandlers,
5407
- conditionalExpressionHandlers: () => conditionalExpressionHandlers,
5408
5398
  countDistinctHandler: () => countDistinctHandler,
5409
5399
  countHandler: () => countHandler,
5410
5400
  createCompilerState: () => createCompilerState,
@@ -5441,7 +5431,6 @@ __export(handlers_exports, {
5441
5431
  jsonComparisonHandler: () => jsonComparisonHandler,
5442
5432
  jsonContainsHandler: () => jsonContainsHandler,
5443
5433
  jsonExistsHandler: () => jsonExistsHandler,
5444
- jsonExpressionHandlers: () => jsonExpressionHandlers,
5445
5434
  jsonExtractHandler: () => jsonExtractHandler,
5446
5435
  jsonPathExtractHandler: () => jsonPathExtractHandler,
5447
5436
  lagHandler: () => lagHandler,
@@ -5462,11 +5451,9 @@ __export(handlers_exports, {
5462
5451
  orHandler: () => orHandler,
5463
5452
  prefixedRelationColumnHandler: () => prefixedRelationColumnHandler,
5464
5453
  pseudoColumnHandler: () => pseudoColumnHandler,
5465
- pseudoExpressionHandlers: () => pseudoExpressionHandlers,
5466
5454
  rangeHandler: () => rangeHandler,
5467
5455
  rankHandler: () => rankHandler,
5468
5456
  rawExistsHandler: () => rawExistsHandler,
5469
- rawExpressionHandlers: () => rawExpressionHandlers,
5470
5457
  rawHandler: () => rawHandler,
5471
5458
  registerAllExpressionHandlers: () => registerAllExpressionHandlers,
5472
5459
  registerAllIncludeHandlers: () => registerAllIncludeHandlers,
@@ -5478,7 +5465,6 @@ __export(handlers_exports, {
5478
5465
  relationAliasHandler: () => relationAliasHandler,
5479
5466
  relationColumnHandler: () => relationColumnHandler,
5480
5467
  relationColumnsHandler: () => relationColumnsHandler,
5481
- relationExpressionHandlers: () => relationExpressionHandlers,
5482
5468
  relationFilterHandler: () => relationFilterHandler,
5483
5469
  relationStarHandler: () => relationStarHandler,
5484
5470
  rowNumberHandler: () => rowNumberHandler,
@@ -5488,8 +5474,7 @@ __export(handlers_exports, {
5488
5474
  singleHopPseudoHandler: () => singleHopPseudoHandler,
5489
5475
  sqlFunctionHandler: () => sqlFunctionHandler,
5490
5476
  starHandler: () => starHandler,
5491
- sumHandler: () => sumHandler,
5492
- windowExpressionHandlers: () => windowExpressionHandlers
5477
+ sumHandler: () => sumHandler
5493
5478
  });
5494
5479
  function registerWhereHandler(handler) {
5495
5480
  for (const op3 of handler.operators) {
@@ -6929,6 +6914,14 @@ var init_raw = __esm({
6929
6914
  });
6930
6915
 
6931
6916
  // src/handlers/expression/relation.ts
6917
+ function resolveRelationAlias(relation, state, options = {}) {
6918
+ if (options.resolveDottedLeaf && relation.includes(".")) {
6919
+ const segments = relation.split(".");
6920
+ const leaf = segments[segments.length - 1];
6921
+ return state.aliases.get(relation) ?? state.aliases.get(leaf) ?? leaf;
6922
+ }
6923
+ return state.aliases.get(relation) ?? relation;
6924
+ }
6932
6925
  var relationStarHandler, relationColumnHandler, relationColumnsHandler, relationAliasHandler, prefixedRelationColumnHandler;
6933
6926
  var init_relation = __esm({
6934
6927
  "src/handlers/expression/relation.ts"() {
@@ -6961,14 +6954,9 @@ var init_relation = __esm({
6961
6954
  if (!column) {
6962
6955
  throw new Error("Relation column handler requires column name");
6963
6956
  }
6964
- let alias;
6965
- if (relation.includes(".")) {
6966
- const segments = relation.split(".");
6967
- const leaf = segments[segments.length - 1];
6968
- alias = state.aliases.get(relation) ?? state.aliases.get(leaf) ?? leaf;
6969
- } else {
6970
- alias = state.aliases.get(relation) ?? relation;
6971
- }
6957
+ const alias = resolveRelationAlias(relation, state, {
6958
+ resolveDottedLeaf: true
6959
+ });
6972
6960
  if (column === "*") {
6973
6961
  return columnRefStar(alias, ctx.naming);
6974
6962
  }
@@ -6986,7 +6974,7 @@ var init_relation = __esm({
6986
6974
  if (!columns || columns.length === 0) {
6987
6975
  throw new Error("Relation columns handler requires columns array");
6988
6976
  }
6989
- const alias = state.aliases.get(relation) ?? relation;
6977
+ const alias = resolveRelationAlias(relation, state);
6990
6978
  const column = columns[0];
6991
6979
  const colRef = columnRef(column, alias, void 0, ctx.naming);
6992
6980
  const outputAlias = decision.alias;
@@ -7012,7 +7000,7 @@ var init_relation = __esm({
7012
7000
  if (!column) {
7013
7001
  throw new Error("Relation alias handler requires column name");
7014
7002
  }
7015
- const tableAlias = state.aliases.get(relation) ?? relation;
7003
+ const tableAlias = resolveRelationAlias(relation, state);
7016
7004
  const colRef = columnRef(column, tableAlias, void 0, ctx.naming);
7017
7005
  if (!outputAlias) {
7018
7006
  return colRef;
@@ -7283,15 +7271,8 @@ var init_expression = __esm({
7283
7271
  lastValueHandler,
7284
7272
  genericWindowHandler
7285
7273
  ];
7286
- rawExpressionHandlers = [
7287
- rawHandler,
7288
- sqlFunctionHandler,
7289
- literalHandler
7290
- ];
7291
- jsonExpressionHandlers = [
7292
- jsonExtractHandler,
7293
- jsonPathExtractHandler
7294
- ];
7274
+ rawExpressionHandlers = [rawHandler, sqlFunctionHandler, literalHandler];
7275
+ jsonExpressionHandlers = [jsonExtractHandler, jsonPathExtractHandler];
7295
7276
  pseudoExpressionHandlers = [
7296
7277
  pseudoColumnHandler,
7297
7278
  singleHopPseudoHandler,
@@ -15960,9 +15941,6 @@ function assertSafeTypeName(typeName, colIndex) {
15960
15941
  }
15961
15942
  }
15962
15943
  }
15963
- function bridgeLegacyDecisions(decisions) {
15964
- return decisions;
15965
- }
15966
15944
  function buildBatchValuesRangeFn(bv, startParamIndex, aliasOverride) {
15967
15945
  const params = [];
15968
15946
  let paramIdx = startParamIndex - 1;
@@ -16369,7 +16347,7 @@ function compileSelect(plan, options, deps) {
16369
16347
  } else {
16370
16348
  simplifiedPlan = {
16371
16349
  rootTable: plan.rootTable,
16372
- decisions: bridgeLegacyDecisions(plan.decisions),
16350
+ decisions: plan.decisions,
16373
16351
  ...schemaName ? { schema: schemaName } : {}
16374
16352
  };
16375
16353
  }
@@ -18505,6 +18483,73 @@ function assertRuntimeBindingValuesParameterCount(name, binding, parameterOffset
18505
18483
  `NQL runtime binding '${name}' would materialize ${valueParameterCount} VALUES parameters; limit is ${MAX_NQL_RUNTIME_BINDING_VALUES_PARAMETERS}. Current parameter offset is ${parameterOffset}, which would make ${totalParameterCount} total parameters before compiling the final statement.`
18506
18484
  );
18507
18485
  }
18486
+ function resolvePgTypeForColumnTypeInfo(bindingName, column, info) {
18487
+ if (info.kind === "aggregate" && info.fn !== "count") {
18488
+ throw new Error(
18489
+ `NQL runtime binding '${bindingName}' cannot resolve a PostgreSQL type for projected column '${column}': unsupported aggregate kind '${String(info.fn)}'.`
18490
+ );
18491
+ }
18492
+ const rawType = info.kind === "aggregate" ? "bigint" : info.originalDbType?.trim() || mapRuntimeBindingColumnType(info.type);
18493
+ if (rawType === void 0 || rawType.trim() === "") {
18494
+ throw new Error(
18495
+ `NQL runtime binding '${bindingName}' cannot resolve a PostgreSQL type for projected column '${column}'.`
18496
+ );
18497
+ }
18498
+ const typeName = rawType.trim();
18499
+ try {
18500
+ validateTypeName4(typeName);
18501
+ } catch (error) {
18502
+ const reason = error instanceof Error ? error.message : String(error);
18503
+ throw new Error(
18504
+ `NQL runtime binding '${bindingName}' cannot use PostgreSQL cast type for projected column '${column}': ${reason}`
18505
+ );
18506
+ }
18507
+ return typeName;
18508
+ }
18509
+ function resolveRuntimeBindingCteColumnTypes(name, binding) {
18510
+ const columnTypes = binding.columnTypes;
18511
+ if (columnTypes === void 0) {
18512
+ throw new Error(
18513
+ `NQL runtime binding '${name}' cannot resolve typed columns without a columnTypes map.`
18514
+ );
18515
+ }
18516
+ return binding.columns.map((column) => {
18517
+ const info = columnTypes[column];
18518
+ if (info === void 0) {
18519
+ throw new Error(
18520
+ `NQL runtime binding '${name}' is missing type info for projected column '${column}'.`
18521
+ );
18522
+ }
18523
+ return resolvePgTypeForColumnTypeInfo(name, column, info);
18524
+ });
18525
+ }
18526
+ function compileTypedNqlRuntimeBindingCte(name, binding, naming, parameterOffset, cteName, columnSql) {
18527
+ const pgTypes = resolveRuntimeBindingCteColumnTypes(name, binding);
18528
+ const anchorColumns = binding.columns.map(
18529
+ (column, columnIndex) => `CAST(NULL AS ${pgTypes[columnIndex]}) AS ${quoteIdent2(naming.toDatabase(column), "column")}`
18530
+ ).join(", ");
18531
+ const sourceAnchorSql = `SELECT ${anchorColumns} WHERE false`;
18532
+ if (binding.rows.length === 0) {
18533
+ return {
18534
+ cte: `${cteName} (${columnSql}) as (${sourceAnchorSql})`,
18535
+ parameters: []
18536
+ };
18537
+ }
18538
+ assertRuntimeBindingValuesParameterCount(name, binding, parameterOffset);
18539
+ const parameters = [];
18540
+ let nextParam = parameterOffset + 1;
18541
+ const valuesSql = binding.rows.map((row) => {
18542
+ const placeholders = binding.columns.map((column, columnIndex) => {
18543
+ parameters.push(row[column]);
18544
+ return `$${nextParam++}::${pgTypes[columnIndex]}`;
18545
+ });
18546
+ return `(${placeholders.join(", ")})`;
18547
+ }).join(", ");
18548
+ return {
18549
+ cte: `${cteName} (${columnSql}) as (${sourceAnchorSql} UNION ALL VALUES ${valuesSql})`,
18550
+ parameters
18551
+ };
18552
+ }
18508
18553
  function compileNqlRuntimeBindingCte(name, binding, naming, parameterOffset, sourceTable, schemaName, model) {
18509
18554
  if (binding.columns.length === 0) {
18510
18555
  throw new Error(
@@ -18513,6 +18558,16 @@ function compileNqlRuntimeBindingCte(name, binding, naming, parameterOffset, sou
18513
18558
  }
18514
18559
  const cteName = quoteIdent2(emittedBindName(name, naming), "alias");
18515
18560
  const columnSql = binding.columns.map((column) => quoteIdent2(naming.toDatabase(column), "column")).join(", ");
18561
+ if (binding.columnTypes !== void 0) {
18562
+ return compileTypedNqlRuntimeBindingCte(
18563
+ name,
18564
+ binding,
18565
+ naming,
18566
+ parameterOffset,
18567
+ cteName,
18568
+ columnSql
18569
+ );
18570
+ }
18516
18571
  if (sourceTable === void 0) {
18517
18572
  throw new Error(
18518
18573
  `NQL runtime binding '${name}' cannot materialize a typed relation because its source table is unavailable.`