@deepagents/text2sql 7.0.2 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/sql.js +57 -32
  3. package/dist/index.js +793 -498
  4. package/dist/index.js.map +4 -4
  5. package/dist/lib/adapters/adapter.d.ts +23 -1
  6. package/dist/lib/adapters/adapter.d.ts.map +1 -1
  7. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
  8. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
  9. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
  10. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
  11. package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
  12. package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
  13. package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
  14. package/dist/lib/adapters/bigquery/index.d.ts +6 -13
  15. package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
  16. package/dist/lib/adapters/bigquery/index.js +244 -51
  17. package/dist/lib/adapters/bigquery/index.js.map +4 -4
  18. package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
  19. package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
  20. package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
  21. package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
  22. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
  23. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
  24. package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
  25. package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
  26. package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
  27. package/dist/lib/adapters/clickhouse/index.js +133 -44
  28. package/dist/lib/adapters/clickhouse/index.js.map +4 -4
  29. package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
  30. package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
  31. package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
  32. package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
  33. package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
  34. package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
  35. package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
  36. package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
  37. package/dist/lib/adapters/duckdb/index.d.ts +8 -10
  38. package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
  39. package/dist/lib/adapters/duckdb/index.js +1549 -1412
  40. package/dist/lib/adapters/duckdb/index.js.map +4 -4
  41. package/dist/lib/adapters/groundings/index.js.map +1 -1
  42. package/dist/lib/adapters/groundings/rows.d.ts +32 -0
  43. package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
  44. package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
  45. package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
  46. package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
  47. package/dist/lib/adapters/mysql/index.d.ts +2 -4
  48. package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
  49. package/dist/lib/adapters/mysql/index.js +230 -76
  50. package/dist/lib/adapters/mysql/index.js.map +4 -4
  51. package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
  52. package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
  53. package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
  54. package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
  55. package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
  56. package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
  57. package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
  58. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
  59. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
  60. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
  61. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
  62. package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
  63. package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -1
  64. package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
  65. package/dist/lib/adapters/postgres/index.d.ts +2 -4
  66. package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
  67. package/dist/lib/adapters/postgres/index.js +266 -487
  68. package/dist/lib/adapters/postgres/index.js.map +4 -4
  69. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
  70. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
  71. package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
  72. package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
  73. package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
  74. package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
  75. package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
  76. package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
  77. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
  78. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
  79. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
  80. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
  81. package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
  82. package/dist/lib/adapters/posthog/index.d.ts +4 -5
  83. package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
  84. package/dist/lib/adapters/posthog/index.js +349 -287
  85. package/dist/lib/adapters/posthog/index.js.map +4 -4
  86. package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
  87. package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
  88. package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
  89. package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
  90. package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
  91. package/dist/lib/adapters/posthog/types.d.ts +16 -6
  92. package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
  93. package/dist/lib/adapters/spreadsheet/index.js +113 -34
  94. package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
  95. package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
  96. package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
  97. package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
  98. package/dist/lib/adapters/sqlite/index.js +136 -49
  99. package/dist/lib/adapters/sqlite/index.js.map +4 -4
  100. package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
  101. package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
  102. package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
  103. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
  104. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
  105. package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
  106. package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
  107. package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
  108. package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
  109. package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
  110. package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
  111. package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
  112. package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
  113. package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
  114. package/dist/lib/adapters/sqlserver/index.js +223 -455
  115. package/dist/lib/adapters/sqlserver/index.js.map +4 -4
  116. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
  117. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
  118. package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
  119. package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
  120. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
  121. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
  122. package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
  123. package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
  124. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +4 -3
  125. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
  126. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
  127. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
  128. package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
  129. package/dist/lib/checkpoint.d.ts +34 -21
  130. package/dist/lib/checkpoint.d.ts.map +1 -1
  131. package/dist/lib/file-cache.d.ts +6 -1
  132. package/dist/lib/file-cache.d.ts.map +1 -1
  133. package/dist/lib/fs/columns.d.ts +14 -0
  134. package/dist/lib/fs/columns.d.ts.map +1 -0
  135. package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
  136. package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
  137. package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
  138. package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
  139. package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
  140. package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
  141. package/dist/lib/index-cache.d.ts +4 -3
  142. package/dist/lib/index-cache.d.ts.map +1 -1
  143. package/dist/lib/sql.d.ts.map +1 -1
  144. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
  145. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
  146. package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
  147. package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
  148. package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
  149. package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
  150. package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
  151. package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
  152. package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
  153. package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
  154. package/dist/lib/synthesis/index.js +124 -114
  155. package/dist/lib/synthesis/index.js.map +4 -4
  156. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
  157. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
  158. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
  159. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
  160. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
  161. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
  162. package/package.json +4 -4
@@ -1,5 +1,6 @@
1
1
  // packages/text2sql/src/lib/adapters/adapter.ts
2
2
  import { format as formatSql } from "sql-formatter";
3
+ import { z } from "zod";
3
4
 
4
5
  // packages/text2sql/src/lib/agents/exceptions.ts
5
6
  var sqlValidationMarker = /* @__PURE__ */ Symbol("SQLValidationError");
@@ -172,6 +173,16 @@ function createGroundingContext(options = {}) {
172
173
  }
173
174
 
174
175
  // packages/text2sql/src/lib/adapters/adapter.ts
