@prisma-next/adapter-postgres 0.15.0 → 0.16.0-dev.10
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/{adapter-CssyjkaR.mjs → adapter-BbIiMeqB.mjs} +2 -2
- package/dist/{adapter-CssyjkaR.mjs.map → adapter-BbIiMeqB.mjs.map} +1 -1
- package/dist/adapter.d.mts +1 -2
- package/dist/adapter.d.mts.map +1 -1
- package/dist/adapter.mjs +1 -1
- package/dist/column-types.d.mts +0 -1
- package/dist/column-types.d.mts.map +1 -1
- package/dist/{control-adapter-w2BFxQ--.mjs → control-adapter-XtIRYsO-.mjs} +161 -73
- package/dist/control-adapter-XtIRYsO-.mjs.map +1 -0
- package/dist/control.d.mts +0 -1
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +1 -1
- package/dist/operation-types.d.mts +0 -1
- package/dist/operation-types.d.mts.map +1 -1
- package/dist/runtime.d.mts +1 -2
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +1 -1
- package/dist/{types-DkGeLfUp.d.mts → types-DyNEvnRB.d.mts} +1 -2
- package/dist/types-DyNEvnRB.d.mts.map +1 -0
- package/dist/types.d.mts +1 -1
- package/package.json +24 -24
- package/src/core/control-adapter.ts +154 -68
- package/src/core/sql-renderer.ts +79 -21
- package/dist/control-adapter-w2BFxQ--.mjs.map +0 -1
- package/dist/types-DkGeLfUp.d.mts.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-
|
|
1
|
+
import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-XtIRYsO-.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-
|
|
66
|
+
//# sourceMappingURL=adapter-BbIiMeqB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-
|
|
1
|
+
{"version":3,"file":"adapter-BbIiMeqB.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.d.mts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-
|
|
1
|
+
import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-DyNEvnRB.mjs";
|
|
2
2
|
import { Adapter, AdapterProfile, AnyQueryAst, LowererContext } from "@prisma-next/sql-relational-core/ast";
|
|
3
3
|
import { RawCodecInferer } from "@prisma-next/sql-relational-core/expression";
|
|
4
4
|
import { PostgresDdlNode } from "@prisma-next/target-postgres/ddl";
|
|
5
|
-
|
|
6
5
|
//#region src/core/adapter.d.ts
|
|
7
6
|
declare class PostgresAdapterImpl implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement> {
|
|
8
7
|
readonly familyId: "sql";
|
package/dist/adapter.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;cAoCM,+BACO,QAAQ,aAAa,kBAAkB;WAGzC;WACA;WAEA,SAAS;mBACD;cAEL,UAAU;EA0BtB,MACE,KAAK,cAAc,iBACnB,SAAS,eAAe,oBACvB;;;cAWQ,yBAAyB;iBAoBtB,sBAAsB,UAAU,yBAAsB,SAAA"}
|
package/dist/adapter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-
|
|
1
|
+
import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-BbIiMeqB.mjs";
|
|
2
2
|
export { createPostgresAdapter, postgresRawCodecInferer };
|
package/dist/column-types.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"mappings":";;cA8Ba;WAAA;WAAA;;iBAKG,WAAW,iBAAiB;WACjC;aAAuB;;;iBASlB,cAAc,iBAAiB;WACpC;aAAuB;;;cASrB;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;iBAKG,cACd,mBACA,iBACC;WACQ;aAAuB;aAA4B;;;cASjD;WAAA;WAAA;;cAKA;WAAA;WAAA;;iBAKG,WAAW,qBAAqB;WACrC;aAAwB;;;iBASnB,aAAa,qBAAqB;WACvC;aAAwB;;;cAStB;WAAA;WAAA;;iBAKG,UAAU,iBAAiB;WAChC;aAAuB;;;iBASlB,aAAa,iBAAiB;WACnC;aAAuB;;;;;;;;cAcrB;WAAA;WAAA;;iBAKG,eAAe,qBAAqB;WACzC;aAAwB;;;;;;;;cActB;WAAA;WAAA;;;;;cAQA;WAAA;WAAA"}
|
|
@@ -5,12 +5,13 @@ import { parseMarkerRowSafely, rethrowMarkerReadError, withMarkerReadErrorHandli
|
|
|
5
5
|
import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
|
|
6
6
|
import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
|
|
7
7
|
import { REFERENTIAL_ACTION_SQL } from "@prisma-next/sql-contract/referential-action-sql";
|
|
8
|
+
import { RelationalSchemaNodeKind } from "@prisma-next/sql-schema-ir/types";
|
|
8
9
|
import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries, int4, int8, jsonb, pgTable, text, textArray, timestamptz } from "@prisma-next/target-postgres/contract-free";
|
|
9
10
|
import { parsePostgresDefault } from "@prisma-next/target-postgres/default-normalizer";
|
|
10
11
|
import { normalizeSchemaNativeType } from "@prisma-next/target-postgres/native-type-normalizer";
|
|
11
12
|
import { parseRlsPolicyWireName } from "@prisma-next/target-postgres/rls-canonicalize";
|
|
12
13
|
import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
|
|
13
|
-
import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
|
|
14
|
+
import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresSchemaNodeKind, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
|
|
14
15
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
15
16
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
16
17
|
import { createAstCodecRegistry, deriveParamMetadata, encodeParamsWithMetadata } from "@prisma-next/sql-runtime";
|
|
@@ -177,6 +178,11 @@ function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
|
|
|
177
178
|
function isRecord(value) {
|
|
178
179
|
return typeof value === "object" && value !== null;
|
|
179
180
|
}
|
|
181
|
+
function unreachableKind(value) {
|
|
182
|
+
const candidate = value;
|
|
183
|
+
if (typeof candidate === "object" && candidate !== null && "kind" in candidate && typeof candidate.kind === "string") return candidate.kind;
|
|
184
|
+
return "unknown";
|
|
185
|
+
}
|
|
180
186
|
/**
|
|
181
187
|
* Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
|
|
182
188
|
*
|
|
@@ -218,7 +224,7 @@ function renderLoweredSql(ast, contract, codecLookup) {
|
|
|
218
224
|
sql = renderRawSql(node, contract, pim);
|
|
219
225
|
break;
|
|
220
226
|
// v8 ignore next 4
|
|
221
|
-
default: throw new Error(`Unsupported AST node kind: ${node
|
|
227
|
+
default: throw new Error(`Unsupported AST node kind: ${unreachableKind(node)}`);
|
|
222
228
|
}
|
|
223
229
|
return Object.freeze({
|
|
224
230
|
sql,
|
|
@@ -358,11 +364,10 @@ function renderSource(source, contract, pim) {
|
|
|
358
364
|
case "derived-table-source": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;
|
|
359
365
|
case "function-source": {
|
|
360
366
|
const args = node.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
|
|
361
|
-
|
|
362
|
-
return node.alias !== void 0 ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
|
|
367
|
+
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(", ")})`}`;
|
|
363
368
|
}
|
|
364
369
|
// v8 ignore next 4
|
|
365
|
-
default: throw new Error(`Unsupported source node kind: ${node
|
|
370
|
+
default: throw new Error(`Unsupported source node kind: ${unreachableKind(node)}`);
|
|
366
371
|
}
|
|
367
372
|
}
|
|
368
373
|
function assertScalarSubquery(query) {
|
|
@@ -394,6 +399,9 @@ function isAtomicExpressionKind(kind) {
|
|
|
394
399
|
case "literal":
|
|
395
400
|
case "aggregate":
|
|
396
401
|
case "window-func":
|
|
402
|
+
case "function-call":
|
|
403
|
+
case "cast":
|
|
404
|
+
case "case":
|
|
397
405
|
case "json-object":
|
|
398
406
|
case "json-array-agg":
|
|
399
407
|
case "list": return true;
|
|
@@ -468,11 +476,26 @@ function renderAggregateExpr(expr, contract, pim) {
|
|
|
468
476
|
function renderWindowFuncExpr(expr, contract, pim) {
|
|
469
477
|
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(" ")})`;
|
|
470
478
|
}
|
|
479
|
+
function renderFunctionCallExpr(expr, contract, pim) {
|
|
480
|
+
const args = expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
|
|
481
|
+
return `${expr.fn}(${args})`;
|
|
482
|
+
}
|
|
483
|
+
function renderCastExpr(expr, contract, pim) {
|
|
484
|
+
return `CAST(${renderExpr(expr.expr, contract, pim)} AS ${expr.targetType})`;
|
|
485
|
+
}
|
|
486
|
+
function renderCaseExpr(expr, contract, pim) {
|
|
487
|
+
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`;
|
|
488
|
+
}
|
|
489
|
+
function renderJsonValueProjection(projection, contract, pim) {
|
|
490
|
+
return projection.accept({
|
|
491
|
+
codec: ({ value }) => renderExpr(value, contract, pim),
|
|
492
|
+
native: ({ value }) => renderExpr(value, contract, pim),
|
|
493
|
+
document: ({ value }) => renderExpr(value, contract, pim)
|
|
494
|
+
});
|
|
495
|
+
}
|
|
471
496
|
function renderJsonObjectExpr(expr, contract, pim) {
|
|
472
497
|
return `json_build_object(${expr.entries.flatMap((entry) => {
|
|
473
|
-
|
|
474
|
-
if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
|
|
475
|
-
return [key, renderExpr(entry.value, contract, pim)];
|
|
498
|
+
return [`'${escapeLiteral(entry.key)}'`, renderJsonValueProjection(entry.value, contract, pim)];
|
|
476
499
|
}).join(", ")})`;
|
|
477
500
|
}
|
|
478
501
|
function renderOrderByItems(items, contract, pim) {
|
|
@@ -480,7 +503,7 @@ function renderOrderByItems(items, contract, pim) {
|
|
|
480
503
|
}
|
|
481
504
|
function renderJsonArrayAggExpr(expr, contract, pim) {
|
|
482
505
|
const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : "";
|
|
483
|
-
const aggregated = `json_agg(${
|
|
506
|
+
const aggregated = `json_agg(${renderJsonValueProjection(expr.expr, contract, pim)}${aggregateOrderBy})`;
|
|
484
507
|
if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, json_build_array())`;
|
|
485
508
|
return aggregated;
|
|
486
509
|
}
|
|
@@ -493,6 +516,9 @@ function renderExpr(expr, contract, pim) {
|
|
|
493
516
|
case "subquery": return renderSubqueryExpr(node, contract, pim);
|
|
494
517
|
case "aggregate": return renderAggregateExpr(node, contract, pim);
|
|
495
518
|
case "window-func": return renderWindowFuncExpr(node, contract, pim);
|
|
519
|
+
case "function-call": return renderFunctionCallExpr(node, contract, pim);
|
|
520
|
+
case "cast": return renderCastExpr(node, contract, pim);
|
|
521
|
+
case "case": return renderCaseExpr(node, contract, pim);
|
|
496
522
|
case "json-object": return renderJsonObjectExpr(node, contract, pim);
|
|
497
523
|
case "json-array-agg": return renderJsonArrayAggExpr(node, contract, pim);
|
|
498
524
|
case "binary": return renderBinary(node, contract, pim);
|
|
@@ -511,7 +537,7 @@ function renderExpr(expr, contract, pim) {
|
|
|
511
537
|
case "list": return renderListLiteral(node, contract, pim);
|
|
512
538
|
case "raw-expr": return renderRawExpr(node, contract, pim);
|
|
513
539
|
// v8 ignore next 4
|
|
514
|
-
default: throw new Error(`Unsupported expression node kind: ${node
|
|
540
|
+
default: throw new Error(`Unsupported expression node kind: ${unreachableKind(node)}`);
|
|
515
541
|
}
|
|
516
542
|
}
|
|
517
543
|
function renderParamRef(ref, pim) {
|
|
@@ -588,7 +614,7 @@ function renderInsertValue(value, contract, pim) {
|
|
|
588
614
|
case "column-ref": return renderColumn(value);
|
|
589
615
|
case "raw-expr": return renderExpr(value, contract, pim);
|
|
590
616
|
// v8 ignore next 4
|
|
591
|
-
default: throw new Error(`Unsupported value node in INSERT: ${value
|
|
617
|
+
default: throw new Error(`Unsupported value node in INSERT: ${unreachableKind(value)}`);
|
|
592
618
|
}
|
|
593
619
|
}
|
|
594
620
|
function renderInsert(ast, contract, pim) {
|
|
@@ -626,7 +652,7 @@ function renderInsert(ast, contract, pim) {
|
|
|
626
652
|
return ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
|
|
627
653
|
}
|
|
628
654
|
// v8 ignore next 4
|
|
629
|
-
default: throw new Error(`Unsupported onConflict action: ${action
|
|
655
|
+
default: throw new Error(`Unsupported onConflict action: ${unreachableKind(action)}`);
|
|
630
656
|
}
|
|
631
657
|
})() : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
|
|
632
658
|
}
|
|
@@ -998,7 +1024,8 @@ var PostgresControlAdapter = class {
|
|
|
998
1024
|
numeric_precision,
|
|
999
1025
|
numeric_scale,
|
|
1000
1026
|
column_default,
|
|
1001
|
-
format_type(a.atttypid, a.atttypmod) AS formatted_type
|
|
1027
|
+
format_type(a.atttypid, a.atttypmod) AS formatted_type,
|
|
1028
|
+
a.attidentity
|
|
1002
1029
|
FROM information_schema.columns c
|
|
1003
1030
|
JOIN pg_catalog.pg_class cl
|
|
1004
1031
|
ON cl.relname = c.table_name
|
|
@@ -1013,64 +1040,74 @@ var PostgresControlAdapter = class {
|
|
|
1013
1040
|
WHERE c.table_schema = $1
|
|
1014
1041
|
ORDER BY c.table_name, c.ordinal_position`, [schema]);
|
|
1015
1042
|
const pkResult = await driver.query(`SELECT
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
FROM
|
|
1021
|
-
JOIN
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
AND
|
|
1027
|
-
|
|
1043
|
+
cl.relname AS table_name,
|
|
1044
|
+
con.conname AS constraint_name,
|
|
1045
|
+
a.attname AS column_name,
|
|
1046
|
+
k.ord AS ordinal_position
|
|
1047
|
+
FROM pg_catalog.pg_constraint con
|
|
1048
|
+
JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
|
|
1049
|
+
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
|
|
1050
|
+
JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
|
|
1051
|
+
JOIN pg_catalog.pg_attribute a
|
|
1052
|
+
ON a.attrelid = con.conrelid
|
|
1053
|
+
AND a.attnum = k.attnum
|
|
1054
|
+
WHERE ns.nspname = $1
|
|
1055
|
+
AND con.contype = 'p'
|
|
1056
|
+
ORDER BY cl.relname, k.ord`, [schema]);
|
|
1028
1057
|
const fkResult = await driver.query(`SELECT
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1058
|
+
cl.relname AS table_name,
|
|
1059
|
+
con.conname AS constraint_name,
|
|
1060
|
+
a.attname AS column_name,
|
|
1061
|
+
k.ord AS ordinal_position,
|
|
1033
1062
|
ref_ns.nspname AS referenced_table_schema,
|
|
1034
1063
|
ref_cl.relname AS referenced_table_name,
|
|
1035
1064
|
ref_att.attname AS referenced_column_name,
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1065
|
+
CASE con.confdeltype
|
|
1066
|
+
WHEN 'a' THEN 'NO ACTION'
|
|
1067
|
+
WHEN 'r' THEN 'RESTRICT'
|
|
1068
|
+
WHEN 'c' THEN 'CASCADE'
|
|
1069
|
+
WHEN 'n' THEN 'SET NULL'
|
|
1070
|
+
WHEN 'd' THEN 'SET DEFAULT'
|
|
1071
|
+
END AS delete_rule,
|
|
1072
|
+
CASE con.confupdtype
|
|
1073
|
+
WHEN 'a' THEN 'NO ACTION'
|
|
1074
|
+
WHEN 'r' THEN 'RESTRICT'
|
|
1075
|
+
WHEN 'c' THEN 'CASCADE'
|
|
1076
|
+
WHEN 'n' THEN 'SET NULL'
|
|
1077
|
+
WHEN 'd' THEN 'SET DEFAULT'
|
|
1078
|
+
END AS update_rule
|
|
1079
|
+
FROM pg_catalog.pg_constraint con
|
|
1080
|
+
JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
|
|
1081
|
+
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
|
|
1082
|
+
JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
|
|
1083
|
+
JOIN pg_catalog.pg_attribute a
|
|
1084
|
+
ON a.attrelid = con.conrelid
|
|
1085
|
+
AND a.attnum = k.attnum
|
|
1048
1086
|
JOIN pg_catalog.pg_class ref_cl
|
|
1049
|
-
ON ref_cl.oid =
|
|
1087
|
+
ON ref_cl.oid = con.confrelid
|
|
1050
1088
|
JOIN pg_catalog.pg_namespace ref_ns
|
|
1051
1089
|
ON ref_ns.oid = ref_cl.relnamespace
|
|
1052
1090
|
JOIN pg_catalog.pg_attribute ref_att
|
|
1053
|
-
ON ref_att.attrelid =
|
|
1054
|
-
AND ref_att.attnum =
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
WHERE tc.table_schema = $1
|
|
1059
|
-
AND tc.constraint_type = 'FOREIGN KEY'
|
|
1060
|
-
ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position`, [schema]);
|
|
1091
|
+
ON ref_att.attrelid = con.confrelid
|
|
1092
|
+
AND ref_att.attnum = con.confkey[k.ord]
|
|
1093
|
+
WHERE ns.nspname = $1
|
|
1094
|
+
AND con.contype = 'f'
|
|
1095
|
+
ORDER BY cl.relname, con.conname, k.ord`, [schema]);
|
|
1061
1096
|
const uniqueResult = await driver.query(`SELECT
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
FROM
|
|
1067
|
-
JOIN
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
AND
|
|
1073
|
-
|
|
1097
|
+
cl.relname AS table_name,
|
|
1098
|
+
con.conname AS constraint_name,
|
|
1099
|
+
a.attname AS column_name,
|
|
1100
|
+
k.ord AS ordinal_position
|
|
1101
|
+
FROM pg_catalog.pg_constraint con
|
|
1102
|
+
JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
|
|
1103
|
+
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
|
|
1104
|
+
JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
|
|
1105
|
+
JOIN pg_catalog.pg_attribute a
|
|
1106
|
+
ON a.attrelid = con.conrelid
|
|
1107
|
+
AND a.attnum = k.attnum
|
|
1108
|
+
WHERE ns.nspname = $1
|
|
1109
|
+
AND con.contype = 'u'
|
|
1110
|
+
ORDER BY cl.relname, con.conname, k.ord`, [schema]);
|
|
1074
1111
|
const indexResult = await driver.query(`SELECT
|
|
1075
1112
|
i.tablename,
|
|
1076
1113
|
i.indexname,
|
|
@@ -1091,10 +1128,9 @@ var PostgresControlAdapter = class {
|
|
|
1091
1128
|
WHERE i.schemaname = $1
|
|
1092
1129
|
AND NOT EXISTS (
|
|
1093
1130
|
SELECT 1
|
|
1094
|
-
FROM
|
|
1095
|
-
WHERE
|
|
1096
|
-
AND
|
|
1097
|
-
AND tc.constraint_name = i.indexname
|
|
1131
|
+
FROM pg_catalog.pg_constraint con
|
|
1132
|
+
WHERE con.conindid = ic.oid
|
|
1133
|
+
AND con.contype IN ('p', 'u', 'x')
|
|
1098
1134
|
)
|
|
1099
1135
|
ORDER BY i.tablename, i.indexname, k.ord`, [schema]);
|
|
1100
1136
|
const checkResult = await driver.query(`SELECT
|
|
@@ -1140,6 +1176,10 @@ var PostgresControlAdapter = class {
|
|
|
1140
1176
|
if (many) nativeType = normalizeSchemaNativeType(nativeType.slice(0, -2));
|
|
1141
1177
|
const resolvedNativeType = `${normalizeSchemaNativeType(nativeType)}${many ? "[]" : ""}`;
|
|
1142
1178
|
const rawDefault = colRow.column_default ?? void 0;
|
|
1179
|
+
const resolvedDefault = colRow.attidentity === "a" || colRow.attidentity === "d" ? {
|
|
1180
|
+
kind: "function",
|
|
1181
|
+
expression: "autoincrement()"
|
|
1182
|
+
} : rawDefault !== void 0 ? parsePostgresDefault(rawDefault, resolvedNativeType) : void 0;
|
|
1143
1183
|
columns[colRow.column_name] = {
|
|
1144
1184
|
name: colRow.column_name,
|
|
1145
1185
|
nativeType,
|
|
@@ -1147,14 +1187,15 @@ var PostgresControlAdapter = class {
|
|
|
1147
1187
|
...ifDefined("default", rawDefault),
|
|
1148
1188
|
...ifDefined("many", many),
|
|
1149
1189
|
resolvedNativeType,
|
|
1150
|
-
...ifDefined("resolvedDefault",
|
|
1190
|
+
...ifDefined("resolvedDefault", resolvedDefault)
|
|
1151
1191
|
};
|
|
1152
1192
|
}
|
|
1153
1193
|
const pkRows = [...pksByTable.get(tableName) ?? []];
|
|
1154
1194
|
const primaryKeyColumns = pkRows.sort((a, b) => a.ordinal_position - b.ordinal_position).map((row) => row.column_name);
|
|
1155
1195
|
const primaryKey = primaryKeyColumns.length > 0 ? {
|
|
1156
1196
|
columns: primaryKeyColumns,
|
|
1157
|
-
...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {}
|
|
1197
|
+
...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {},
|
|
1198
|
+
dependsOn: postgresColumnDependsOn(schema, tableName, primaryKeyColumns)
|
|
1158
1199
|
} : void 0;
|
|
1159
1200
|
const foreignKeysMap = /* @__PURE__ */ new Map();
|
|
1160
1201
|
for (const fkRow of fksByTable.get(tableName) ?? []) {
|
|
@@ -1179,7 +1220,8 @@ var PostgresControlAdapter = class {
|
|
|
1179
1220
|
referencedColumns: Object.freeze([...fk.referencedColumns]),
|
|
1180
1221
|
name: fk.name,
|
|
1181
1222
|
...ifDefined("onDelete", mapReferentialAction(fk.deleteRule)),
|
|
1182
|
-
...ifDefined("onUpdate", mapReferentialAction(fk.updateRule))
|
|
1223
|
+
...ifDefined("onUpdate", mapReferentialAction(fk.updateRule)),
|
|
1224
|
+
dependsOn: [postgresTableDependsOn(fk.referencedSchema, fk.referencedTable), ...postgresColumnDependsOn(schema, tableName, fk.columns)]
|
|
1183
1225
|
}));
|
|
1184
1226
|
const pkConstraints = pkConstraintsByTable.get(tableName) ?? /* @__PURE__ */ new Set();
|
|
1185
1227
|
const uniquesMap = /* @__PURE__ */ new Map();
|
|
@@ -1194,7 +1236,8 @@ var PostgresControlAdapter = class {
|
|
|
1194
1236
|
}
|
|
1195
1237
|
const uniques = Array.from(uniquesMap.values()).map((uq) => ({
|
|
1196
1238
|
columns: Object.freeze([...uq.columns]),
|
|
1197
|
-
name: uq.name
|
|
1239
|
+
name: uq.name,
|
|
1240
|
+
dependsOn: postgresColumnDependsOn(schema, tableName, uq.columns)
|
|
1198
1241
|
}));
|
|
1199
1242
|
const indexesMap = /* @__PURE__ */ new Map();
|
|
1200
1243
|
const indexNamesWithExpressionKey = /* @__PURE__ */ new Set();
|
|
@@ -1229,7 +1272,8 @@ var PostgresControlAdapter = class {
|
|
|
1229
1272
|
name: idx.name,
|
|
1230
1273
|
unique: idx.unique,
|
|
1231
1274
|
...idx.type !== void 0 && { type: idx.type },
|
|
1232
|
-
...idx.options !== void 0 && { options: idx.options }
|
|
1275
|
+
...idx.options !== void 0 && { options: idx.options },
|
|
1276
|
+
dependsOn: postgresColumnDependsOn(schema, tableName, idx.columns)
|
|
1233
1277
|
}));
|
|
1234
1278
|
const checksForTable = [];
|
|
1235
1279
|
for (const checkRow of checksByTable.get(tableName) ?? []) {
|
|
@@ -1281,7 +1325,8 @@ var PostgresControlAdapter = class {
|
|
|
1281
1325
|
roles: policyRoles,
|
|
1282
1326
|
...row.qual !== null ? { using: row.qual } : {},
|
|
1283
1327
|
...row.with_check !== null ? { withCheck: row.with_check } : {},
|
|
1284
|
-
permissive
|
|
1328
|
+
permissive,
|
|
1329
|
+
dependsOn: [postgresTableDependsOn(row.schemaname, row.tablename), ...policyRoles.map(postgresRoleDependsOn)]
|
|
1285
1330
|
});
|
|
1286
1331
|
const list = policiesByTable.get(row.tablename) ?? [];
|
|
1287
1332
|
list.push(policy);
|
|
@@ -1447,6 +1492,49 @@ function mapReferentialAction(rule) {
|
|
|
1447
1492
|
return mapped;
|
|
1448
1493
|
}
|
|
1449
1494
|
/**
|
|
1495
|
+
* A FK/policy dependency chain, mirroring the shape the expected-side
|
|
1496
|
+
* derivation stamps (`contractToPostgresDatabaseSchemaNode`): the database
|
|
1497
|
+
* root's fixed sentinel id, then the namespace, then the table.
|
|
1498
|
+
*/
|
|
1499
|
+
function postgresTableDependsOn(namespaceId, tableName) {
|
|
1500
|
+
return [
|
|
1501
|
+
{
|
|
1502
|
+
nodeKind: PostgresSchemaNodeKind.database,
|
|
1503
|
+
id: "database"
|
|
1504
|
+
},
|
|
1505
|
+
{
|
|
1506
|
+
nodeKind: PostgresSchemaNodeKind.namespace,
|
|
1507
|
+
id: namespaceId
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
nodeKind: PostgresSchemaNodeKind.table,
|
|
1511
|
+
id: tableName
|
|
1512
|
+
}
|
|
1513
|
+
];
|
|
1514
|
+
}
|
|
1515
|
+
/** A policy's dependency chain onto one of the roles it grants to. */
|
|
1516
|
+
function postgresRoleDependsOn(role) {
|
|
1517
|
+
return [{
|
|
1518
|
+
nodeKind: PostgresSchemaNodeKind.database,
|
|
1519
|
+
id: "database"
|
|
1520
|
+
}, {
|
|
1521
|
+
nodeKind: PostgresSchemaNodeKind.role,
|
|
1522
|
+
id: role
|
|
1523
|
+
}];
|
|
1524
|
+
}
|
|
1525
|
+
/**
|
|
1526
|
+
* The chains from a table-child object (foreign key, index, unique, primary
|
|
1527
|
+
* key) to each of the own columns it is built on — the introspection-side
|
|
1528
|
+
* mirror of `contractToPostgresDatabaseSchemaNode`'s `columnDependsOn`. An
|
|
1529
|
+
* object is dropped before the columns it covers.
|
|
1530
|
+
*/
|
|
1531
|
+
function postgresColumnDependsOn(namespaceId, tableName, columns) {
|
|
1532
|
+
return columns.map((column) => [...postgresTableDependsOn(namespaceId, tableName), {
|
|
1533
|
+
nodeKind: RelationalSchemaNodeKind.column,
|
|
1534
|
+
id: `column:${column}`
|
|
1535
|
+
}]);
|
|
1536
|
+
}
|
|
1537
|
+
/**
|
|
1450
1538
|
* Groups an array of objects by a specified key.
|
|
1451
1539
|
* Returns a Map for O(1) lookup by group key.
|
|
1452
1540
|
*/
|
|
@@ -1727,4 +1815,4 @@ async function pgRenderDdlExecuteRequest(ast, codecLookup) {
|
|
|
1727
1815
|
//#endregion
|
|
1728
1816
|
export { renderLoweredSql as n, createPostgresBuiltinCodecLookup as r, PostgresControlAdapter as t };
|
|
1729
1817
|
|
|
1730
|
-
//# sourceMappingURL=control-adapter-
|
|
1818
|
+
//# sourceMappingURL=control-adapter-XtIRYsO-.mjs.map
|