qubu 0.6.1 → 0.6.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.
Files changed (84) hide show
  1. package/dist/{complete-DP7pliuY.mjs → canonical-B5_ouh-c.mjs} +466 -241
  2. package/dist/codegen.d.mts +2 -2
  3. package/dist/codegen.mjs +180 -90
  4. package/dist/column-Cyc2CMnG.mjs +116 -0
  5. package/dist/column-DDRvD7SF.mjs +721 -0
  6. package/dist/{constraints-DM_tarXc.mjs → constraints-CAmi18Uk.mjs} +8 -3
  7. package/dist/core.d.mts +3 -3
  8. package/dist/core.mjs +4 -4
  9. package/dist/diff.d.mts +9 -9
  10. package/dist/diff.mjs +152 -102
  11. package/dist/{explain-CkIK13L_.mjs → explain-BIqEmZha.mjs} +1 -1
  12. package/dist/{expressions-BCjc08zw.mjs → expressions-_6JF_J77.mjs} +2 -1
  13. package/dist/index-CaxrMD1A.d.mts +1 -0
  14. package/dist/index.d.mts +2 -2
  15. package/dist/index.mjs +368 -74
  16. package/dist/introspection/mysql.d.mts +1 -1
  17. package/dist/introspection/mysql.mjs +156 -23
  18. package/dist/introspection/postgres.d.mts +6 -3
  19. package/dist/introspection/postgres.mjs +388 -53
  20. package/dist/introspection/sqlite.d.mts +1 -1
  21. package/dist/introspection/sqlite.mjs +198 -12
  22. package/dist/introspection.d.mts +26 -12
  23. package/dist/introspection.mjs +2 -672
  24. package/dist/mysql.d.mts +3 -3
  25. package/dist/mysql.mjs +6 -5
  26. package/dist/{errors-Dxv73YJu.mjs → omit-VEr9Ydux.mjs} +5 -1
  27. package/dist/{on-conflict-CnaY5qso.mjs → on-conflict-B2rFyHGF.mjs} +6 -8
  28. package/dist/on-duplicate-key-update-Czsw1Yq-.mjs +95 -0
  29. package/dist/{postgres-Dey7QXPL.mjs → postgres-hFhd0I9n.mjs} +4 -5
  30. package/dist/postgres.d.mts +2 -2
  31. package/dist/postgres.mjs +2 -2
  32. package/dist/{registry-oWDiqD7i.mjs → registry-BXE_4M9P.mjs} +1 -1
  33. package/dist/{relational-DSAJ-l58.mjs → relational-CoPBETjI.mjs} +3 -2
  34. package/dist/schema.d.mts +2 -2
  35. package/dist/schema.mjs +8 -8
  36. package/dist/{serialize-CE-gw5_s.mjs → serialize-CyobNEx-.mjs} +174 -30
  37. package/dist/serialize-Du2UPZMt.d.mts +92 -0
  38. package/dist/snapshot/mysql.d.mts +5 -5
  39. package/dist/snapshot/mysql.mjs +8 -8
  40. package/dist/snapshot/postgres.d.mts +3 -3
  41. package/dist/snapshot/postgres.mjs +9 -9
  42. package/dist/snapshot/sqlite.d.mts +3 -3
  43. package/dist/snapshot/sqlite.mjs +7 -7
  44. package/dist/snapshot-mIb-Zzb5.mjs +1489 -0
  45. package/dist/snapshot.d.mts +4 -5
  46. package/dist/snapshot.mjs +3 -4
  47. package/dist/{source-BDuUXmAk.mjs → source-DYSUqzvb.mjs} +2 -2
  48. package/dist/sqlite.d.mts +2 -2
  49. package/dist/sqlite.mjs +6 -6
  50. package/dist/{table-C1QGNe4P.mjs → table-B8zEq0az.mjs} +4 -4
  51. package/dist/{types-BLNRatG_.mjs → types-CYHpSPwj.mjs} +10 -5
  52. package/dist/{types-BEn0N_al.d.mts → types-CiMvKi5V.d.mts} +14 -4
  53. package/dist/{types-DUe6eeI0.d.mts → types-Dqr4o2I1.d.mts} +590 -168
  54. package/dist/value-CpaUFtjw.mjs +45 -0
  55. package/dist/vite/ambient.d.ts +2 -0
  56. package/dist/vite.d.mts +1 -1
  57. package/dist/vite.mjs +2 -0
  58. package/docs/dialects-and-execution.md +61 -11
  59. package/docs/getting-started.md +1 -1
  60. package/docs/guides/extensions/typed-expressions.md +5 -3
  61. package/docs/guides/json.md +95 -2
  62. package/docs/guides/mutations.md +36 -0
  63. package/docs/index.md +1 -1
  64. package/docs/migrations/adapters.md +58 -21
  65. package/docs/migrations/recovery.md +7 -1
  66. package/docs/query-model/fragments.md +21 -1
  67. package/docs/reference/introspection-support.md +16 -18
  68. package/docs/reference/supported-surface.md +8 -7
  69. package/docs/schema/catalog-model.md +20 -7
  70. package/docs/schema/code-generation.md +1 -1
  71. package/docs/schema/diff.md +2 -2
  72. package/docs/schema/introspection.md +21 -14
  73. package/docs/schema/snapshots.md +18 -8
  74. package/docs/schema/storage-and-schema-sql.md +7 -2
  75. package/package.json +2 -1
  76. package/dist/canonical-DMvR9yBe.mjs +0 -972
  77. package/dist/column-BzN8KFJa.mjs +0 -364
  78. package/dist/column-CFvSbil0.mjs +0 -309
  79. package/dist/complete-types-CNMWBWap.d.mts +0 -371
  80. package/dist/index-CGui70hi.d.mts +0 -32
  81. package/dist/json-Db7XRD91.mjs +0 -169
  82. package/dist/omit-OxV58AwX.mjs +0 -5
  83. package/dist/serialize-OvXCLzjm.d.mts +0 -66
  84. package/dist/snapshot-DgsOhf_8.mjs +0 -354