176
+ function groundingFor(adapterType, create) {
177
+ return (adapter) => {
178
+ if (!(adapter instanceof adapterType)) {
179
+ throw new Error(
180
+ `A ${adapterType.name} grounding needs a ${adapterType.name} adapter, not ${adapter.constructor.name}.`
181
+ );
182
+ }
183
+ return create(adapter);
184
+ };
185
+ }
175
186
  var Adapter = class {
176
187
  #policyAnalyzer;
177
188
  /**
@@ -432,6 +443,40 @@ var Adapter = class {
432
443
  }
433
444
  return decoded;
434
445
  }
446
+ /**
447
+ * Run an introspection query and check every row against `row`, the shape
448
+ * the driver returns for that query. A row of any other shape throws.
449
+ */
450
+ async runQuery(sql, row) {
451
+ const rows = z.array(row).safeParse(await this.queryRows(sql));
452
+ if (!rows.success) {
453
+ throw new Error(
454
+ `${this.constructor.name} introspection query returned rows of an unexpected shape:
455
+ ${z.prettifyError(rows.error)}
456
+ SQL: ${sql.trim()}`,
457
+ { cause: rows.error }
458
+ );
459
+ }
460
+ return rows.data;
461
+ }
462
+ /**
463
+ * The rows in a driver's execute() result: the result itself when it is an
464
+ * array, otherwise the first array found at one of `paths` (dot-separated,
465
+ * so `recordsets.0` reads `result.recordsets[0]`).
466
+ */
467
+ rowsFrom(result, paths) {
468
+ if (Array.isArray(result)) return result;
469
+ for (const path of paths) {
470
+ const rows = path.split(".").reduce(
471
+ (value, key) => typeof value === "object" && value !== null ? Reflect.get(value, key) : void 0,
472
+ result
473
+ );
474
+ if (Array.isArray(rows)) return rows;
475
+ }
476
+ throw new Error(
477
+ `${this.constructor.name} execute() must return an array of rows or an object holding one at ${paths.map((path) => `result.${path}`).join(", ")}.`
478
+ );
479
+ }
435
480
  /**
436
481
  * Convert unknown database value to number.
437
482
  * Handles number, bigint, and string types.
@@ -992,6 +1037,32 @@ var TableGrounding = class extends AbstractGrounding {
992
1037
  };
993
1038
 
994
1039
  // packages/text2sql/src/lib/adapters/sqlserver/column-stats.sqlserver.grounding.ts
1040
+ import { z as z3 } from "zod";
1041
+
1042
+ // packages/text2sql/src/lib/adapters/groundings/rows.ts
1043
+ import { z as z2 } from "zod";
1044
+ var nameRow = z2.object({ name: z2.string() });
1045
+ var versionRow = z2.object({ version: z2.string() });
1046
+ var databaseRow = z2.object({ db: z2.string() });
1047
+ var viewDefinitionRow = z2.object({
1048
+ definition: z2.string().nullable()
1049
+ });
1050
+ var distinctValueRow = z2.object({ value: z2.unknown() });
1051
+ var textValueRow = z2.object({ value: z2.string() });
1052
+ var numericValue = z2.union([z2.number(), z2.bigint(), z2.string()]);
1053
+
1054
+ // packages/text2sql/src/lib/adapters/sqlserver/column-stats.sqlserver.grounding.ts
1055
+ var nDistinctRow = z3.object({
1056
+ schema_name: z3.string().nullable(),
1057
+ table_name: z3.string().nullable(),
1058
+ column_name: z3.string().nullable(),
1059
+ approx_n_distinct: numericValue
1060
+ });
1061
+ var statsRow = z3.object({
1062
+ min_value: z3.string().nullable(),
1063
+ max_value: z3.string().nullable(),
1064
+ null_fraction: numericValue.nullable()
1065
+ });
995
1066
  var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
996
1067
  #adapter;
997
1068
  #nDistinctCache = /* @__PURE__ */ new Map();
@@ -1010,7 +1081,8 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
1010
1081
  return `OBJECT_ID('[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]')`;
1011
1082
  });
1012
1083
  try {
1013
- const rows = await this.#adapter.runQuery(`
1084
+ const rows = await this.#adapter.runQuery(
1085
+ `
1014
1086
  SELECT
1015
1087
  OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
1016
1088
  OBJECT_NAME(s.object_id) AS table_name,
@@ -1026,8 +1098,12 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
1026
1098
  WHERE sc.stats_column_id = 1
1027
1099
  AND sp.rows > 0
1028
1100
  AND s.object_id IN (${objectIds.join(", ")})
1029
- `);
1101
+ `,
1102
+ nDistinctRow
1103
+ );
1030
1104
  for (const row of rows) {
1105
+ const nDistinct = this.#adapter.toNumber(row.approx_n_distinct);
1106
+ if (row.column_name === null || nDistinct === void 0) continue;
1031
1107
  const tableName = ctx.tables.find((t) => {
1032
1108
  const { schema, table: table2 } = this.#adapter.parseTableName(t.name);
1033
1109
  return schema === row.schema_name && table2 === row.table_name;
@@ -1038,7 +1114,7 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
1038
1114
  map = /* @__PURE__ */ new Map();
1039
1115
  this.#nDistinctCache.set(tableName, map);
1040
1116
  }
1041
- map.set(row.column_name, row.approx_n_distinct);
1117
+ map.set(row.column_name, nDistinct);
1042
1118
  }
1043
1119
  } catch {
1044
1120
  }
@@ -1061,7 +1137,7 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
1061
1137
  AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction
1062
1138
  FROM ${tableIdentifier}
1063
1139
  `;
