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

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-w2BFxQ--.mjs";
1
+ import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-B6IM_oTR.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-CssyjkaR.mjs.map
66
+ //# sourceMappingURL=adapter-BaZsfXGA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-CssyjkaR.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-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,8 +1,7 @@
1
- import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-DkGeLfUp.mjs";
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";
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAoCM,mBAAA,YACO,OAAA,CAAQ,WAAA,EAAa,gBAAA,EAAkB,wBAAA;EAAA,SAGzC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;EAAA,iBACD,WAAA;cAEL,OAAA,GAAU,sBAAA;EA0BtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,eAAA,EACnB,OAAA,EAAS,cAAA,CAAe,gBAAA,IACvB,wBAAA;AAAA;;cAWQ,uBAAA,EAAyB,eAkBrC;AAAA,iBAEe,qBAAA,CAAsB,OAAA,GAAU,sBAAA,GAAsB,QAAA,CAAA,mBAAA"}
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-CssyjkaR.mjs";
1
+ import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-BaZsfXGA.mjs";
2
2
  export { createPostgresAdapter, postgresRawCodecInferer };
@@ -1,5 +1,4 @@
1
1
  import { ColumnTypeDescriptor } from "@prisma-next/framework-components/codec";
2
-
3
2
  //#region src/exports/column-types.d.ts