@@ -313,7 +313,11 @@ async function readCatalog(connection, options) {
313
313
  const columnComment = text(columnRows.find((row) => text(row.table_name) === currentTable.physicalName && text(row.column_name) === currentColumn.physicalName)?.column_comment);
314
314
  if (columnComment !== void 0 && columnComment !== "") comments.push(objectComment({
315
315
  kind: "column",
316
- id: currentColumn.id
316
+ id: currentColumn.id,
317
+ owner: {
318
+ kind: "table",
319
+ id: currentTable.id
320
+ }
317
321
  }, columnComment, currentColumn.reference, options.namespace));
318
322
  }
319
323
  }
@@ -327,7 +331,11 @@ async function readCatalog(connection, options) {
327
331
  const columnComment = text(columnRows.find((row) => text(row.table_name) === view.physicalName && text(row.column_name) === currentColumn.physicalName)?.column_comment);
328
332
  if (columnComment !== void 0 && columnComment !== "") comments.push(objectComment({
329
333
  kind: "column",
330
- id: currentColumn.id
334
+ id: currentColumn.id,
335
+ owner: {
336
+ kind: view.kind,
337
+ id: view.id
338
+ }
331
339
  }, columnComment, currentColumn.reference, options.namespace));
332
340
  }
333
341
  }
@@ -517,8 +525,7 @@ function column(row, table, namespace) {
517
525
  }
518
526
  } : void 0;
519
527
  const onUpdateMatch = extra.match(/on update\s+(.+)$/i);
520
- const defaultText = text(row.column_default);
521
- const defaultValue = literal(defaultText, text(row.data_type));
528
+ const defaultValue = mysqlDefault(text(row.column_default), text(row.data_type), namespace, table, physicalName);
522
529
  return {
523
530
  kind: "column",
524
531
  id: stableId(physicalName),
@@ -527,13 +534,7 @@ function column(row, table, namespace) {
527
534
  ordinalPosition: number(row.ordinal_position) ?? 0,
528
535
  nullable: text(row.is_nullable)?.toUpperCase() !== "NO",
529
536
  storage: { nativeType: text(row.column_type) ?? "unknown" },
530
- default: defaultValue !== void 0 ? {
531
- kind: "literal",
532
- value: defaultValue
533
- } : defaultText !== void 0 ? {
534
- kind: "expression",
535
- expression: sql(defaultText, namespace, table, physicalName)
536
- } : void 0,
537
+ default: defaultValue,
537
538
  generated,
538
539
  identity,
539
540
  onUpdate: onUpdateMatch?.[1] ? sql(onUpdateMatch[1], namespace, table, physicalName) : void 0,
@@ -907,8 +908,29 @@ function partitionObject(row, tables, namespace, diagnostics) {
907
908
  ],
908
909
  physicalReference
909
910
  }));
