@prisma-next/adapter-postgres 0.16.0-dev.2 → 0.16.0-dev.21

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.
@@ -1,4 +1,4 @@
1
- import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-B6IM_oTR.mjs";
1
+ import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-hSsjUXtc.mjs";
2
2
  import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
3
3
  import { isDdlNode } from "@prisma-next/sql-relational-core/ast";
4
4
  //#region src/core/adapter.ts
@@ -63,4 +63,4 @@ function createPostgresAdapter(options) {
63
63
  //#endregion
64
64
  export { postgresRawCodecInferer as n, createPostgresAdapter as t };
65
65
 
66
- //# sourceMappingURL=adapter-BaZsfXGA.mjs.map
66
+ //# sourceMappingURL=adapter-DcBWxseT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-BaZsfXGA.mjs","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AnyQueryAst,\n LowererContext,\n RawSqlLiteral,\n SqlQueryable,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { PostgresDdlNode } from '@prisma-next/target-postgres/ddl';\nimport { createPostgresBuiltinCodecLookup } from './codec-lookup';\nimport { PostgresControlAdapter } from './control-adapter';\nimport { renderLoweredSql } from './sql-renderer';\nimport type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';\n\nconst defaultCapabilities = Object.freeze({\n postgres: {\n orderBy: true,\n limit: true,\n lateral: true,\n jsonAgg: true,\n returning: true,\n distinctOn: true,\n },\n sql: {\n enums: true,\n returning: true,\n defaultInInsert: true,\n lateral: true,\n scalarList: true,\n },\n});\n\nclass PostgresAdapterImpl\n implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement>\n{\n // These fields make the adapter instance structurally compatible with RuntimeAdapterInstance<'sql', 'postgres'> without introducing a runtime-plane dependency.\n readonly familyId = 'sql' as const;\n readonly targetId = 'postgres' as const;\n\n readonly profile: AdapterProfile<'postgres'>;\n private readonly codecLookup: CodecRegistry;\n\n constructor(options?: PostgresAdapterOptions) {\n this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();\n const controlAdapter = new PostgresControlAdapter(this.codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'postgres',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | PostgresDdlNode,\n context: LowererContext<PostgresContract>,\n ): PostgresLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract, this.codecLookup);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a postgres client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const postgresRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0 ? 'pg/int4' : 'pg/float8';\n case 'bigint':\n return 'pg/int8';\n case 'string':\n return 'pg/text';\n case 'boolean':\n return 'pg/bool';\n case 'object':\n if (value instanceof Uint8Array) return 'pg/bytea';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;AAkBA,MAAM,sBAAsB,OAAO,OAAO;CACxC,UAAU;EACR,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACX,YAAY;CACd;CACA,KAAK;EACH,OAAO;EACP,WAAW;EACX,iBAAiB;EACjB,SAAS;EACT,YAAY;CACd;AACF,CAAC;AAED,IAAM,sBAAN,MAEA;CAEE,WAAoB;CACpB,WAAoB;CAEpB;CACA;CAEA,YAAY,SAAkC;EAC5C,KAAK,cAAc,SAAS,eAAe,iCAAiC;EAC5E,MAAM,iBAAiB,IAAI,uBAAuB,KAAK,WAAW;EAClE,KAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,aAAa,cACX,eAAe,wBACb;IACE,UAAU;IACV,UAAU;IACV,OAAO,OACL,KACA,WACG;KAEH,OAAO,EAAE,MAAM,CAAC,IAAG,MADE,UAAU,MAAW,KAAK,MAAM,EAAA,CAC3B,IAAI,EAAE;IAClC;IACA,OAAO,YAAY,CAAC;GACtB,GACA,YACF;EACJ,CAAC;CACH;CAEA,MACE,KACA,SAC0B;EAC1B,IAAI,UAAU,GAAG,GACf,MAAM,IAAI,MACR,6HACF;EAEF,OAAO,iBAAiB,KAAK,QAAQ,UAAU,KAAK,WAAW;CACjE;AACF;;AAGA,MAAa,0BAA2C,EACtD,WAAW,OAA8B;CACvC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,MAAM,IAAI,YAAY;EACtE,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,YAAY,OAAO;CAC5C;CACA,MAAM,IAAI,MACR,6GACF;AACF,EACF;AAEA,SAAgB,sBAAsB,SAAkC;CACtE,OAAO,OAAO,OAAO,IAAI,oBAAoB,OAAO,CAAC;AACvD"}
1
+ {"version":3,"file":"adapter-DcBWxseT.mjs","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AnyQueryAst,\n LowererContext,\n RawSqlLiteral,\n SqlQueryable,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { PostgresDdlNode } from '@prisma-next/target-postgres/ddl';\nimport { createPostgresBuiltinCodecLookup } from './codec-lookup';\nimport { PostgresControlAdapter } from './control-adapter';\nimport { renderLoweredSql } from './sql-renderer';\nimport type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';\n\nconst defaultCapabilities = Object.freeze({\n postgres: {\n orderBy: true,\n limit: true,\n lateral: true,\n jsonAgg: true,\n returning: true,\n distinctOn: true,\n },\n sql: {\n enums: true,\n returning: true,\n defaultInInsert: true,\n lateral: true,\n scalarList: true,\n },\n});\n\nclass PostgresAdapterImpl\n implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement>\n{\n // These fields make the adapter instance structurally compatible with RuntimeAdapterInstance<'sql', 'postgres'> without introducing a runtime-plane dependency.\n readonly familyId = 'sql' as const;\n readonly targetId = 'postgres' as const;\n\n readonly profile: AdapterProfile<'postgres'>;\n private readonly codecLookup: CodecRegistry;\n\n constructor(options?: PostgresAdapterOptions) {\n this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();\n const controlAdapter = new PostgresControlAdapter(this.codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'postgres',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | PostgresDdlNode,\n context: LowererContext<PostgresContract>,\n ): PostgresLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract, this.codecLookup);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a postgres client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const postgresRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0 ? 'pg/int4' : 'pg/float8';\n case 'bigint':\n return 'pg/int8';\n case 'string':\n return 'pg/text';\n case 'boolean':\n return 'pg/bool';\n case 'object':\n if (value instanceof Uint8Array) return 'pg/bytea';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;AAkBA,MAAM,sBAAsB,OAAO,OAAO;CACxC,UAAU;EACR,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACX,YAAY;CACd;CACA,KAAK;EACH,OAAO;EACP,WAAW;EACX,iBAAiB;EACjB,SAAS;EACT,YAAY;CACd;AACF,CAAC;AAED,IAAM,sBAAN,MAEA;CAEE,WAAoB;CACpB,WAAoB;CAEpB;CACA;CAEA,YAAY,SAAkC;EAC5C,KAAK,cAAc,SAAS,eAAe,iCAAiC;EAC5E,MAAM,iBAAiB,IAAI,uBAAuB,KAAK,WAAW;EAClE,KAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,aAAa,cACX,eAAe,wBACb;IACE,UAAU;IACV,UAAU;IACV,OAAO,OACL,KACA,WACG;KAEH,OAAO,EAAE,MAAM,CAAC,IAAG,MADE,UAAU,MAAW,KAAK,MAAM,EAAA,CAC3B,IAAI,EAAE;IAClC;IACA,OAAO,YAAY,CAAC;GACtB,GACA,YACF;EACJ,CAAC;CACH;CAEA,MACE,KACA,SAC0B;EAC1B,IAAI,UAAU,GAAG,GACf,MAAM,IAAI,MACR,6HACF;EAEF,OAAO,iBAAiB,KAAK,QAAQ,UAAU,KAAK,WAAW;CACjE;AACF;;AAGA,MAAa,0BAA2C,EACtD,WAAW,OAA8B;CACvC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,MAAM,IAAI,YAAY;EACtE,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,YAAY,OAAO;CAC5C;CACA,MAAM,IAAI,MACR,6GACF;AACF,EACF;AAEA,SAAgB,sBAAsB,SAAkC;CACtE,OAAO,OAAO,OAAO,IAAI,oBAAoB,OAAO,CAAC;AACvD"}
package/dist/adapter.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-BaZsfXGA.mjs";
1
+ import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-DcBWxseT.mjs";
2
2
  export { createPostgresAdapter, postgresRawCodecInferer };
@@ -1,6 +1,6 @@
1
1
  import { APP_SPACE_ID, extractCodecLookup } from "@prisma-next/framework-components/control";
2
2
  import { LiteralExpr, RawExpr, collectOrderedParamRefs, isDdlNode } from "@prisma-next/sql-relational-core/ast";
3
- import { postgresCodecRegistry } from "@prisma-next/target-postgres/codecs";
3
+ import { isPgEnumParams, postgresCodecRegistry } from "@prisma-next/target-postgres/codecs";
4
4
  import { parseMarkerRowSafely, rethrowMarkerReadError, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
5
5
  import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
6
6
  import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
@@ -10,7 +10,7 @@ import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries, int
10
10
  import { parsePostgresDefault } from "@prisma-next/target-postgres/default-normalizer";
11
11
  import { normalizeSchemaNativeType } from "@prisma-next/target-postgres/native-type-normalizer";
12
12
  import { parseRlsPolicyWireName } from "@prisma-next/target-postgres/rls-canonicalize";
13
- import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
13
+ import { escapeLiteral, quoteIdentifier, quoteQualifiedName } from "@prisma-next/target-postgres/sql-utils";
14
14
  import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresSchemaNodeKind, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
15
15
  import { blindCast } from "@prisma-next/utils/casts";
16
16
  import { ifDefined } from "@prisma-next/utils/defined";
@@ -34,7 +34,7 @@ function createPostgresBuiltinCodecLookup() {
34
34
  //#endregion
35
35
  //#region ../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs
36
36
  function ledgerOriginFromStored(originCoreHash) {
37
- if (originCoreHash === null || originCoreHash === "" || originCoreHash === "sha256:empty") return null;
37
+ if (originCoreHash === null || originCoreHash === "" || originCoreHash === "empty") return null;
38
38
  return originCoreHash;
39
39
  }
40
40
  //#endregion
@@ -163,13 +163,14 @@ const POSTGRES_INFERRABLE_NATIVE_TYPES = /* @__PURE__ */ new Set([
163
163
  function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
164
164
  if (codecId === void 0) return `$${index}`;
165
165
  const meta = codecLookup.metaFor(codecId, typeParams);
166
- if (!(codecLookup.get(codecId) !== void 0 || meta !== void 0 || codecLookup.targetTypesFor(codecId) !== void 0)) throw new Error(`Postgres lowering: ParamRef carries codecId "${codecId}" but the assembled codec lookup has no entry for it. This usually indicates a missing extension pack in the runtime stack — register the pack that contributes this codec (e.g. \`extensionPacks: [pgvectorRuntime]\`), or use the codec directly from \`@prisma-next/target-postgres/codecs\` if it's a builtin.`);
166
+ if (!(codecLookup.get(codecId) !== void 0 || meta !== void 0 || codecLookup.targetTypesFor(codecId) !== void 0)) throw new Error(`Postgres lowering: ParamRef carries codecId "${codecId}" but the assembled codec lookup has no entry for it. This usually indicates a missing extension pack in the runtime stack — register the pack that contributes this codec (e.g. \`extensions: [pgvectorRuntime]\`), or use the codec directly from \`@prisma-next/target-postgres/codecs\` if it's a builtin.`);
167
167
  const dbRecord = meta?.db;
168
168
  const sqlBlock = isRecord(dbRecord) ? dbRecord["sql"] : void 0;
169
169
  const dialectBlock = isRecord(sqlBlock) ? sqlBlock["postgres"] : void 0;
170
170
  const nativeType = isRecord(dialectBlock) ? dialectBlock["nativeType"] : void 0;
171
171
  if (typeof nativeType === "string") {
172
172
  const arraySuffix = many ? "[]" : "";
173
+ if (isPgEnumParams(typeParams)) return `$${index}::${quoteQualifiedName(nativeType)}${arraySuffix}`;
173
174
  if (!POSTGRES_INFERRABLE_NATIVE_TYPES.has(nativeType)) return `$${index}::${nativeType}${arraySuffix}`;
174
175
  if (many) return `$${index}::${nativeType}${arraySuffix}`;
175
176
  }
@@ -178,6 +179,11 @@ function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
178
179
  function isRecord(value) {
179
180
  return typeof value === "object" && value !== null;
180
181
  }
182
+ function unreachableKind(value) {
183
+ const candidate = value;
184
+ if (typeof candidate === "object" && candidate !== null && "kind" in candidate && typeof candidate.kind === "string") return candidate.kind;
185
+ return "unknown";
186
+ }
181
187
  /**
182
188
  * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
183
189
  *
@@ -219,7 +225,7 @@ function renderLoweredSql(ast, contract, codecLookup) {
219
225
  sql = renderRawSql(node, contract, pim);
220
226
  break;
221
227
  // v8 ignore next 4
222
- default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
228
+ default: throw new Error(`Unsupported AST node kind: ${unreachableKind(node)}`);
223
229
  }
224
230
  return Object.freeze({
225
231
  sql,
@@ -359,11 +365,10 @@ function renderSource(source, contract, pim) {
359
365
  case "derived-table-source": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;
360
366
  case "function-source": {
361
367
  const args = node.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
362
- const call = `${node.fn}(${args})`;
363
- return node.alias !== void 0 ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
368
+ return `${`${node.fn}(${args})`}${node.ordinality ? " WITH ORDINALITY" : ""}${node.alias === void 0 ? "" : ` AS ${quoteIdentifier(node.alias)}`}${node.columnAliases === void 0 ? "" : `(${node.columnAliases.map((column) => quoteIdentifier(column)).join(", ")})`}`;
364
369
  }
365
370
  // v8 ignore next 4
366
- default: throw new Error(`Unsupported source node kind: ${node.kind}`);
371
+ default: throw new Error(`Unsupported source node kind: ${unreachableKind(node)}`);
367
372
  }
368
373
  }
369
374
  function assertScalarSubquery(query) {
@@ -395,6 +400,9 @@ function isAtomicExpressionKind(kind) {
395
400
  case "literal":
396
401
  case "aggregate":
397
402
  case "window-func":
403
+ case "function-call":
404
+ case "cast":
405
+ case "case":
398
406
  case "json-object":
399
407
  case "json-array-agg":
400
408
  case "list": return true;
@@ -469,11 +477,26 @@ function renderAggregateExpr(expr, contract, pim) {
469
477
  function renderWindowFuncExpr(expr, contract, pim) {
470
478
  return `${expr.fn.toUpperCase()}(${expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ")}) OVER (${[expr.partitionBy && expr.partitionBy.length > 0 ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract, pim)).join(", ")}` : "", expr.orderBy && expr.orderBy.length > 0 ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : ""].filter((part) => part.length > 0).join(" ")})`;
471
479
  }
480
+ function renderFunctionCallExpr(expr, contract, pim) {
481
+ const args = expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
482
+ return `${expr.fn}(${args})`;
483
+ }
484
+ function renderCastExpr(expr, contract, pim) {
485
+ return `CAST(${renderExpr(expr.expr, contract, pim)} AS ${expr.targetType})`;
486
+ }
487
+ function renderCaseExpr(expr, contract, pim) {
488
+ return `CASE ${expr.branches.map((branch) => `WHEN ${renderExpr(branch.condition, contract, pim)} THEN ${renderExpr(branch.value, contract, pim)}`).join(" ")}${expr.elseExpr === void 0 ? "" : ` ELSE ${renderExpr(expr.elseExpr, contract, pim)}`} END`;
489
+ }
490
+ function renderJsonValueProjection(projection, contract, pim) {
491
+ return projection.accept({
492
+ codec: ({ value }) => renderExpr(value, contract, pim),
493
+ native: ({ value }) => renderExpr(value, contract, pim),
494
+ document: ({ value }) => renderExpr(value, contract, pim)
495
+ });
496
+ }
472
497
  function renderJsonObjectExpr(expr, contract, pim) {
473
498
  return `json_build_object(${expr.entries.flatMap((entry) => {
474
- const key = `'${escapeLiteral(entry.key)}'`;
475
- if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
476
- return [key, renderExpr(entry.value, contract, pim)];
499
+ return [`'${escapeLiteral(entry.key)}'`, renderJsonValueProjection(entry.value, contract, pim)];
477
500
  }).join(", ")})`;
478
501
  }
479
502
  function renderOrderByItems(items, contract, pim) {
@@ -481,7 +504,7 @@ function renderOrderByItems(items, contract, pim) {
481
504
  }
482
505
  function renderJsonArrayAggExpr(expr, contract, pim) {
483
506
  const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : "";
484
- const aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;
507
+ const aggregated = `json_agg(${renderJsonValueProjection(expr.expr, contract, pim)}${aggregateOrderBy})`;
485
508
  if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, json_build_array())`;
486
509
  return aggregated;
487
510
  }
@@ -494,6 +517,9 @@ function renderExpr(expr, contract, pim) {
494
517
  case "subquery": return renderSubqueryExpr(node, contract, pim);
495
518
  case "aggregate": return renderAggregateExpr(node, contract, pim);
496
519
  case "window-func": return renderWindowFuncExpr(node, contract, pim);
520
+ case "function-call": return renderFunctionCallExpr(node, contract, pim);
521
+ case "cast": return renderCastExpr(node, contract, pim);
522
+ case "case": return renderCaseExpr(node, contract, pim);
497
523
  case "json-object": return renderJsonObjectExpr(node, contract, pim);
498
524
  case "json-array-agg": return renderJsonArrayAggExpr(node, contract, pim);
499
525
  case "binary": return renderBinary(node, contract, pim);
@@ -512,7 +538,7 @@ function renderExpr(expr, contract, pim) {
512
538
  case "list": return renderListLiteral(node, contract, pim);
513
539
  case "raw-expr": return renderRawExpr(node, contract, pim);
514
540
  // v8 ignore next 4
515
- default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
541
+ default: throw new Error(`Unsupported expression node kind: ${unreachableKind(node)}`);
516
542
  }
517
543
  }
518
544
  function renderParamRef(ref, pim) {
@@ -589,7 +615,7 @@ function renderInsertValue(value, contract, pim) {
589
615
  case "column-ref": return renderColumn(value);
590
616
  case "raw-expr": return renderExpr(value, contract, pim);
591
617
  // v8 ignore next 4
592
- default: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);
618
+ default: throw new Error(`Unsupported value node in INSERT: ${unreachableKind(value)}`);
593
619
  }
594
620
  }
595
621
  function renderInsert(ast, contract, pim) {
@@ -627,7 +653,7 @@ function renderInsert(ast, contract, pim) {
627
653
  return ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
628
654
  }
629
655
  // v8 ignore next 4
630
- default: throw new Error(`Unsupported onConflict action: ${action.kind}`);
656
+ default: throw new Error(`Unsupported onConflict action: ${unreachableKind(action)}`);
631
657
  }
632
658
  })() : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
633
659
  }
@@ -1087,6 +1113,7 @@ var PostgresControlAdapter = class {
1087
1113
  i.tablename,
1088
1114
  i.indexname,
1089
1115
  ix.indisunique,
1116
+ ix.indpred IS NOT NULL AS indpartial,
1090
1117
  a.attname,
1091
1118
  k.ord AS index_position,
1092
1119
  am.amname,
@@ -1230,6 +1257,7 @@ var PostgresControlAdapter = class {
1230
1257
  columns: [idxRow.attname],
1231
1258
  name: idxRow.indexname,
1232
1259
  unique: idxRow.indisunique,
1260
+ partial: idxRow.indpartial,
1233
1261
  type: indexType,
1234
1262
  options: indexOptions
1235
1263
  });
@@ -1246,8 +1274,10 @@ var PostgresControlAdapter = class {
1246
1274
  columns: Object.freeze([...idx.columns]),
1247
1275
  name: idx.name,
1248
1276
  unique: idx.unique,
1249
- ...idx.type !== void 0 && { type: idx.type },
1250
- ...idx.options !== void 0 && { options: idx.options },
1277
+ partial: idx.partial,
1278
+ type: idx.type,
1279
+ options: idx.options,
1280
+ annotations: void 0,
1251
1281
  dependsOn: postgresColumnDependsOn(schema, tableName, idx.columns)
1252
1282
  }));
1253
1283
  const checksForTable = [];
@@ -1790,4 +1820,4 @@ async function pgRenderDdlExecuteRequest(ast, codecLookup) {
1790
1820
  //#endregion
1791
1821
  export { renderLoweredSql as n, createPostgresBuiltinCodecLookup as r, PostgresControlAdapter as t };
1792
1822
 
1793
- //# sourceMappingURL=control-adapter-B6IM_oTR.mjs.map
1823
+ //# sourceMappingURL=control-adapter-hSsjUXtc.mjs.map