4
3
  declare const textColumn: {
5
4
  readonly codecId: "pg/text@1";
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"mappings":";;;cA8Ba,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,UAAA,CAAW,MAAA,WAAiB,oBAAoB;EAAA,SACrD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,iBASlB,aAAA,CAAc,MAAA,WAAiB,oBAAoB;EAAA,SACxD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,cASrB,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,YAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,YAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,aAAA,CACd,SAAA,UACA,KAAA,YACC,oBAAoB;EAAA,SACZ,UAAA;IAAA,SAAuB,SAAA;IAAA,SAA4B,KAAA;EAAA;AAAA;AAAA,cASjD,eAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,iBAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,UAAA,CAAW,SAAA,YAAqB,oBAAoB;EAAA,SACzD,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;AAAA,iBASnB,YAAA,CAAa,SAAA,YAAqB,oBAAoB;EAAA,SAC3D,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;AAAA,cAStB,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,SAAA,CAAU,MAAA,WAAiB,oBAAoB;EAAA,SACpD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,iBASlB,YAAA,CAAa,MAAA,WAAiB,oBAAoB;EAAA,SACvD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;;;;;;cAcrB,WAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,cAAA,CAAe,SAAA,YAAqB,oBAAoB;EAAA,SAC7D,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;;;AA7CS;AAS5C;;cAkDa,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;;;;cAK5B,WAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA"}
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";
@@ -998,7 +999,8 @@ var PostgresControlAdapter = class {
998
999
  numeric_precision,
999
1000
  numeric_scale,
1000
1001
  column_default,
1001
- format_type(a.atttypid, a.atttypmod) AS formatted_type
1002
+ format_type(a.atttypid, a.atttypmod) AS formatted_type,
1003
+ a.attidentity
1002
1004
  FROM information_schema.columns c
1003
1005
  JOIN pg_catalog.pg_class cl
1004
1006
  ON cl.relname = c.table_name
@@ -1013,64 +1015,74 @@ var PostgresControlAdapter = class {
1013
1015
  WHERE c.table_schema = $1
1014
1016
  ORDER BY c.table_name, c.ordinal_position`, [schema]);
1015
1017
  const pkResult = await driver.query(`SELECT
1016
- tc.table_name,
1017
- tc.constraint_name,
1018
- kcu.column_name,
1019
- kcu.ordinal_position
1020
- FROM information_schema.table_constraints tc
1021
- JOIN information_schema.key_column_usage kcu
1022
- ON tc.constraint_name = kcu.constraint_name
1023
- AND tc.table_schema = kcu.table_schema
1024
- AND tc.table_name = kcu.table_name
1025
- WHERE tc.table_schema = $1
1026
- AND tc.constraint_type = 'PRIMARY KEY'
1027
- ORDER BY tc.table_name, kcu.ordinal_position`, [schema]);
1018
+ cl.relname AS table_name,
1019
+ con.conname AS constraint_name,
1020
+ a.attname AS column_name,
1021
+ k.ord AS ordinal_position
1022
+ FROM pg_catalog.pg_constraint con
1023
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1024
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1025
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1026
+ JOIN pg_catalog.pg_attribute a
1027
+ ON a.attrelid = con.conrelid
1028
+ AND a.attnum = k.attnum
1029
+ WHERE ns.nspname = $1
1030
+ AND con.contype = 'p'
1031
+ ORDER BY cl.relname, k.ord`, [schema]);
1028
1032
  const fkResult = await driver.query(`SELECT
1029
- tc.table_name,
1030
- tc.constraint_name,
1031
- kcu.column_name,
1032
- kcu.ordinal_position,
1033
+ cl.relname AS table_name,
1034
+ con.conname AS constraint_name,
1035
+ a.attname AS column_name,
1036
+ k.ord AS ordinal_position,
1033
1037
  ref_ns.nspname AS referenced_table_schema,
1034
1038
  ref_cl.relname AS referenced_table_name,
1035
1039
  ref_att.attname AS referenced_column_name,
1036
- rc.delete_rule,
1037
- rc.update_rule
1038
- FROM information_schema.table_constraints tc
1039
- JOIN information_schema.key_column_usage kcu
1040
- ON tc.constraint_name = kcu.constraint_name
1041
- AND tc.table_schema = kcu.table_schema
1042
- AND tc.table_name = kcu.table_name
1043
- JOIN pg_catalog.pg_constraint pgc
1044
- ON pgc.conname = tc.constraint_name
1045
- AND pgc.connamespace = (
1046
- SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = tc.table_schema
1047
- )
1040
+ CASE con.confdeltype
1041
+ WHEN 'a' THEN 'NO ACTION'
1042
+ WHEN 'r' THEN 'RESTRICT'
1043
+ WHEN 'c' THEN 'CASCADE'
1044
+ WHEN 'n' THEN 'SET NULL'
1045
+ WHEN 'd' THEN 'SET DEFAULT'
1046
+ END AS delete_rule,
1047
+ CASE con.confupdtype
1048
+ WHEN 'a' THEN 'NO ACTION'
1049
+ WHEN 'r' THEN 'RESTRICT'
1050
+ WHEN 'c' THEN 'CASCADE'
1051
+ WHEN 'n' THEN 'SET NULL'
1052
+ WHEN 'd' THEN 'SET DEFAULT'
1053
+ END AS update_rule
1054
+ FROM pg_catalog.pg_constraint con
1055
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1056
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1057
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1058
+ JOIN pg_catalog.pg_attribute a
1059
+ ON a.attrelid = con.conrelid
1060
+ AND a.attnum = k.attnum
1048
1061
  JOIN pg_catalog.pg_class ref_cl
1049
- ON ref_cl.oid = pgc.confrelid
1062
+ ON ref_cl.oid = con.confrelid
1050
1063
  JOIN pg_catalog.pg_namespace ref_ns
1051
1064
  ON ref_ns.oid = ref_cl.relnamespace
1052
1065
  JOIN pg_catalog.pg_attribute ref_att
1053
- ON ref_att.attrelid = pgc.confrelid
1054
- AND ref_att.attnum = pgc.confkey[kcu.ordinal_position]
1055
- JOIN information_schema.referential_constraints rc
1056
- ON rc.constraint_name = tc.constraint_name
1057
- AND rc.constraint_schema = tc.table_schema
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]);
1066
+ ON ref_att.attrelid = con.confrelid
1067
+ AND ref_att.attnum = con.confkey[k.ord]
1068
+ WHERE ns.nspname = $1
1069
+ AND con.contype = 'f'
1070
+ ORDER BY cl.relname, con.conname, k.ord`, [schema]);
1061
1071
  const uniqueResult = await driver.query(`SELECT
1062
- tc.table_name,
1063
- tc.constraint_name,
1064
- kcu.column_name,
1065
- kcu.ordinal_position
1066
- FROM information_schema.table_constraints tc
1067
- JOIN information_schema.key_column_usage kcu
1068
- ON tc.constraint_name = kcu.constraint_name
1069
- AND tc.table_schema = kcu.table_schema
1070
- AND tc.table_name = kcu.table_name
1071
- WHERE tc.table_schema = $1
1072
- AND tc.constraint_type = 'UNIQUE'
1073
- ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position`, [schema]);
1072
+ cl.relname AS table_name,
1073
+ con.conname AS constraint_name,
1074
+ a.attname AS column_name,
1075
+ k.ord AS ordinal_position
1076
+ FROM pg_catalog.pg_constraint con
1077
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1078
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1079
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1080
+ JOIN pg_catalog.pg_attribute a
1081
+ ON a.attrelid = con.conrelid
1082
+ AND a.attnum = k.attnum
1083
+ WHERE ns.nspname = $1
1084
+ AND con.contype = 'u'
1085
+ ORDER BY cl.relname, con.conname, k.ord`, [schema]);
1074
1086
  const indexResult = await driver.query(`SELECT
1075
1087
  i.tablename,
1076
1088
  i.indexname,
@@ -1091,10 +1103,9 @@ var PostgresControlAdapter = class {
1091
1103
  WHERE i.schemaname = $1
1092
1104
  AND NOT EXISTS (
1093
1105
  SELECT 1
1094
- FROM information_schema.table_constraints tc
1095
- WHERE tc.table_schema = $1
1096
- AND tc.table_name = i.tablename
1097
- AND tc.constraint_name = i.indexname
1106
+ FROM pg_catalog.pg_constraint con
1107
+ WHERE con.conindid = ic.oid
1108
+ AND con.contype IN ('p', 'u', 'x')
1098
1109
  )
1099
1110
  ORDER BY i.tablename, i.indexname, k.ord`, [schema]);
1100
1111
  const checkResult = await driver.query(`SELECT
@@ -1140,6 +1151,10 @@ var PostgresControlAdapter = class {
1140
1151
  if (many) nativeType = normalizeSchemaNativeType(nativeType.slice(0, -2));
1141
1152
  const resolvedNativeType = `${normalizeSchemaNativeType(nativeType)}${many ? "[]" : ""}`;
1142
1153
  const rawDefault = colRow.column_default ?? void 0;
1154
+ const resolvedDefault = colRow.attidentity === "a" || colRow.attidentity === "d" ? {
1155
+ kind: "function",
1156
+ expression: "autoincrement()"
1157
+ } : rawDefault !== void 0 ? parsePostgresDefault(rawDefault, resolvedNativeType) : void 0;
1143
1158
  columns[colRow.column_name] = {
1144
1159
  name: colRow.column_name,
1145
1160
  nativeType,
@@ -1147,14 +1162,15 @@ var PostgresControlAdapter = class {
1147
1162
  ...ifDefined("default", rawDefault),
1148
1163
  ...ifDefined("many", many),
1149
1164
  resolvedNativeType,
1150
- ...ifDefined("resolvedDefault", rawDefault !== void 0 ? parsePostgresDefault(rawDefault, resolvedNativeType) : void 0)
1165
+ ...ifDefined("resolvedDefault", resolvedDefault)
1151
1166
  };
1152
1167
  }
1153
1168
  const pkRows = [...pksByTable.get(tableName) ?? []];
1154
1169
  const primaryKeyColumns = pkRows.sort((a, b) => a.ordinal_position - b.ordinal_position).map((row) => row.column_name);
1155
1170
  const primaryKey = primaryKeyColumns.length > 0 ? {
1156
1171
  columns: primaryKeyColumns,
1157
- ...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {}
1172
+ ...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {},
1173
+ dependsOn: postgresColumnDependsOn(schema, tableName, primaryKeyColumns)
1158
1174
  } : void 0;
1159
1175
  const foreignKeysMap = /* @__PURE__ */ new Map();
1160
1176
  for (const fkRow of fksByTable.get(tableName) ?? []) {
@@ -1179,7 +1195,8 @@ var PostgresControlAdapter = class {
1179
1195
  referencedColumns: Object.freeze([...fk.referencedColumns]),
1180
1196
  name: fk.name,
1181
1197
  ...ifDefined("onDelete", mapReferentialAction(fk.deleteRule)),
1182
- ...ifDefined("onUpdate", mapReferentialAction(fk.updateRule))
1198
+ ...ifDefined("onUpdate", mapReferentialAction(fk.updateRule)),
1199
+ dependsOn: [postgresTableDependsOn(fk.referencedSchema, fk.referencedTable), ...postgresColumnDependsOn(schema, tableName, fk.columns)]
1183
1200
  }));
1184
1201
  const pkConstraints = pkConstraintsByTable.get(tableName) ?? /* @__PURE__ */ new Set();
1185
1202
  const uniquesMap = /* @__PURE__ */ new Map();
@@ -1194,7 +1211,8 @@ var PostgresControlAdapter = class {
1194
1211
  }
1195
1212
  const uniques = Array.from(uniquesMap.values()).map((uq) => ({
1196
1213
  columns: Object.freeze([...uq.columns]),
1197
- name: uq.name
1214
+ name: uq.name,
1215
+ dependsOn: postgresColumnDependsOn(schema, tableName, uq.columns)
1198
1216
  }));
1199
1217
  const indexesMap = /* @__PURE__ */ new Map();
1200
1218
  const indexNamesWithExpressionKey = /* @__PURE__ */ new Set();
@@ -1229,7 +1247,8 @@ var PostgresControlAdapter = class {
1229
1247
  name: idx.name,
1230
1248
  unique: idx.unique,
1231
1249
  ...idx.type !== void 0 && { type: idx.type },
1232
- ...idx.options !== void 0 && { options: idx.options }
1250
+ ...idx.options !== void 0 && { options: idx.options },
1251
+ dependsOn: postgresColumnDependsOn(schema, tableName, idx.columns)
1233
1252
  }));