1064
- const rows = await this.#adapter.runQuery(sql);
1140
+ const rows = await this.#adapter.runQuery(sql, statsRow);
1065
1141
  if (!rows.length) {
1066
1142
  if (cachedNDistinct != null) {
1067
1143
  return { nDistinct: cachedNDistinct };
@@ -1128,22 +1204,36 @@ var SqlServerColumnValuesGrounding = class extends ColumnValuesGrounding {
1128
1204
  FROM ${tableIdentifier}
1129
1205
  WHERE ${columnIdentifier} IS NOT NULL
1130
1206
  `;
1131
- const rows = await this.#adapter.runQuery(sql);
1207
+ const rows = await this.#adapter.runQuery(sql, textValueRow);
1132
1208
  if (!rows.length || rows.length > this.lowCardinalityLimit) {
1133
1209
  return void 0;
1134
1210
  }
1135
- const values = [];
1136
- for (const row of rows) {
1137
- if (row.value == null) {
1138
- return void 0;
1139
- }
1140
- values.push(row.value);
1141
- }
1142
- return values.length ? values : void 0;
1211
+ return rows.map((row) => row.value);
1143
1212
  }
1144
1213
  };
1145
1214
 
1146
1215
  // packages/text2sql/src/lib/adapters/sqlserver/constraint.sqlserver.grounding.ts
1216
+ import { z as z4 } from "zod";
1217
+ var keyColumnRow = z4.object({
1218
+ constraint_name: z4.string(),
1219
+ column_name: z4.string()
1220
+ });
1221
+ var foreignKeyRow = z4.object({
1222
+ constraint_name: z4.string(),
1223
+ column_name: z4.string(),
1224
+ ref_schema: z4.string(),
1225
+ ref_table: z4.string(),
1226
+ ref_column: z4.string()
1227
+ });
1228
+ var checkConstraintRow = z4.object({
1229
+ constraint_name: z4.string(),
1230
+ definition: z4.string().nullable()
1231
+ });
1232
+ var columnDefaultRow = z4.object({
1233
+ column_name: z4.string(),
1234
+ default_definition: z4.string().nullable(),
1235
+ is_nullable: z4.boolean()
1236
+ });
1147
1237
  var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1148
1238
  #adapter;
1149
1239
  constructor(adapter, config = {}) {
@@ -1153,7 +1243,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1153
1243
  async getConstraints(tableName) {
1154
1244
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
1155
1245
  const constraints2 = [];
1156
- const pkRows = await this.#adapter.runQuery(`
1246
+ const pkRows = await this.#adapter.runQuery(
1247
+ `
1157
1248
  SELECT
1158
1249
  kc.name AS constraint_name,
1159
1250
  COL_NAME(ic.object_id, ic.column_id) AS column_name
@@ -1165,7 +1256,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1165
1256
  AND t.name = '${this.#adapter.escapeString(table2)}'
1166
1257
  AND kc.type = 'PK'
1167
1258
  ORDER BY ic.key_ordinal
1168
- `);
1259
+ `,
1260
+ keyColumnRow
1261
+ );
1169
1262
  if (pkRows.length > 0) {
1170
1263
  constraints2.push({
1171
1264
  name: pkRows[0].constraint_name,
@@ -1173,7 +1266,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1173
1266
  columns: pkRows.map((r) => r.column_name)
1174
1267
  });
1175
1268
  }
1176
- const fkRows = await this.#adapter.runQuery(`
1269
+ const fkRows = await this.#adapter.runQuery(
1270
+ `
1177
1271
  SELECT
1178
1272
  fk.name AS constraint_name,
1179
1273
  COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name,
@@ -1189,7 +1283,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1189
1283
  WHERE s.name = '${this.#adapter.escapeString(schema)}'
1190
1284
  AND t.name = '${this.#adapter.escapeString(table2)}'
1191
1285
  ORDER BY fk.name, fkc.constraint_column_id
1192
- `);
1286
+ `,
1287
+ foreignKeyRow
1288
+ );
1193
1289
  const fkMap = /* @__PURE__ */ new Map();
1194
1290
  for (const row of fkRows) {
1195
1291
  const existing = fkMap.get(row.constraint_name);
@@ -1214,7 +1310,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1214
1310
  referencedColumns: data.refColumns
1215
1311
  });
1216
1312
  }
1217
- const checkRows = await this.#adapter.runQuery(`
1313
+ const checkRows = await this.#adapter.runQuery(
1314
+ `
1218
1315
  SELECT
1219
1316
  cc.name AS constraint_name,
1220
1317
  cc.definition
@@ -1223,7 +1320,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1223
1320
  JOIN sys.schemas s ON t.schema_id = s.schema_id
1224
1321
  WHERE s.name = '${this.#adapter.escapeString(schema)}'
1225
1322
  AND t.name = '${this.#adapter.escapeString(table2)}'
1226
- `);
1323
+ `,
1324
+ checkConstraintRow
1325
+ );
1227
1326
  for (const row of checkRows) {
1228
1327
  constraints2.push({
1229
1328
  name: row.constraint_name,
@@ -1231,7 +1330,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1231
1330
  definition: row.definition?.replace(/^\(/, "").replace(/\)$/, "")
1232
1331
  });
1233
1332
  }
1234
- const uniqueRows = await this.#adapter.runQuery(`
1333
+ const uniqueRows = await this.#adapter.runQuery(
1334
+ `
1235
1335
  SELECT
1236
1336
  i.name AS constraint_name,
1237
1337
  COL_NAME(ic.object_id, ic.column_id) AS column_name
@@ -1243,7 +1343,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1243
1343
  AND t.name = '${this.#adapter.escapeString(table2)}'
1244
1344
  AND i.is_unique_constraint = 1
1245
1345
  ORDER BY i.name, ic.key_ordinal
1246
- `);
1346
+ `,
1347
+ keyColumnRow
1348
+ );
1247
1349
  const uniqueMap = /* @__PURE__ */ new Map();
1248
1350
  for (const row of uniqueRows) {
1249
1351
  const existing = uniqueMap.get(row.constraint_name);
@@ -1260,7 +1362,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1260
1362
  columns
1261
1363
  });
1262
1364
  }
1263
- const columnRows = await this.#adapter.runQuery(`
1365
+ const columnRows = await this.#adapter.runQuery(
1366
+ `
1264
1367
  SELECT
1265
1368
  c.name AS column_name,
1266
1369
  dc.definition AS default_definition,
@@ -1271,11 +1374,13 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1271
1374
  LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
1272
1375
  WHERE s.name = '${this.#adapter.escapeString(schema)}'
1273
1376
  AND t.name = '${this.#adapter.escapeString(table2)}'
1274
- `);
1377
+ `,
1378
+ columnDefaultRow
1379
+ );
1275
1380
  const pkConstraint = constraints2.find((c) => c.type === "PRIMARY_KEY");
1276
1381
  const pkColumns = new Set(pkConstraint?.columns ?? []);
1277
1382
  for (const col of columnRows) {
1278
- if (col.is_nullable === 0 && !pkColumns.has(col.column_name)) {
1383
+ if (!col.is_nullable && !pkColumns.has(col.column_name)) {
1279
1384
  constraints2.push({
1280
1385
  name: `${table2}_${col.column_name}_notnull`,
1281
1386
  type: "NOT_NULL",
@@ -1296,17 +1401,24 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
1296
1401
  };
1297
1402
 
1298
1403
  // packages/text2sql/src/lib/adapters/sqlserver/indexes.sqlserver.grounding.ts
1404
+ import { z as z5 } from "zod";
1405
+ var indexRow = z5.object({
1406
+ index_name: z5.string(),
1407
+ column_name: z5.string(),
1408
+ is_unique: z5.boolean(),
1409
+ index_type: z5.string(),
1410
+ key_ordinal: z5.number()
1411
+ });
1299
1412
  var SqlServerIndexesGrounding = class extends IndexesGrounding {
1300
1413
  #adapter;
1301
- #schemas;
1302
1414
  constructor(adapter, config = {}) {
1303
1415
  super(config);
1304
1416
  this.#adapter = adapter;
1305
- this.#schemas = config.schemas;
1306
1417
  }
1307
1418
  async getIndexes(tableName) {
1308
1419
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
1309
- const rows = await this.#adapter.runQuery(`
1420
+ const rows = await this.#adapter.runQuery(
1421
+ `
1310
1422
  SELECT
1311
1423
  i.name AS index_name,
1312
1424
  COL_NAME(ic.object_id, ic.column_id) AS column_name,
@@ -1326,7 +1438,9 @@ var SqlServerIndexesGrounding = class extends IndexesGrounding {
1326
1438
  AND i.name IS NOT NULL
1327
1439
  AND ic.is_included_column = 0
1328
1440
  ORDER BY i.name, ic.key_ordinal
1329
- `);
1441
+ `,
1442
+ indexRow
1443
+ );
1330
1444
  return this.#groupIndexes(rows);
1331
1445
  }
1332
1446
  #groupIndexes(rows) {
@@ -1358,10 +1472,8 @@ var SqlServerInfoGrounding = class extends InfoGrounding {
1358
1472
  }
1359
1473
  async collectInfo() {
1360
1474
  const [versionRows, dbRows] = await Promise.all([
1361
- this.#adapter.runQuery(
1362
- "SELECT @@VERSION AS version"
1363
- ),
1364
- this.#adapter.runQuery("SELECT DB_NAME() AS db")
1475
+ this.#adapter.runQuery("SELECT @@VERSION AS version", versionRow),
1476
+ this.#adapter.runQuery("SELECT DB_NAME() AS db", databaseRow)
1365
1477
  ]);
1366
1478
  return {
1367
1479
  dialect: "sqlserver",
@@ -1376,6 +1488,8 @@ var SqlServerInfoGrounding = class extends InfoGrounding {
1376
1488
  };
1377
1489
 
1378
1490
  // packages/text2sql/src/lib/adapters/sqlserver/row-count.sqlserver.grounding.ts
1491
+ import { z as z6 } from "zod";
1492
+ var countRow = z6.object({ count: numericValue });
1379
1493
  var SqlServerRowCountGrounding = class extends RowCountGrounding {
1380
1494
  #adapter;
1381
1495
  constructor(adapter, config = {}) {
@@ -1386,7 +1500,8 @@ var SqlServerRowCountGrounding = class extends RowCountGrounding {
1386
1500
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
1387
1501
  const tableIdentifier = `[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]`;
1388
1502
  const rows = await this.#adapter.runQuery(
1389
- `SELECT COUNT(*) as count FROM ${tableIdentifier}`
1503
+ `SELECT COUNT(*) as count FROM ${tableIdentifier}`,
1504
+ countRow
1390
1505
  );
1391
1506
  return this.#adapter.toNumber(rows[0]?.count);
1392
1507
  }
@@ -1760,9 +1875,6 @@ var SQL_SERVER_ERROR_MAP = {
1760
1875
  hint: "The query violates a constraint. Re-check join logic and filtering."
1761
1876
  }
1762
1877
  };
1763
- var LOW_CARDINALITY_LIMIT = 20;
1764
- var noopProgress2 = () => {
1765
- };
1766
1878
  function getErrorCode(error) {
1767
1879
  if (typeof error === "object" && error !== null && "number" in error && typeof error.number === "number") {
1768
1880
  return String(error.number);
@@ -1823,9 +1935,6 @@ var SqlServer = class extends Adapter {
1823
1935
  return JSON.stringify(formatSqlServerError(sql, error));
1824
1936
  }
1825
1937
  }
1826
- async runQuery(sql) {
1827
- return this.#runIntrospectionQuery(sql);
1828
- }
1829
1938
  quoteIdentifier(name) {
1830
1939
  return `[${name.replace(/]/g, "]]")}]`;
1831
1940
  }
@@ -1838,435 +1947,75 @@ var SqlServer = class extends Adapter {
1838
1947
  const columnList = columns?.length ? columns.map((c) => this.quoteIdentifier(c)).join(", ") : "*";
1839
1948
  return `SELECT TOP ${limit} ${columnList} FROM ${tableIdentifier}`;
1840
1949
  }
1841
- async #loadTables() {
1842
- const rows = await this.#runIntrospectionQuery(`
1843
- SELECT
1844
- c.TABLE_SCHEMA AS table_schema,
1845
- c.TABLE_NAME AS table_name,
1846
- c.COLUMN_NAME AS column_name,
1847
- c.DATA_TYPE AS data_type
1848
- FROM INFORMATION_SCHEMA.COLUMNS AS c
1849
- JOIN INFORMATION_SCHEMA.TABLES AS t
1850
- ON c.TABLE_SCHEMA = t.TABLE_SCHEMA
1851
- AND c.TABLE_NAME = t.TABLE_NAME
1852
- WHERE t.TABLE_TYPE = 'BASE TABLE'
1853
- ${this.#buildSchemaFilter("c.TABLE_SCHEMA")}
1854
- ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION
1855
- `);
1856
- const tables2 = /* @__PURE__ */ new Map();
1857
- for (const row of rows) {
1858
- if (!row.table_name) {
1859
- continue;
1860
- }
1861
- const schema = row.table_schema ?? "dbo";
1862
- const tableName = row.table_name;
1863
- const qualifiedName = `${schema}.${tableName}`;
1864
- const table2 = tables2.get(qualifiedName) ?? {
1865
- name: qualifiedName,
1866
- schema,
1867
- rawName: tableName,
1868
- columns: []
1869
- };
1870
- table2.columns.push({
1871
- name: row.column_name ?? "unknown",
1872
- type: row.data_type ?? "unknown"
1873
- });
1874
- tables2.set(qualifiedName, table2);
1875
- }
1876
- return Array.from(tables2.values());
1877
- }
1878
- async #loadRelationships(filterTableNames) {
1879
- const tableFilter = this.#buildTableNamesFilter(filterTableNames);
1880
- const rows = await this.#runIntrospectionQuery(`
1881
- SELECT
1882
- fk.CONSTRAINT_NAME AS constraint_name,
1883
- fk.TABLE_SCHEMA AS table_schema,
1884
- fk.TABLE_NAME AS table_name,
1885
- fk.COLUMN_NAME AS column_name,
1886
- pk.TABLE_SCHEMA AS referenced_table_schema,
1887
- pk.TABLE_NAME AS referenced_table_name,
1888
- pk.COLUMN_NAME AS referenced_column_name
1889
- FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
1890
- JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS fk
1891
- ON fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
1892
- JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS pk
1893
- ON pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
1894
- AND pk.ORDINAL_POSITION = fk.ORDINAL_POSITION
1895
- WHERE 1 = 1
1896
- ${this.#buildSchemaFilter("fk.TABLE_SCHEMA")}
1897
- ${tableFilter}
1898
- ORDER BY fk.TABLE_SCHEMA, fk.TABLE_NAME, fk.CONSTRAINT_NAME, fk.ORDINAL_POSITION
1899
- `);
1900
- const relationships = /* @__PURE__ */ new Map();
1901
- for (const row of rows) {
1902
- if (!row.constraint_name || !row.table_name || !row.referenced_table_name) {
1903
- continue;
1904
- }
1905
- const schema = row.table_schema ?? "dbo";
1906
- const referencedSchema = row.referenced_table_schema ?? "dbo";
1907
- const key = `${schema}.${row.table_name}:${row.constraint_name}`;
1908
- const relationship2 = relationships.get(key) ?? {
1909
- table: `${schema}.${row.table_name}`,
1910
- from: [],
1911
- referenced_table: `${referencedSchema}.${row.referenced_table_name}`,
1912
- to: []
1913
- };
1914
- relationship2.from.push(row.column_name ?? "unknown");
1915
- relationship2.to.push(row.referenced_column_name ?? "unknown");
1916
- relationships.set(key, relationship2);
1917
- }
1918
- return Array.from(relationships.values());
1919
- }
1920
- async #annotateRowCounts(tables2, onProgress = noopProgress2) {
1921
- const total = tables2.length;
1922
- for (let i = 0; i < tables2.length; i++) {
1923
- const table2 = tables2[i];
1924
- const tableIdentifier = this.#formatQualifiedTableName(table2);
1925
- onProgress({
1926
- type: "phase:progress",
1927
- phase: "row_counts",
1928
- table: table2.name,
1929
- message: `Counting rows in ${table2.name}...`,
1930
- current: i + 1,
1931
- total
1932
- });
1933
- try {
1934
- const rows = await this.#runIntrospectionQuery(`SELECT COUNT(*) as count FROM ${tableIdentifier}`);
1935
- const rowCount2 = this.#toNumber(rows[0]?.count);
1936
- if (rowCount2 != null) {
1937
- table2.rowCount = rowCount2;
1938
- table2.sizeHint = this.#classifyRowCount(rowCount2);
1939
- }
1940
- } catch {
1941
- continue;
1942
- }
1943
- }
1944
- }
1945
- async #annotateIndexes(tables2) {
1946
- if (!tables2.length) {
1947
- return;
1948
- }
1949
- const tableMap = new Map(tables2.map((table2) => [table2.name, table2]));
1950
- const rows = await this.#runIntrospectionQuery(`
1951
- SELECT
1952
- sch.name AS schema_name,
1953
- t.name AS table_name,
1954
- ind.name AS index_name,
1955
- col.name AS column_name,
1956
- ind.is_unique,
1957
- ind.is_primary_key,
1958
- ind.type_desc,
1959
- ic.is_included_column
1960
- FROM sys.indexes AS ind
1961
- JOIN sys.tables AS t ON ind.object_id = t.object_id
1962
- JOIN sys.schemas AS sch ON t.schema_id = sch.schema_id
1963
- JOIN sys.index_columns AS ic
1964
- ON ind.object_id = ic.object_id
1965
- AND ind.index_id = ic.index_id
1966
- JOIN sys.columns AS col
1967
- ON ic.object_id = col.object_id
1968
- AND ic.column_id = col.column_id
1969
- WHERE ind.is_hypothetical = 0
1970
- AND ind.name IS NOT NULL
1971
- ${this.#buildSchemaFilter("sch.name")}
1972
- ORDER BY sch.name, t.name, ind.name, ic.key_ordinal
1973
- `);
1974
- const indexMap = /* @__PURE__ */ new Map();
1975
- for (const row of rows) {
1976
- if (!row.table_name || !row.index_name) {
1977
- continue;
1978
- }
1979
- const schema = row.schema_name ?? "dbo";
1980
- const tableKey = `${schema}.${row.table_name}`;
1981
- const table2 = tableMap.get(tableKey);
1982
- if (!table2) {
1983
- continue;
1984
- }
1985
- const indexKey = `${tableKey}:${row.index_name}`;
1986
- let index2 = indexMap.get(indexKey);
1987
- if (!index2) {
1988
- index2 = {
1989
- name: row.index_name,
1990
- columns: [],
1991
- unique: Boolean(row.is_unique),
1992
- type: row.type_desc ?? void 0
1993
- };
1994
- indexMap.set(indexKey, index2);
1995
- if (!table2.indexes) {
1996
- table2.indexes = [];
1997
- }
1998
- table2.indexes.push(index2);
1999
- }
2000
- if (row.is_included_column) {
2001
- continue;
2002
- }
2003
- if (row.column_name) {
2004
- index2.columns.push(row.column_name);
2005
- const column2 = table2.columns.find(
2006
- (col) => col.name === row.column_name
2007
- );
2008
- if (column2) {
2009
- column2.isIndexed = true;
2010
- }
2011
- }
2012
- }
2013
- }
2014
- async #annotateColumnStats(tables2, onProgress = noopProgress2) {
2015
- if (!tables2.length) {
2016
- return;
2017
- }
2018
- const total = tables2.length;
2019
- for (let i = 0; i < tables2.length; i++) {
2020
- const table2 = tables2[i];
2021
- const tableIdentifier = this.#formatQualifiedTableName(table2);
2022
- onProgress({
2023
- type: "phase:progress",
2024
- phase: "column_stats",
2025
- table: table2.name,
2026
- message: `Collecting stats for ${table2.name}...`,
2027
- current: i + 1,
2028
- total
2029
- });
2030
- for (const column2 of table2.columns) {
2031
- if (!this.#shouldCollectStats(column2.type)) {
2032
- continue;
2033
- }
2034
- const columnIdentifier = this.#quoteIdentifier(column2.name);
2035
- const sql = `
2036
- SELECT
2037
- CONVERT(NVARCHAR(4000), MIN(${columnIdentifier})) AS min_value,
2038
- CONVERT(NVARCHAR(4000), MAX(${columnIdentifier})) AS max_value,
2039
- AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction
2040
- FROM ${tableIdentifier}
2041
- `;
2042
- try {
2043
- const rows = await this.#runIntrospectionQuery(sql);
2044
- if (!rows.length) {
2045
- continue;
2046
- }
2047
- const nullFraction = this.#toNumber(rows[0]?.null_fraction);
2048
- if (rows[0]?.min_value != null || rows[0]?.max_value != null || nullFraction != null) {
2049
- column2.stats = {
2050
- min: rows[0]?.min_value ?? void 0,
2051
- max: rows[0]?.max_value ?? void 0,
2052
- nullFraction: nullFraction != null && Number.isFinite(nullFraction) ? Math.max(0, Math.min(1, nullFraction)) : void 0
2053
- };
2054
- }
2055
- } catch {
2056
- continue;
2057
- }
2058
- }
2059
- }
2060
- }
2061
- async #annotateLowCardinalityColumns(tables2, onProgress = noopProgress2) {
2062
- const total = tables2.length;
2063
- for (let i = 0; i < tables2.length; i++) {
2064
- const table2 = tables2[i];
2065
- const tableIdentifier = this.#formatQualifiedTableName(table2);
2066
- onProgress({
2067
- type: "phase:progress",
2068
- phase: "low_cardinality",
2069
- table: table2.name,
2070
- message: `Analyzing cardinality in ${table2.name}...`,
2071
- current: i + 1,
2072
- total
2073
- });
2074
- for (const column2 of table2.columns) {
2075
- const columnIdentifier = this.#quoteIdentifier(column2.name);
2076
- const limit = LOW_CARDINALITY_LIMIT + 1;
2077
- const sql = `
2078
- SELECT DISTINCT TOP (${limit}) ${columnIdentifier} AS value
2079
- FROM ${tableIdentifier}
2080
- WHERE ${columnIdentifier} IS NOT NULL
2081
- `;
2082
- let rows = [];
2083
- try {
2084
- rows = await this.#runIntrospectionQuery(sql);
2085
- } catch {
2086
- continue;
2087
- }
2088
- if (!rows.length || rows.length > LOW_CARDINALITY_LIMIT) {
2089
- continue;
2090
- }
2091
- const values = [];
2092
- let shouldSkip = false;
2093
- for (const row of rows) {
2094
- const formatted = this.#normalizeValue(row.value);
2095
- if (formatted == null) {
2096
- shouldSkip = true;
2097
- break;
2098
- }
2099
- values.push(formatted);
2100
- }
2101
- if (shouldSkip || !values.length) {
2102
- continue;
2103
- }
2104
- column2.kind = "LowCardinality";
2105
- column2.values = values;
2106
- }
2107
- }
2108
- }
2109
- #buildSchemaFilter(columnName) {
2110
- if (this.#options.schemas && this.#options.schemas.length > 0) {
2111
- const values = this.#options.schemas.map((schema) => `'${schema.replace(/'/g, "''")}'`).join(", ");
2112
- return `AND ${columnName} IN (${values})`;
2113
- }
2114
- return `AND ${columnName} NOT IN ('INFORMATION_SCHEMA', 'sys')`;
2115
- }
2116
1950
  /**
2117
- * Build a filter for table names (qualified as schema.table).
2118
- * Matches if either the source table or referenced table is in the list.
1951
+ * The schemas introspection is limited to; table and view discovery use
1952
+ * them unless a grounding lists its own.
2119
1953
  */