910
- const boundText = text(row.partition_description) ?? text(row.subpartition_expression) ?? text(row.partition_expression);
911
- const expression = text(row.partition_expression);
911
+ const boundText = text(row.partition_description);
912
+ const keyExpression = text(row.subpartition_expression) ?? text(row.partition_expression);
913
+ const key = keyExpression === void 0 ? void 0 : partitionKeyColumns(keyExpression);
914
+ const unknownFields = [];
915
+ if (keyExpression !== void 0 && key !== void 0 && !key.representable) {
916
+ const keySql = sql(keyExpression, namespace, parent, physicalName);
917
+ unknownFields.push({
918
+ name: "partitionExpression",
919
+ value: keySql
920
+ });
921
+ diagnostics.push(createIntrospectionDiagnostic({
922
+ severity: "warning",
923
+ code: "unsupported-feature",
924
+ message: `MySQL partition ${physicalName} has a functional key retained as dialect evidence`,
925
+ path: [
926
+ "partitions",
927
+ physicalName,
928
+ "partitionExpression"
929
+ ],
930
+ physicalReference,
931
+ remediation: "Inspect the retained partition expression before using it as migration input."
932
+ }));
933
+ }
912
934
  const partition = {
913
935
  kind: "partition",
914
936
  id: stableId(`partition:${tableName}:${physicalName}`),
@@ -919,9 +941,10 @@ function partitionObject(row, tables, namespace, diagnostics) {
919
941
  id: parent.id
920
942
  },
921
943
  strategy,
922
- ...expression === void 0 ? {} : { keyColumns: partitionKeyColumns(expression) },
944
+ ...key?.representable && key.columns.length > 0 ? { keyColumns: key.columns } : {},
923
945
  ...boundText === void 0 ? {} : { bound: sql(boundText, namespace, parent, physicalName) },
924
946
  reference: physicalReference,
947
+ ...unknownFields.length === 0 ? {} : { unknownFields },
925
948
  dialect: extension({
926
949
  ...text(row.partition_method) === void 0 ? {} : { partitionMethod: text(row.partition_method) },
927
950
  ...text(row.subpartition_method) === void 0 ? {} : { subpartitionMethod: text(row.subpartition_method) },
@@ -992,7 +1015,7 @@ function opaqueEvent(row, namespace) {
992
1015
  function objectComment(object, comment, physicalReference, namespace) {
993
1016
  return {
994
1017
  kind: "comment",
995
- id: stableId(`${object.kind}_${object.id}_comment`),
1018
+ id: metadataId(object, "comment"),
996
1019
  object,
997
1020
  text: comment,
998
1021
  reference: physicalReference,
@@ -1004,6 +1027,10 @@ function objectComment(object, comment, physicalReference, namespace) {
1004
1027
  }
1005
1028
  };
1006
1029
  }
1030
+ function metadataId(object, suffix) {
1031
+ const owner = object.owner;
1032
+ return stableId(`${owner === void 0 ? "" : `${owner.kind}_${owner.id}_`}${object.kind}_${object.id}_${suffix}`);
1033
+ }
1007
1034
  function groupRows(rows, keyOf) {
1008
1035
  const groups = /* @__PURE__ */ new Map();
1009
1036
  for (const row of rows) {
@@ -1052,7 +1079,53 @@ function partitionStrategy(value) {
1052
1079
  return normalized === "range" ? "range" : normalized === "list" ? "list" : normalized === "hash" ? "hash" : "unknown";
1053
1080
  }
1054
1081
  function partitionKeyColumns(expression) {
1055
- return expression.split(",").map((value) => value.trim()).filter((value) => /^[A-Za-z_][A-Za-z0-9_$]*$/.test(value));
1082
+ const terms = splitPartitionKeyExpression(expression);
1083
+ const columns = [];
1084
+ for (const term of terms) {
1085
+ const value = term.trim();
1086
+ if (/^[A-Za-z_][A-Za-z0-9_$]*$/.test(value)) {
1087
+ columns.push(value);
1088
+ continue;
1089
+ }
1090
+ const quoted = value.match(/^`((?:``|[^`])*)`$/);
1091
+ if (quoted) {
1092
+ columns.push(quoted[1].replace(/``/g, "`"));
1093
+ continue;
1094
+ }
1095
+ return {
1096
+ columns: [],
1097
+ representable: false
1098
+ };
1099
+ }
1100
+ return {
1101
+ columns,
1102
+ representable: true
1103
+ };
1104
+ }
1105
+ function splitPartitionKeyExpression(source) {
1106
+ const values = [];
1107
+ let start = 0;
1108
+ let depth = 0;
1109
+ let quote = false;
1110
+ for (let index = 0; index < source.length; index++) {
1111
+ const character = source[index];
1112
+ if (quote) {
1113
+ if (character === "`") {
1114
+ if (source[index + 1] === "`") index++;
1115
+ else quote = false;
1116
+ }
1117
+ continue;
1118
+ }
1119
+ if (character === "`") quote = true;
1120
+ else if (character === "(") depth++;
1121
+ else if (character === ")") depth--;
1122
+ else if (character === "," && depth === 0) {
1123
+ values.push(source.slice(start, index));
1124
+ start = index + 1;
1125
+ }
1126
+ }
1127
+ values.push(source.slice(start));
1128
+ return values;
1056
1129
  }
1057
1130
  function sql(textValue, namespace, table, name) {
1058
1131
  return {
@@ -1078,14 +1151,74 @@ function reference(kind, name, namespace, relation, key, value = name) {
1078
1151
  }
1079
1152
  };
1080
1153
  }
1081
- function literal(value, dataType) {
1154
+ function mysqlDefault(value, dataType, namespace, table, columnName) {
1082
1155
  if (value === void 0) return;
1083
- if (value.toUpperCase() === "NULL") return null;
1084
- if (value.toUpperCase() === "TRUE") return true;
1085
- if (value.toUpperCase() === "FALSE") return false;
1086
- if (/^-?(?:\d+\.?\d*|\.\d+)$/.test(value)) return Number(value);
1087
- if (/^'(?:''|[^'])*'$/.test(value)) return value.slice(1, -1).replace(/''/g, "'");
1088
- if (value === "" || /^(?:char|varchar|text|tinytext|mediumtext|longtext|enum|set)$/i.test(dataType ?? "")) return value;
1156
+ const literalValue = literal(value, dataType);
1157
+ return literalValue !== void 0 ? {
1158
+ kind: "literal",
1159
+ value: literalValue
1160
+ } : {
1161
+ kind: "expression",
1162
+ expression: sql(value, namespace, table, columnName)
1163
+ };
1164
+ }
1165
+ function literal(value, dataType) {
1166
+ const trimmed = value.trim();
1167
+ const normalizedType = dataType?.trim().toLowerCase();
1168
+ if (trimmed.toUpperCase() === "NULL") return null;
1169
+ if (trimmed.toUpperCase() === "TRUE") return true;
1170
+ if (trimmed.toUpperCase() === "FALSE") return false;
1171
+ if (isNumericDataType(normalizedType)) {
1172
+ const numeric = numericLiteral(trimmed);
1173
+ if (numeric !== void 0) return numeric;
1174
+ }
1175
+ if (/^'(?:''|[^'])*'$/.test(trimmed)) return trimmed.slice(1, -1).replace(/''/g, "'");
1176
+ if (trimmed === "" && isTextDataType(normalizedType)) return "";
1177
+ if (isTextDataType(normalizedType)) return value;
1178
+ }
1179
+ function isNumericDataType(value) {
1180
+ return /^(?:tinyint|smallint|mediumint|int|integer|bigint|decimal|numeric|dec|float|double|real)/.test(value ?? "");
1181
+ }
1182
+ function isTextDataType(value) {
1183
+ return /^(?:char|varchar|text|tinytext|mediumtext|longtext|enum|set|binary|varbinary|blob)/.test(value ?? "");
1184
+ }
1185
+ function numericLiteral(value) {
1186
+ if (/^[+-]?\d+$/.test(value)) try {
1187
+ const integer = BigInt(value);
1188
+ return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(integer) : integer;
1189
+ } catch {
1190
+ return;
1191
+ }
1192
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(value)) return;
1193
+ const numeric = Number(value);
1194
+ return Number.isFinite(numeric) && canonicalNumericText(value) === canonicalNumericText(String(numeric)) ? numeric : void 0;
1195
+ }
1196
+ function canonicalNumericText(value) {
1197
+ const match = value.match(/^([+-]?)(?:(\d+)(?:\.(\d*))?|\.(\d+))(?:[eE]([+-]?\d+))?$/);
1198
+ if (!match) return;
1199
+ const sign = match[1] === "-" ? "-" : "";
1200
+ const integerPart = match[2] ?? "";
1201
+ const fractionalPart = match[3] ?? match[4] ?? "";
1202
+ const exponent = Number(match[5] ?? 0);
1203
+ if (!Number.isSafeInteger(exponent)) return;
1204
+ const digits = integerPart + fractionalPart;
1205
+ const decimalPosition = integerPart.length + exponent;
1206
+ let integer;
1207
+ let fraction;
1208
+ if (decimalPosition <= 0) {
1209
+ integer = "0";
1210
+ fraction = `${"0".repeat(-decimalPosition)}${digits}`;
1211
+ } else if (decimalPosition >= digits.length) {
1212
+ integer = `${digits}${"0".repeat(decimalPosition - digits.length)}`;
1213
+ fraction = "";
1214
+ } else {
1215
+ integer = digits.slice(0, decimalPosition);
1216
+ fraction = digits.slice(decimalPosition);
1217
+ }
1218
+ integer = integer.replace(/^0+(?=\d)/, "") || "0";
1219
+ fraction = fraction.replace(/0+$/, "");
1220
+ if (integer === "0" && fraction === "") return "0";
1221
+ return `${sign}${integer}${fraction === "" ? "" : `.${fraction}`}`;
1089
1222
  }
1090
1223
  function emptyCatalog(namespace, diagnostics) {
1091
1224
  return {
@@ -1,4 +1,4 @@
1
- import { kt as CatalogConnection, st as IntrospectionCatalog, ut as IntrospectionOptions } from "../types-BEn0N_al.mjs";
1
+ import { ft as IntrospectionOptions, jt as CatalogConnection, lt as IntrospectionCatalog } from "../types-CiMvKi5V.mjs";
2
2
  //#region src/introspection/postgres.d.ts
3
3
  /** Fixed server metadata query used by the PostgreSQL catalog reader. */
4
4
  declare const postgresServerQuery = "\n SELECT\n current_setting('server_version_num') AS server_version_num,\n current_setting('server_version') AS server_version\n";
@@ -8,6 +8,9 @@ declare const postgresRelationsQuery = "\n SELECT c.oid::text AS oid, n.nspname
8
8
  /** Fixed view and materialized-view definitions from PostgreSQL's decompiler. */
9
9
  declare const postgresViewsQuery = "\n SELECT c.oid::text AS oid, n.nspname AS namespace, c.relname AS physical_name,\n c.relkind, pg_get_viewdef(c.oid, true) AS definition,\n v.check_option, c.reloptions\n FROM pg_catalog.pg_class c\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n LEFT JOIN information_schema.views v\n ON v.table_schema = n.nspname AND v.table_name = c.relname\n WHERE n.nspname = $1 AND c.relkind IN ('v', 'm')\n ORDER BY c.oid\n";
10
10
  declare const postgresColumnsQuery = "\n SELECT a.attrelid::text AS table_oid, a.attnum::int AS ordinal_position,\n a.attname AS physical_name, NOT a.attnotnull AS nullable,\n format_type(a.atttypid, a.atttypmod) AS native_type,\n a.attidentity, a.attgenerated,\n pg_get_expr(ad.adbin, ad.adrelid) AS default_expression\n FROM pg_attribute a\n JOIN pg_class c ON c.oid = a.attrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n LEFT JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum\n WHERE n.nspname = $1\n AND c.relkind IN ('r', 'p', 'v', 'm')\n AND a.attnum > 0\n AND NOT a.attisdropped\n ORDER BY a.attrelid, a.attnum\n";
11
+ /** Constraint metadata for PostgreSQL versions before pg_index.indnullsnotdistinct. */
12
+ declare const postgresConstraintsQueryWithoutNullsNotDistinct = "\n SELECT con.oid::text AS oid, con.conrelid::text AS table_oid,\n con.conname AS physical_name, con.contype,\n con.conkey, con.confrelid::text AS target_table_oid, con.confkey,\n con.confupdtype, con.confdeltype, con.confmatchtype,\n con.condeferrable, con.condeferred, con.convalidated,\n con.conindid::text AS backing_index_oid,\n pg_get_constraintdef(con.oid, true) AS definition\n FROM pg_constraint con\n JOIN pg_class c ON c.oid = con.conrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n LEFT JOIN pg_index i ON i.indexrelid = con.conindid\n WHERE n.nspname = $1\n AND con.contype IN ('p', 'u', 'f', 'c', 'x')\n ORDER BY con.conrelid, con.oid\n";
13
+ /** Constraint metadata for PostgreSQL versions that expose nulls-not-distinct indexes. */
11
14
  declare const postgresConstraintsQuery = "\n SELECT con.oid::text AS oid, con.conrelid::text AS table_oid,\n con.conname AS physical_name, con.contype,\n con.conkey, con.confrelid::text AS target_table_oid, con.confkey,\n con.confupdtype, con.confdeltype, con.confmatchtype,\n con.condeferrable, con.condeferred, con.convalidated,\n con.conindid::text AS backing_index_oid,\n i.indnullsnotdistinct,\n pg_get_constraintdef(con.oid, true) AS definition\n FROM pg_constraint con\n JOIN pg_class c ON c.oid = con.conrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n LEFT JOIN pg_index i ON i.indexrelid = con.conindid\n WHERE n.nspname = $1\n AND con.contype IN ('p', 'u', 'f', 'c', 'x')\n ORDER BY con.conrelid, con.oid\n";
12
15
  declare const postgresIndexesQuery = "\n SELECT i.indexrelid::text AS index_oid, i.indrelid::text AS table_oid,\n c.relname AS physical_name, i.indisunique, i.indnkeyatts::int,\n i.indnatts::int, am.amname AS method,\n pg_get_expr(i.indpred, i.indrelid, true) AS predicate,\n s.position::int,\n (i.indkey[s.position])::int AS attnum,\n (i.indoption[s.position])::int AS indoption,\n opc.opcname AS operator_class,\n pg_get_indexdef(i.indexrelid, s.position, true) AS term_definition\n FROM pg_index i\n JOIN pg_class c ON c.oid = i.indexrelid\n JOIN pg_class t ON t.oid = i.indrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_am am ON am.oid = c.relam\n CROSS JOIN LATERAL generate_series(1, i.indnatts) AS s(position)\n LEFT JOIN pg_opclass opc ON opc.oid = i.indclass[s.position]\n WHERE n.nspname = $1\n ORDER BY i.indrelid, i.indexrelid, s.position\n";
13
16
  /** Identity sequence options joined to each generated identity column. */
@@ -29,7 +32,7 @@ declare const postgresRoutinesQuery = "\n SELECT p.oid::text AS oid, n.nspname
29
32
  /** Routine parameter rows using PostgreSQL's complete argument type arrays. */
30
33
  declare const postgresRoutineParametersQuery = "\n SELECT p.oid::text AS routine_oid, x.position::int AS ordinal_position,\n names.name AS parameter_name, modes.mode,\n format_type(x.type_oid, -1) AS native_type\n FROM pg_catalog.pg_proc p\n JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n CROSS JOIN LATERAL unnest(\n COALESCE(p.proallargtypes, p.proargtypes::oid[])\n ) WITH ORDINALITY AS x(type_oid, position)\n LEFT JOIN LATERAL unnest(p.proargnames) WITH ORDINALITY\n AS names(name, position) ON names.position = x.position\n LEFT JOIN LATERAL unnest(p.proargmodes) WITH ORDINALITY\n AS modes(mode, position) ON modes.position = x.position\n WHERE n.nspname = $1 AND p.prokind IN ('f', 'p', 'a', 'w')\n ORDER BY p.oid, x.position\n";
31
34
  /** Partition children, key attributes, strategy, and bound expression. */
32
- declare const postgresPartitionsQuery = "\n SELECT child.oid::text AS partition_oid, parent.oid::text AS parent_oid,\n n.nspname AS namespace, child.relname AS physical_name,\n part.partstrat, part.partattrs::text AS key_attributes,\n pg_get_expr(child.relpartbound, child.oid, true) AS bound,\n child.relispartition, child.relkind\n FROM pg_catalog.pg_inherits inh\n JOIN pg_catalog.pg_class child ON child.oid = inh.inhrelid\n JOIN pg_catalog.pg_class parent ON parent.oid = inh.inhparent\n JOIN pg_catalog.pg_namespace n ON n.oid = child.relnamespace\n LEFT JOIN pg_catalog.pg_partitioned_table part ON part.partrelid = parent.oid\n WHERE n.nspname = $1\n ORDER BY parent.oid, child.oid\n";
35
+ declare const postgresPartitionsQuery = "\n SELECT child.oid::text AS partition_oid, parent.oid::text AS parent_oid,\n n.nspname AS namespace, child.relname AS physical_name,\n part.partstrat, part.partattrs::text AS key_attributes,\n pg_get_partkeydef(parent.oid) AS key_definition,\n pg_get_expr(child.relpartbound, child.oid, true) AS bound,\n child.relispartition, child.relkind\n FROM pg_catalog.pg_inherits inh\n JOIN pg_catalog.pg_class child ON child.oid = inh.inhrelid\n JOIN pg_catalog.pg_class parent ON parent.oid = inh.inhparent\n JOIN pg_catalog.pg_namespace n ON n.oid = child.relnamespace\n LEFT JOIN pg_catalog.pg_partitioned_table part ON part.partrelid = parent.oid\n WHERE n.nspname = $1\n ORDER BY parent.oid, child.oid\n";
33
36
  /** Row-level security policies and their role/expression metadata. */
34
37
  declare const postgresPoliciesQuery = "\n SELECT p.oid::text AS oid, p.polrelid::text AS table_oid,\n n.nspname AS namespace, p.polname AS physical_name,\n p.polcmd, p.polpermissive,\n ARRAY(SELECT r.rolname FROM pg_catalog.pg_roles r\n WHERE r.oid = ANY(p.polroles)) AS roles,\n pg_get_expr(p.polqual, p.polrelid, true) AS using_expression,\n pg_get_expr(p.polwithcheck, p.polrelid, true) AS check_expression\n FROM pg_catalog.pg_policy p\n JOIN pg_catalog.pg_class c ON c.oid = p.polrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1\n ORDER BY p.polrelid, p.oid\n";
35
38
  /** Installed PostgreSQL extensions scoped to the selected schema. */
@@ -37,4 +40,4 @@ declare const postgresExtensionsQuery = "\n SELECT e.oid::text AS oid, n.nspnam
37
40
  /** Comments and owners for PostgreSQL objects visible in one schema. */
38
41
  declare const postgresMetadataQuery = "\n WITH objects AS (\n SELECT 'pg_class'::text AS catalog_relation, 'pg_class'::regclass AS catalog_oid,\n c.oid::text AS object_oid, 0::int AS object_subid,\n CASE c.relkind WHEN 'r' THEN 'table' WHEN 'p' THEN 'table'\n WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized-view'\n WHEN 'S' THEN 'sequence' WHEN 'i' THEN 'index'\n WHEN 'I' THEN 'index' WHEN 'f' THEN 'deferred-object'\n ELSE 'opaque-object' END AS object_kind,\n c.relname AS object_name, n.nspname AS namespace,\n c.relowner::oid AS owner_oid, NULL::text AS parent_oid\n FROM pg_catalog.pg_class c\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1\n UNION ALL\n SELECT 'pg_class', 'pg_class'::regclass, c.oid::text, a.attnum::int,\n 'column', a.attname, n.nspname, c.relowner::oid, c.oid::text\n FROM pg_catalog.pg_attribute a\n JOIN pg_catalog.pg_class c ON c.oid = a.attrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1 AND c.relkind IN ('r', 'p', 'v', 'm')\n AND a.attnum > 0 AND NOT a.attisdropped\n UNION ALL\n SELECT 'pg_proc', 'pg_proc'::regclass, p.oid::text, 0,\n 'routine', p.proname, n.nspname, p.proowner::oid, NULL\n FROM pg_catalog.pg_proc p\n JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n WHERE n.nspname = $1 AND p.prokind IN ('f', 'p', 'a', 'w')\n UNION ALL\n SELECT 'pg_type', 'pg_type'::regclass, t.oid::text, 0,\n CASE t.typtype WHEN 'e' THEN 'enum' ELSE 'domain' END,\n t.typname, n.nspname, t.typowner::oid, NULL\n FROM pg_catalog.pg_type t\n JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n WHERE n.nspname = $1 AND t.typtype IN ('e', 'd')\n UNION ALL\n SELECT 'pg_collation', 'pg_collation'::regclass, c.oid::text, 0,\n 'collation', c.collname, n.nspname, c.collowner::oid, NULL\n FROM pg_catalog.pg_collation c\n JOIN pg_catalog.pg_namespace n ON n.oid = c.collnamespace\n WHERE n.nspname = $1\n UNION ALL\n SELECT 'pg_extension', 'pg_extension'::regclass, e.oid::text, 0,\n 'extension', e.extname, n.nspname, e.extowner::oid, NULL\n FROM pg_catalog.pg_extension e\n JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace\n WHERE n.nspname = $1\n UNION ALL\n SELECT 'pg_constraint', 'pg_constraint'::regclass, con.oid::text, 0,\n 'constraint', con.conname, n.nspname, c.relowner::oid,\n con.conrelid::text\n FROM pg_catalog.pg_constraint con\n JOIN pg_catalog.pg_class c ON c.oid = con.conrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1\n UNION ALL\n SELECT 'pg_trigger', 'pg_trigger'::regclass, t.oid::text, 0,\n 'trigger', t.tgname, n.nspname, c.relowner::oid,\n t.tgrelid::text\n FROM pg_catalog.pg_trigger t\n JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1 AND NOT t.tgisinternal\n UNION ALL\n SELECT 'pg_policy', 'pg_policy'::regclass, p.oid::text, 0,\n 'policy', p.polname, n.nspname, c.relowner::oid,\n p.polrelid::text\n FROM pg_catalog.pg_policy p\n JOIN pg_catalog.pg_class c ON c.oid = p.polrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1\n )\n SELECT o.catalog_relation, o.object_oid, o.object_subid,\n o.object_kind, o.object_name, o.namespace, o.parent_oid,\n d.description, pg_get_userbyid(o.owner_oid) AS owner\n FROM objects o\n LEFT JOIN pg_catalog.pg_description d\n ON d.classoid = o.catalog_oid AND d.objoid::text = o.object_oid\n AND d.objsubid = o.object_subid\n ORDER BY o.catalog_relation, o.object_oid, o.object_subid\n";
39
42
  //#endregion
40
- export { postgresCollationsQuery, postgresColumnsQuery, postgresConstraintsQuery, postgresDomainConstraintsQuery, postgresDomainsQuery, postgresEnumsQuery, postgresExtensionsQuery, postgresIdentitiesQuery, postgresIndexesQuery, postgresMetadataQuery, postgresPartitionsQuery, postgresPoliciesQuery, postgresRelationsQuery, postgresRoutineParametersQuery, postgresRoutinesQuery, postgresSequencesQuery, postgresServerQuery, postgresTriggersQuery, postgresViewsQuery, readCatalog };
43
+ export { postgresCollationsQuery, postgresColumnsQuery, postgresConstraintsQuery, postgresConstraintsQueryWithoutNullsNotDistinct, postgresDomainConstraintsQuery, postgresDomainsQuery, postgresEnumsQuery, postgresExtensionsQuery, postgresIdentitiesQuery, postgresIndexesQuery, postgresMetadataQuery, postgresPartitionsQuery, postgresPoliciesQuery, postgresRelationsQuery, postgresRoutineParametersQuery, postgresRoutinesQuery, postgresSequencesQuery, postgresServerQuery, postgresTriggersQuery, postgresViewsQuery, readCatalog };