1234
1253
  const checksForTable = [];
1235
1254
  for (const checkRow of checksByTable.get(tableName) ?? []) {
@@ -1281,7 +1300,8 @@ var PostgresControlAdapter = class {
1281
1300
  roles: policyRoles,
1282
1301
  ...row.qual !== null ? { using: row.qual } : {},
1283
1302
  ...row.with_check !== null ? { withCheck: row.with_check } : {},
1284
- permissive
1303
+ permissive,
1304
+ dependsOn: [postgresTableDependsOn(row.schemaname, row.tablename), ...policyRoles.map(postgresRoleDependsOn)]
1285
1305
  });
1286
1306
  const list = policiesByTable.get(row.tablename) ?? [];
1287
1307
  list.push(policy);
@@ -1447,6 +1467,49 @@ function mapReferentialAction(rule) {
1447
1467
  return mapped;
1448
1468
  }
1449
1469
  /**
1470
+ * A FK/policy dependency chain, mirroring the shape the expected-side
1471
+ * derivation stamps (`contractToPostgresDatabaseSchemaNode`): the database
1472
+ * root's fixed sentinel id, then the namespace, then the table.
1473
+ */
1474
+ function postgresTableDependsOn(namespaceId, tableName) {
1475
+ return [
1476
+ {
1477
+ nodeKind: PostgresSchemaNodeKind.database,
1478
+ id: "database"
1479
+ },
1480
+ {
1481
+ nodeKind: PostgresSchemaNodeKind.namespace,
1482
+ id: namespaceId
1483
+ },
1484
+ {
1485
+ nodeKind: PostgresSchemaNodeKind.table,
1486
+ id: tableName
1487
+ }
1488
+ ];
1489
+ }
1490
+ /** A policy's dependency chain onto one of the roles it grants to. */
1491
+ function postgresRoleDependsOn(role) {
1492
+ return [{
1493
+ nodeKind: PostgresSchemaNodeKind.database,
1494
+ id: "database"
1495
+ }, {
1496
+ nodeKind: PostgresSchemaNodeKind.role,
1497
+ id: role
1498
+ }];
1499
+ }
1500
+ /**
1501
+ * The chains from a table-child object (foreign key, index, unique, primary
1502
+ * key) to each of the own columns it is built on — the introspection-side
1503
+ * mirror of `contractToPostgresDatabaseSchemaNode`'s `columnDependsOn`. An
1504
+ * object is dropped before the columns it covers.
1505
+ */
1506
+ function postgresColumnDependsOn(namespaceId, tableName, columns) {
1507
+ return columns.map((column) => [...postgresTableDependsOn(namespaceId, tableName), {
1508
+ nodeKind: RelationalSchemaNodeKind.column,
1509
+ id: `column:${column}`
1510
+ }]);
1511
+ }
1512
+ /**
1450
1513
  * Groups an array of objects by a specified key.
1451
1514
  * Returns a Map for O(1) lookup by group key.
1452
1515
  */
@@ -1727,4 +1790,4 @@ async function pgRenderDdlExecuteRequest(ast, codecLookup) {
1727
1790
  //#endregion
1728
1791
  export { renderLoweredSql as n, createPostgresBuiltinCodecLookup as r, PostgresControlAdapter as t };
1729
1792
 
1730
- //# sourceMappingURL=control-adapter-w2BFxQ--.mjs.map
1793
+ //# sourceMappingURL=control-adapter-B6IM_oTR.mjs.map