2120
- #buildTableNamesFilter(tableNames) {
2121
- if (!tableNames || tableNames.length === 0) {
2122
- return "";
2123
- }
2124
- const conditions = [];
2125
- for (const name of tableNames) {
2126
- const escaped = name.replace(/'/g, "''");
2127
- if (name.includes(".")) {
2128
- const [schema, ...rest] = name.split(".");
2129
- const tableName = rest.join(".");
2130
- const escapedSchema = schema.replace(/'/g, "''");
2131
- const escapedTable = tableName.replace(/'/g, "''");
2132
- conditions.push(
2133
- `(fk.TABLE_SCHEMA = '${escapedSchema}' AND fk.TABLE_NAME = '${escapedTable}')`
2134
- );
2135
- conditions.push(
2136
- `(pk.TABLE_SCHEMA = '${escapedSchema}' AND pk.TABLE_NAME = '${escapedTable}')`
2137
- );
2138
- } else {
2139
- conditions.push(`fk.TABLE_NAME = '${escaped}'`);
2140
- conditions.push(`pk.TABLE_NAME = '${escaped}'`);
2141
- }
2142
- }
2143
- return `AND (${conditions.join(" OR ")})`;
2144
- }
2145
- async #runIntrospectionQuery(sql) {
2146
- const result = await this.#options.execute(sql);
2147
- if (Array.isArray(result)) {
2148
- return result;
2149
- }
2150
- if (result && typeof result === "object") {
2151
- if ("rows" in result && Array.isArray(result.rows)) {
2152
- return result.rows;
2153
- }
2154
- if ("recordset" in result && Array.isArray(result.recordset)) {
2155
- return result.recordset;
2156
- }
2157
- if ("recordsets" in result && Array.isArray(result.recordsets) && Array.isArray(result.recordsets[0])) {
2158
- return result.recordsets[0];
2159
- }
2160
- }
2161
- throw new Error(
2162
- "SqlServer adapter execute() must return an array of rows or an object with rows/recordset properties when introspecting."
2163
- );
2164
- }
2165
- #quoteIdentifier(name) {
2166
- return `[${name.replace(/]/g, "]]")}]`;
2167
- }
2168
- #formatQualifiedTableName(table2) {
2169
- if (table2.schema && table2.rawName) {
2170
- return `${this.#quoteIdentifier(table2.schema)}.${this.#quoteIdentifier(table2.rawName)}`;
2171
- }
2172
- if (table2.name.includes(".")) {
2173
- const [schemaPart, ...rest] = table2.name.split(".");
2174
- const tablePart = rest.join(".") || schemaPart;
2175
- if (rest.length === 0) {
2176
- return this.#quoteIdentifier(schemaPart);
2177
- }
2178
- return `${this.#quoteIdentifier(schemaPart)}.${this.#quoteIdentifier(tablePart)}`;
2179
- }
2180
- return this.#quoteIdentifier(table2.name);
2181
- }
2182
- #toNumber(value) {
2183
- if (typeof value === "number" && Number.isFinite(value)) {
2184
- return value;
2185
- }
2186
- if (typeof value === "bigint") {
2187
- return Number(value);
2188
- }
2189
- if (typeof value === "string" && value.trim() !== "") {
2190
- const parsed = Number(value);
2191
- return Number.isFinite(parsed) ? parsed : null;
2192
- }
2193
- return null;
2194
- }
2195
- #classifyRowCount(count) {
2196
- if (count < 100) {
2197
- return "tiny";
2198
- }
2199
- if (count < 1e3) {
2200
- return "small";
2201
- }
2202
- if (count < 1e4) {
2203
- return "medium";
2204
- }
2205
- if (count < 1e5) {
2206
- return "large";
2207
- }
2208
- return "huge";
2209
- }
2210
- #shouldCollectStats(type) {
2211
- if (!type) {
2212
- return false;
2213
- }
2214
- const normalized = type.toLowerCase();
2215
- return /int|numeric|decimal|float|real|money|date|time|timestamp|bool/.test(
2216
- normalized
2217
- );
2218
- }
2219
- #normalizeValue(value) {
2220
- if (value === null || value === void 0) {
2221
- return null;
2222
- }
2223
- if (typeof value === "string") {
2224
- return value;
2225
- }
2226
- if (typeof value === "number" || typeof value === "bigint") {
2227
- return String(value);
2228
- }
2229
- if (typeof value === "boolean") {
2230
- return value ? "true" : "false";
2231
- }
2232
- if (value instanceof Date) {
2233
- return value.toISOString();
2234
- }
2235
- if (typeof Buffer !== "undefined" && Buffer.isBuffer(value)) {
2236
- return value.toString("utf-8");
2237
- }
2238
- return null;
1954
+ get schemas() {
1955
+ return this.#options.schemas;
1956
+ }
1957
+ async queryRows(sql) {
1958
+ return this.rowsFrom(await this.#options.execute(sql), [
1959
+ "rows",
1960
+ "recordset",
1961
+ "recordsets.0"
1962
+ ]);
2239
1963
  }
2240
1964
  };
2241
1965
 
2242
1966
  // packages/text2sql/src/lib/adapters/sqlserver/table.sqlserver.grounding.ts
1967
+ import { z as z8 } from "zod";
1968
+
1969
+ // packages/text2sql/src/lib/adapters/sqlserver/sqlserver-rows.ts
1970
+ import { z as z7 } from "zod";
1971
+ var columnRow = z7.object({
1972
+ column_name: z7.string().nullable(),
1973
+ data_type: z7.string().nullable()
1974
+ });
1975
+
1976
+ // packages/text2sql/src/lib/adapters/sqlserver/table.sqlserver.grounding.ts
1977
+ var relationshipRow = z8.object({
1978
+ constraint_name: z8.string().nullable(),
1979
+ table_schema: z8.string().nullable(),
1980
+ table_name: z8.string().nullable(),
1981
+ column_name: z8.string().nullable(),
1982
+ referenced_table_schema: z8.string().nullable(),
1983
+ referenced_table_name: z8.string().nullable(),
1984
+ referenced_column_name: z8.string().nullable()
1985
+ });
2243
1986
  var SqlServerTableGrounding = class extends TableGrounding {
2244
1987
  #adapter;
2245
1988
  #schemas;
2246
1989
  constructor(adapter, config = {}) {
2247
1990
  super(config);
2248
1991
  this.#adapter = adapter;
2249
- this.#schemas = config.schemas;
1992
+ this.#schemas = config.schemas ?? adapter.schemas;
2250
1993
  }
2251
1994
  async getAllTableNames() {
2252
- const rows = await this.#adapter.runQuery(`
1995
+ const rows = await this.#adapter.runQuery(
1996
+ `
2253
1997
  SELECT TABLE_SCHEMA + '.' + TABLE_NAME AS name
2254
1998
  FROM INFORMATION_SCHEMA.TABLES
2255
1999
  WHERE TABLE_TYPE = 'BASE TABLE'
2256
2000
  ${this.#adapter.buildSchemaFilter("TABLE_SCHEMA", this.#schemas)}
2257
2001
  ORDER BY name
2258
- `);
2002
+ `,
2003
+ nameRow
2004
+ );
2259
2005
  return rows.map((r) => r.name);
2260
2006
  }
2261
2007
  async getTable(tableName) {
2262
2008
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
2263
- const columns = await this.#adapter.runQuery(`
2009
+ const columns = await this.#adapter.runQuery(
2010
+ `
2264
2011
  SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type
2265
2012
  FROM INFORMATION_SCHEMA.COLUMNS
2266
2013
  WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
2267
2014
  AND TABLE_NAME = '${this.#adapter.escapeString(table2)}'
2268
2015
  ORDER BY ORDINAL_POSITION
2269
- `);
2016
+ `,
2017
+ columnRow
2018
+ );
2270
2019
  return {
2271
2020
  name: tableName,
2272
2021
  schema,
@@ -2279,7 +2028,8 @@ var SqlServerTableGrounding = class extends TableGrounding {
2279
2028
  }
2280
2029
  async findOutgoingRelations(tableName) {
2281
2030
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
2282
- const rows = await this.#adapter.runQuery(`
2031
+ const rows = await this.#adapter.runQuery(
2032
+ `
2283
2033
  SELECT
2284
2034
  fk.CONSTRAINT_NAME AS constraint_name,
2285
2035
  fk.TABLE_SCHEMA AS table_schema,
@@ -2297,12 +2047,15 @@ var SqlServerTableGrounding = class extends TableGrounding {
2297
2047
  WHERE fk.TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
2298
2048
  AND fk.TABLE_NAME = '${this.#adapter.escapeString(table2)}'
2299
2049
  ORDER BY fk.CONSTRAINT_NAME, fk.ORDINAL_POSITION
2300
- `);
2050
+ `,
2051
+ relationshipRow
2052
+ );
2301
2053
  return this.#groupRelationships(rows);
2302
2054
  }
2303
2055
  async findIncomingRelations(tableName) {
2304
2056
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
2305
- const rows = await this.#adapter.runQuery(`
2057
+ const rows = await this.#adapter.runQuery(
2058
+ `
2306
2059
  SELECT
2307
2060
  fk.CONSTRAINT_NAME AS constraint_name,
2308
2061
  fk.TABLE_SCHEMA AS table_schema,
@@ -2320,7 +2073,9 @@ var SqlServerTableGrounding = class extends TableGrounding {
2320
2073
  WHERE pk.TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
2321
2074
  AND pk.TABLE_NAME = '${this.#adapter.escapeString(table2)}'
2322
2075
  ORDER BY fk.CONSTRAINT_NAME, fk.ORDINAL_POSITION
2323
- `);
2076
+ `,
2077
+ relationshipRow
2078
+ );
2324
2079
  return this.#groupRelationships(rows);
2325
2080
  }
2326
2081
  #groupRelationships(rows) {
@@ -2409,39 +2164,48 @@ var SqlServerViewGrounding = class extends ViewGrounding {
2409
2164
  constructor(adapter, config = {}) {
2410
2165
  super(config);
2411
2166
  this.#adapter = adapter;
2412
- this.#schemas = config.schemas;
2167
+ this.#schemas = config.schemas ?? adapter.schemas;
2413
2168
  }
2414
2169
  async getAllViewNames() {
2415
- const rows = await this.#adapter.runQuery(`
2170
+ const rows = await this.#adapter.runQuery(
2171
+ `
2416
2172
  SELECT TABLE_SCHEMA + '.' + TABLE_NAME AS name
2417
2173
  FROM INFORMATION_SCHEMA.VIEWS
2418
2174
  WHERE 1=1
2419
2175
  ${this.#adapter.buildSchemaFilter("TABLE_SCHEMA", this.#schemas)}
2420
2176
  ORDER BY name
2421
- `);
2177
+ `,
2178
+ nameRow
2179
+ );
2422
2180
  return rows.map((r) => r.name);
2423
2181
  }
2424
2182
  async getView(viewName) {
2425
2183
  const { schema, table: view2 } = this.#adapter.parseTableName(viewName);
2426
2184
  let definition;
2427
2185
  if (this.includeDefinition) {
2428
- const defRows = await this.#adapter.runQuery(`
2186
+ const defRows = await this.#adapter.runQuery(
2187
+ `
2429
2188
  SELECT m.definition
2430
2189
  FROM sys.views v
2431
2190
  JOIN sys.schemas s ON v.schema_id = s.schema_id
2432
2191
  JOIN sys.sql_modules m ON v.object_id = m.object_id
2433
2192
  WHERE s.name = '${this.#adapter.escapeString(schema)}'
2434
2193
  AND v.name = '${this.#adapter.escapeString(view2)}'
2435
- `);
2194
+ `,
2195
+ viewDefinitionRow
2196
+ );
2436
2197
  definition = defRows[0]?.definition ?? void 0;
2437
2198
  }
2438
- const columns = await this.#adapter.runQuery(`
2199
+ const columns = await this.#adapter.runQuery(
2200
+ `
2439
2201
  SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type
2440
2202
  FROM INFORMATION_SCHEMA.COLUMNS
2441
2203
  WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
2442
2204
  AND TABLE_NAME = '${this.#adapter.escapeString(view2)}'
2443
2205
  ORDER BY ORDINAL_POSITION
2444
- `);
2206
+ `,
2207
+ columnRow
2208
+ );
2445
2209
  return {
2446
2210
  name: viewName,
2447
2211
  schema,
@@ -2457,15 +2221,19 @@ var SqlServerViewGrounding = class extends ViewGrounding {
2457
2221
 
2458
2222
  // packages/text2sql/src/lib/adapters/sqlserver/index.ts
2459
2223
  function tables(config = {}) {
2460
- return (adapter) => new SqlServerTableGrounding(adapter, config);
2224
+ return groundingFor(
2225
+ SqlServer,
2226
+ (adapter) => new SqlServerTableGrounding(adapter, config)
2227
+ );
2461
2228
  }
2462
2229
  function info(config = {}) {
2463
2230
  return (adapter) => new SqlServerInfoGrounding(adapter, config);
2464
2231
  }
2465
2232
  function views(config = {}) {
2466
- return (adapter) => {
2467
- return new SqlServerViewGrounding(adapter, config);
2468
- };
2233
+ return groundingFor(
2234
+ SqlServer,
2235
+ (adapter) => new SqlServerViewGrounding(adapter, config)
2236
+ );
2469
2237
  }
2470
2238
  function columnStats(config = {}) {
2471
2239
  return (adapter) => {