@checkdigit/eslint-plugin 7.18.0-PR.143-c73c → 7.18.0-PR.143-a26e

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.
@@ -18,7 +18,8 @@ import {
18
18
  isBaseFrom,
19
19
  isJoin,
20
20
  isTableExpr,
21
- isUnnestFrom
21
+ isUnnestFrom,
22
+ isValuesFrom
22
23
  } from "./visitor.mjs";
23
24
  var SYNTEXT_ERROR = "SyntextError";
24
25
  var ATHENA_ERROR = "AthenaError";
@@ -40,6 +41,7 @@ function offsetToLoc(text, offset) {
40
41
  return { line: lines.length, column: lines[lines.length - 1]?.length ?? 0 };
41
42
  }
42
43
  var log = debug("eslint-plugin:athena");
44
+ var ANONYMOUS_TABLE = "<anonymous>";
43
45
  function resolvedCol(name, schema, ast) {
44
46
  return ast !== void 0 ? { name, schema, ast } : { name, schema };
45
47
  }
@@ -52,6 +54,9 @@ function getApiSchemas(serviceName, ctx) {
52
54
  return schemas;
53
55
  }
54
56
  function lookupTables(nameOrAlias, ctx) {
57
+ if (ctx.tables.has(nameOrAlias)) {
58
+ return ctx.tables.get(nameOrAlias) ?? [];
59
+ }
55
60
  const canonical = ctx.aliases.get(nameOrAlias) ?? nameOrAlias;
56
61
  return ctx.tables.get(canonical) ?? [];
57
62
  }
@@ -64,15 +69,16 @@ function fromClauseItems(select) {
64
69
  }
65
70
  return [];
66
71
  }
67
- function resolveServiceTable(select, item, ctx) {
72
+ function resolveServiceTable(select, item, ctx, storageKey) {
68
73
  const { table: tableName } = item;
74
+ const key = storageKey ?? tableName;
69
75
  try {
70
76
  const apiSchemas = getApiSchemas(tableName, ctx);
71
77
  if (apiSchemas.length === 0) {
72
78
  throw new AthenaError(ATHENA_ERROR, `service not found: "${tableName}" (no swagger schema located)`, item);
73
79
  }
74
80
  const operations = matchApi(select, item, apiSchemas) ?? [];
75
- ctx.tables.set(tableName, buildServiceTables(tableName, operations));
81
+ ctx.tables.set(key, buildServiceTables(tableName, operations));
76
82
  } catch (error) {
77
83
  if (error instanceof AthenaError) {
78
84
  throw error;
@@ -80,52 +86,80 @@ function resolveServiceTable(select, item, ctx) {
80
86
  throw new AthenaError(ATHENA_ERROR, error instanceof Error ? error.message : String(error), item);
81
87
  }
82
88
  }
83
- function restrictToFromClause(select, ctx) {
84
- const fromNames = /* @__PURE__ */ new Set();
85
- for (const item of fromClauseItems(select)) {
86
- if (isBaseFrom(item) || isJoin(item)) {
87
- fromNames.add(item.table);
88
- } else if (isTableExpr(item)) {
89
- fromNames.add(typeof item.as === "string" ? item.as : "<subquery>");
90
- }
89
+ function getFunctionAliasName(as) {
90
+ return as?.name.name[0]?.value;
91
+ }
92
+ function isStandaloneUnnest(node) {
93
+ return isUnnestFrom(node) && typeof node.expr.column !== "string";
94
+ }
95
+ function fromItemTableNames(item) {
96
+ if (isBaseFrom(item) || isJoin(item)) {
97
+ return item.as !== null ? [item.as, item.table] : [item.table];
98
+ }
99
+ if (isTableExpr(item)) {
100
+ return [typeof item.as === "string" ? item.as : "<subquery>"];
91
101
  }
102
+ if (isValuesFrom(item)) {
103
+ const alias = getFunctionAliasName(item.as);
104
+ return alias !== void 0 ? [alias] : [];
105
+ }
106
+ const unknownItem = item;
107
+ if (isStandaloneUnnest(unknownItem)) {
108
+ const alias = getFunctionAliasName(unknownItem.as);
109
+ return alias !== void 0 ? [alias] : [];
110
+ }
111
+ return [];
112
+ }
113
+ function restrictToFromClause(select, ctx) {
114
+ const fromNames = new Set(fromClauseItems(select).flatMap(fromItemTableNames));
92
115
  for (const name of [...ctx.tables.keys()]) {
93
116
  if (!fromNames.has(name)) {
94
117
  ctx.tables.delete(name);
95
118
  }
96
119
  }
97
120
  }
121
+ function tableIsResolved(tableName, storageKey, ctx) {
122
+ return ctx.tables.has(storageKey) || ctx.tables.has(tableName);
123
+ }
124
+ function resolveTableOrJoinItem(select, item, ctx) {
125
+ const { table: tableName, as: alias } = item;
126
+ if (alias !== null) {
127
+ ctx.aliases.set(alias, tableName);
128
+ }
129
+ const storageKey = alias ?? tableName;
130
+ if (!tableIsResolved(tableName, storageKey, ctx)) {
131
+ resolveServiceTable(select, item, ctx, alias ?? void 0);
132
+ }
133
+ }
98
134
  function resolveFromClause(select, ctx) {
99
135
  for (const item of fromClauseItems(select)) {
100
- if (isUnnestFrom(item)) {
101
- continue;
102
- }
103
- if (isTableExpr(item)) {
104
- const alias2 = typeof item.as === "string" ? item.as : "<subquery>";
105
- checkSelect(item.expr.ast, ctx, alias2);
106
- continue;
107
- }
108
- if (isJoin(item)) {
109
- const { table: tableName2, as: alias2 } = item;
110
- if (alias2 !== null) {
111
- ctx.aliases.set(alias2, tableName2);
136
+ const unknownItem = item;
137
+ if (isStandaloneUnnest(unknownItem)) {
138
+ const tableAlias = getFunctionAliasName(unknownItem.as);
139
+ if (tableAlias !== void 0) {
140
+ const columns = new Map(
141
+ (unknownItem.as?.args.value ?? []).map((columnRef) => {
142
+ const colName = columnRef.column;
143
+ return [colName, [resolvedCol(colName, {})]];
144
+ })
145
+ );
146
+ ctx.tables.set(tableAlias, [{ name: tableAlias, columns }]);
112
147
  }
113
- if (!ctx.tables.has(tableName2)) {
114
- resolveServiceTable(select, item, ctx);
148
+ } else if (isUnnestFrom(unknownItem)) {
149
+ } else if (isValuesFrom(item)) {
150
+ const tableAlias = getFunctionAliasName(item.as);
151
+ if (tableAlias !== void 0) {
152
+ const columns = new Map(
153
+ item.as.args.value.map((columnRef) => [columnRef.column, [resolvedCol(columnRef.column, {})]])
154
+ );
155
+ ctx.tables.set(tableAlias, [{ name: tableAlias, columns }]);
115
156
  }
116
- continue;
117
- }
118
- if (!isBaseFrom(item)) {
119
- continue;
120
- }
121
- const { table: tableName, as: alias } = item;
122
- if (alias !== null) {
123
- ctx.aliases.set(alias, tableName);
124
- }
125
- if (ctx.tables.has(tableName)) {
126
- continue;
157
+ } else if (isTableExpr(item)) {
158
+ const alias = typeof item.as === "string" ? item.as : "<subquery>";
159
+ checkSelect(item.expr.ast, ctx, alias);
160
+ } else if (isJoin(item) || isBaseFrom(item)) {
161
+ resolveTableOrJoinItem(select, item, ctx);
127
162
  }
128
- resolveServiceTable(select, item, ctx);
129
163
  }
130
164
  }
131
165
  function extractUnnestMappings(select) {
@@ -135,7 +169,9 @@ function extractUnnestMappings(select) {
135
169
  continue;
136
170
  }
137
171
  const fromColumn = typeof item.expr.column === "string" ? item.expr.column : void 0;
138
- assert.ok(fromColumn !== void 0, "UNNEST expr must be a column_ref with a string column name");
172
+ if (fromColumn === void 0) {
173
+ continue;
174
+ }
139
175
  const aliasArgs = item.as?.args.value ?? [];
140
176
  const toColumns = [];
141
177
  for (const col of aliasArgs) {
@@ -158,7 +194,7 @@ function applyUnnestPre(mappings, ctx) {
158
194
  }
159
195
  const sourceColumns = ownerTable.columns.get(fromColumn) ?? [];
160
196
  const sourceSchema = sourceColumns[0]?.schema;
161
- const unnestTableName = `${ownerTable.name ?? "<anonymous>"}:<unnested>`;
197
+ const unnestTableName = `${ownerTable.name ?? ANONYMOUS_TABLE}:<unnested>`;
162
198
  const apiOperation = ownerTable.apiOperation !== void 0 ? { apiOperation: ownerTable.apiOperation } : {};
163
199
  if (sourceSchema?.type === "array") {
164
200
  const [toColumn] = toColumns;
@@ -286,7 +322,7 @@ function lookupColumnOrThrow(colRef, ref, referencedTables) {
286
322
  const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
287
323
  if (resolvedColumns.length === 0) {
288
324
  const tableNames = [
289
- ...new Set(referencedTables.map((referenceTable) => referenceTable.name ?? "<anonymous>"))
325
+ ...new Set(referencedTables.map((referenceTable) => referenceTable.name ?? ANONYMOUS_TABLE))
290
326
  ].join(", ");
291
327
  const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(", ");
292
328
  throw new AthenaError(
@@ -341,10 +377,9 @@ function resolveSingleColumnRef(columnAST, columnAlias, indexedName, ref, allTab
341
377
  assert.ok(colRef !== void 0, "column_ref must have a string column name");
342
378
  const referencedTables = tableRef !== void 0 ? lookupTables(tableRef, ctx) : allTables;
343
379
  if (referencedTables.length === 0) {
344
- const tableNames = [...ctx.tables.keys()].join(", ");
345
380
  throw new AthenaError(
346
381
  ATHENA_ERROR,
347
- `unknown table or alias '${tableRef ?? colRef}'; known tables: ${tableNames}`,
382
+ `unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(", ")}`,
348
383
  ref
349
384
  );
350
385
  }
@@ -477,4 +512,4 @@ export {
477
512
  checkAthenaAst,
478
513
  offsetToLoc
479
514
  };
480
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92YWxpZGF0ZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFVQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxPQUFPLFdBQVc7QUFDbEIsU0FBUyxnQkFBZ0I7QUFJekIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUywwQkFBc0Y7QUFDL0YsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRUEsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxlQUFlO0FBRXJCLElBQU0sY0FBTixjQUEwQixNQUFNO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDUCxZQUFZLE1BQWMsU0FBaUIsS0FBYztBQUN2RCxVQUFNLE9BQU87QUFDYixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFDWixRQUFJLFFBQVEsUUFBVztBQUNyQixXQUFLLE1BQU07QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGO0FBR08sU0FBUyxZQUFZLE1BQWMsUUFBa0Q7QUFDMUYsUUFBTSxTQUFTLEtBQUssTUFBTSxHQUFHLE1BQU07QUFDbkMsUUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJO0FBQy9CLFNBQU8sRUFBRSxNQUFNLE1BQU0sUUFBUSxRQUFRLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FBRyxVQUFVLEVBQUU7QUFDNUU7QUFFQSxJQUFNLE1BQU0sTUFBTSxzQkFBc0I7QUFNeEMsU0FBUyxZQUFZLE1BQWMsUUFBc0IsS0FBOEI7QUFDckYsU0FBTyxRQUFRLFNBQVksRUFBRSxNQUFNLFFBQVEsSUFBSSxJQUFJLEVBQUUsTUFBTSxPQUFPO0FBQ3BFO0FBRUEsU0FBUyxjQUFjLGFBQXFCLEtBQW1CO0FBQzdELE1BQUksVUFB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QVM7QUFDdkQsb0NBQWdDLE9BQU8sT0FBTyxXQUFXLFNBQVM7QUFBQSxFQUNwRTtBQUNBLE1BQUksT0FBTyxXQUFXLE1BQU07QUFDMUIseUJBQXFCLE9BQU8sUUFBUSxXQUFXLFdBQVcsT0FBTztBQUNqRSxvQ0FBZ0MsT0FBTyxRQUFRLFdBQVcsU0FBUztBQUFBLEVBQ3JFO0FBQ0EsYUFBVyxhQUFhLE9BQU8sV0FBVyxDQUFDLEdBQUc7QUFDNUMseUJBQXFCLFVBQVUsTUFBTSxXQUFXLFdBQVcsT0FBTztBQUNsRSxvQ0FBZ0MsVUFBVSxNQUFNLFdBQVcsU0FBUztBQUFBLEVBQ3RFO0FBQ0EsTUFBSSxPQUFPLFNBQVMsWUFBWSxRQUFXO0FBQ3pDLGVBQVcsWUFBWSxPQUFPLFFBQVEsU0FBUztBQUM3QywyQkFBcUIsVUFBVSxXQUFXLFdBQVcsT0FBTztBQUM1RCxzQ0FBZ0MsVUFBVSxXQUFXLFNBQVM7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sVUFBVSxRQUFXO0FBQzlCLFVBQU0sY0FBYyxZQUFZLE9BQU8sT0FBTyxLQUFLLGFBQWE7QUFDaEUsVUFBTSxzQkFBc0IsUUFBUTtBQUNwQyxVQUFNLG1CQUFtQixZQUFZO0FBQ3JDLFFBQUksd0JBQXdCLGtCQUFrQjtBQUM1QyxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFDQSxxREFBcUQsb0JBQW9CLFNBQVMsQ0FBQyxPQUFPLGlCQUFpQixTQUFTLENBQUM7QUFBQSxRQUNySCxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxrQkFBa0IsUUFBVztBQUMvQixVQUFNLGdCQUErQixFQUFFLE1BQU0sZUFBZSxRQUFRO0FBQ3BFLFFBQUksT0FBTyxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUM7QUFBQSxFQUMvQztBQUVBLFNBQU87QUFDVDtBQUVPLFNBQVMsZUFBZSxLQUFVLEtBQXlCO0FBQ2hFLFNBQU8sR0FBRyxJQUFJLFNBQVMsUUFBUTtBQUMvQixRQUFNLFNBQVM7QUFFZixNQUFJLE9BQU8sU0FBUyxNQUFNO0FBQ3hCLGVBQVcsWUFBWSxPQUFPLE1BQU07QUFDbEMsa0JBQVksU0FBUyxLQUFLLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSztBQUFBLElBQ3pEO0FBQ0EsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFFQSxjQUFZLFFBQVEsR0FBRztBQUN6QjsiLAogICJuYW1lcyI6IFsiYWxpYXMiLCAidGFibGVOYW1lIl0KfQo=
515
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92YWxpZGF0ZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFVQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxPQUFPLFdBQVc7QUFDbEIsU0FBUyxnQkFBZ0I7QUFJekIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUywwQkFBc0Y7QUFDL0YsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FFSztBQUVBLElBQU0sZ0JBQWdCO0FBQ3RCLElBQU0sZUFBZTtBQUVyQixJQUFNLGNBQU4sY0FBMEIsTUFBTTtBQUFBLEVBQzlCO0FBQUEsRUFDQTtBQUFBLEVBQ1AsWUFBWSxNQUFjLFNBQWlCLEtBQWM7QUFDdkQsVUFBTSxPQUFPO0FBQ2IsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0FBQ1osUUFBSSxRQUFRLFFBQVc7QUFDckIsV0FBSyxNQUFNO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDRjtBQUdPLFNBQVMsWUFBWSxNQUFjLFFBQWtEO0FBQzFGLFFBQU0sU0FBUyxLQUFLLE1BQU0sR0FBRyxNQUFNO0FBQ25DLFFBQU0sUUFBUSxPQUFPLE1BQU0sSUFBSTtBQUMvQixTQUFPLEVBQUUsTUFBTSxNQUFNLFFBQVEsUUFBUSxNQUFNLE1BQU0sU0FBUyxDQUFDLEdBQUcsVUFBVSxFQUFFO0FBQzVFO0FBRUEsSUFBTSxNQUFNLE1BQU0sc0JBQXNCO0FBQ3hDLElBQU0sa0JBQWtCO0FBTXhCLFNBQVMsWUFBWSxNQUFjLFFBQXNCLEtBQThCO0FBQ3JGLFNBQU8sUUFBUSxTQUFZLEVBQUUsTUFBTSxRQUFRLElBQUksSUFBSSxFQUFFLE1BQU0sT0FBTztBQUNwRTtBQUVBLFNBQVMsY0FB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
@@ -7,6 +7,13 @@ function isUnnestFrom(node) {
7
7
  function isDual(node) {
8
8
  return typeof node === "object" && node !== null && node.type === "dual";
9
9
  }
10
+ function isValuesFrom(node) {
11
+ if (typeof node !== "object" || node === null) {
12
+ return false;
13
+ }
14
+ const expr = node.expr;
15
+ return typeof expr === "object" && expr !== null && expr.type === "values";
16
+ }
10
17
  function isTableExpr(node) {
11
18
  if (typeof node !== "object" || node === null) {
12
19
  return false;
@@ -122,6 +129,9 @@ function walkFrom(node, visitor) {
122
129
  }
123
130
  return;
124
131
  }
132
+ if (isValuesFrom(node)) {
133
+ return;
134
+ }
125
135
  visitor.visitBaseFrom?.(node);
126
136
  }
127
137
  function walk(node, visitor) {
@@ -295,6 +305,7 @@ export {
295
305
  isJoin,
296
306
  isTableExpr,
297
307
  isUnnestFrom,
308
+ isValuesFrom,
298
309
  walk
299
310
  };
300
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFpRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLFlBQVksTUFBa0M7QUFDNUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsU0FBUztBQUMvRDtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxVQUFVO0FBRWQ7QUFFTyxTQUFTLFdBQVcsTUFBaUM7QUFDMUQsU0FDRSxDQUFDLGFBQWEsSUFBSSxLQUNsQixDQUFDLE9BQU8sSUFBSSxLQUNaLENBQUMsWUFBWSxJQUFJLEtBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQ1osT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxXQUFXO0FBRWY7QUFFTyxTQUFTLGNBQWMsTUFBaUQ7QUFDN0UsUUFBTSxRQUFRO0FBQ2QsU0FBTyxNQUFNLFFBQVEsTUFBTSxXQUFXLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFDeEU7QUFPQSxTQUFTLFNBQVMsTUFBZSxTQUEyQjtBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxVQUFRLE1BQU0s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
311
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFvRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLGFBQWEsTUFBbUM7QUFDOUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVMsS0FBNEIsU0FBUztBQUM1RjtBQUVPLFNBQVMsWUFBWSxNQUFrQztBQUM1RCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sT0FBUSxLQUE0QjtBQUMxQyxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUSxTQUFTO0FBQy9EO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQ0UsQ0FBQyxhQUFhLElBQUksS0FDbEIsQ0FBQyxPQUFPLElBQUksS0FDWixDQUFDLFlBQVksSUFBSSxLQUNqQixPQUFPLFNBQVMsWUFDaEIsU0FBUyxRQUNULFVBQVU7QUFFZDtBQUVPLFNBQVMsV0FBVyxNQUFpQztBQUMxRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsQ0FBQyxPQUFPLElBQUksS0FDWixPQUFPLFNBQVMsWUFDaEIsU0FBUyxRQUNULFdBQVc7QUFFZjtBQUVPLFNBQVMsY0FBYyxNQUFpRDtBQUM3RSxRQUFNLFFBQVE7QUFDZCxTQUFPLE1B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
@@ -60,7 +60,26 @@ export interface Dual {
60
60
  type: 'dual';
61
61
  loc?: LocationRange;
62
62
  }
63
- export type From = BaseFrom | Join | TableExpr | Dual;
63
+ export interface ValuesFrom {
64
+ expr: {
65
+ type: 'values';
66
+ };
67
+ as: {
68
+ type: 'function';
69
+ name: {
70
+ name: {
71
+ value: string;
72
+ }[];
73
+ };
74
+ args: {
75
+ type: 'expr_list';
76
+ value: {
77
+ column: string;
78
+ }[];
79
+ };
80
+ };
81
+ }
82
+ export type From = BaseFrom | Join | TableExpr | ValuesFrom | Dual;
64
83
  export interface LimitValue {
65
84
  type: string;
66
85
  value: number;
@@ -1,7 +1,9 @@
1
- import type { AggrFunc, BaseFrom, Binary, Case, Cast, Column, ColumnRefItem, Dual, ExpressionValue, ExprList, Function, Join, Select, TableExpr, With } from './types';
1
+ import type { AggrFunc, BaseFrom, Binary, Case, Cast, Column, ColumnRefItem, Dual, ExpressionValue, ExprList, Function, Join, Select, TableExpr, ValuesFrom, With } from './types';
2
2
  export interface UnnestFrom {
3
3
  type: 'unnest';
4
- expr: ColumnRefItem;
4
+ expr: ColumnRefItem | {
5
+ type: string;
6
+ };
5
7
  parentheses: boolean;
6
8
  as: {
7
9
  type: 'function';
@@ -42,6 +44,7 @@ export interface VisitorMap {
42
44
  }
43
45
  export declare function isUnnestFrom(node: unknown): node is UnnestFrom;
44
46
  export declare function isDual(node: unknown): node is Dual;
47
+ export declare function isValuesFrom(node: unknown): node is ValuesFrom;
45
48
  export declare function isTableExpr(node: unknown): node is TableExpr;
46
49
  export declare function isJoin(node: unknown): node is Join;
47
50
  export declare function isBaseFrom(node: unknown): node is BaseFrom;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-c73c","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","peggy":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format es --output \"${file%.peggy}-peggy.ts\"; done","peggy-watch":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format=es --watch --output=\"${file%.peggy}-peggy.ts\"; done","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@apidevtools/json-schema-ref-parser":"^15.3.5","@typescript-eslint/type-utils":"^8.60.1","@typescript-eslint/utils":"^8.60.1","ajv":"^8.20.0","debug":"^4.4.3","glob":"^13.0.6","http-status-codes":"^2.3.0","js-yaml":"^4.2.0","json-pointer":"^0.6.2","jsonpath-plus":"^10.4.0","ts-api-utils":"^2.5.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"10.0.0","@eslint/js":"^9.37.0","@types/debug":"^4.1.13","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@types/js-yaml":"^4.0.9","@types/json-pointer":"^1.0.34","@typescript-eslint/parser":"^8.60.1","@typescript-eslint/rule-tester":"^8.60.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.4.0","eslint-plugin-no-secrets":"^2.3.3","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"^1.0.4","openapi-types":"^12.1.3","peggy":"^4.2.0","rimraf":"^6.1.3","typescript-eslint":"^8.60.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=24.14.1"},"service":{"api":{"root":"src","endpoints":["api/v1"]}}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"7.18.0-PR.143-a26e","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","peggy":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format es --output \"${file%.peggy}-peggy.ts\"; done","peggy-watch":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format=es --watch --output=\"${file%.peggy}-peggy.ts\"; done","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@apidevtools/json-schema-ref-parser":"^15.3.5","@typescript-eslint/type-utils":"^8.60.1","@typescript-eslint/utils":"^8.60.1","ajv":"^8.20.0","debug":"^4.4.3","glob":"^13.0.6","http-status-codes":"^2.3.0","js-yaml":"^4.2.0","json-pointer":"^0.6.2","jsonpath-plus":"^10.4.0","ts-api-utils":"^2.5.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"10.0.0","@eslint/js":"^9.37.0","@types/debug":"^4.1.13","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@types/js-yaml":"^4.0.9","@types/json-pointer":"^1.0.34","@typescript-eslint/parser":"^8.60.1","@typescript-eslint/rule-tester":"^8.60.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.4.0","eslint-plugin-no-secrets":"^2.3.3","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"^1.0.4","openapi-types":"^12.1.3","peggy":"^4.2.0","rimraf":"^6.1.3","typescript-eslint":"^8.60.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=24.14.1"},"service":{"api":{"root":"src","endpoints":["api/v1"]}}}
@@ -67,7 +67,16 @@ export interface Dual {
67
67
  type: 'dual';
68
68
  loc?: LocationRange;
69
69
  }
70
- export type From = BaseFrom | Join | TableExpr | Dual;
70
+ // Represents: (VALUES (...), ...) alias(col1, col2, ...)
71
+ export interface ValuesFrom {
72
+ expr: { type: 'values' };
73
+ as: {
74
+ type: 'function';
75
+ name: { name: { value: string }[] };
76
+ args: { type: 'expr_list'; value: { column: string }[] };
77
+ };
78
+ }
79
+ export type From = BaseFrom | Join | TableExpr | ValuesFrom | Dual;
71
80
  export interface LimitValue {
72
81
  type: string;
73
82
  value: number;
@@ -32,6 +32,8 @@ import {
32
32
  isJoin,
33
33
  isTableExpr,
34
34
  isUnnestFrom,
35
+ isValuesFrom,
36
+ type UnnestFrom,
35
37
  } from './visitor.ts';
36
38
 
37
39
  export const SYNTEXT_ERROR = 'SyntextError';
@@ -58,6 +60,7 @@ export function offsetToLoc(text: string, offset: number): { line: number; colum
58
60
  }
59
61
 
60
62
  const log = debug('eslint-plugin:athena');
63
+ const ANONYMOUS_TABLE = '<anonymous>';
61
64
 
62
65
  // ---------------------------------------------------------------------------
63
66
  // Helpers
@@ -77,6 +80,10 @@ function getApiSchemas(serviceName: string, ctx: VisitContext) {
77
80
  }
78
81
 
79
82
  function lookupTables(nameOrAlias: string, ctx: VisitContext): ResolvedTable[] {
83
+ // Direct hit first: aliases are now stored under their alias key in ctx.tables.
84
+ if (ctx.tables.has(nameOrAlias)) {
85
+ return ctx.tables.get(nameOrAlias) ?? [];
86
+ }
80
87
  const canonical = ctx.aliases.get(nameOrAlias) ?? nameOrAlias;
81
88
  return ctx.tables.get(canonical) ?? [];
82
89
  }
@@ -95,15 +102,18 @@ function fromClauseItems(select: Select): From[] {
95
102
  // Pass 1 — Resolve FROM clause: service tables → ctx.tables + ctx.aliases
96
103
  // ---------------------------------------------------------------------------
97
104
 
98
- function resolveServiceTable(select: Select, item: BaseFrom, ctx: VisitContext): void {
105
+ function resolveServiceTable(select: Select, item: BaseFrom, ctx: VisitContext, storageKey?: string): void {
99
106
  const { table: tableName } = item;
107
+ const key = storageKey ?? tableName;
100
108
  try {
101
109
  const apiSchemas = getApiSchemas(tableName, ctx);
102
110
  if (apiSchemas.length === 0) {
103
111
  throw new AthenaError(ATHENA_ERROR, `service not found: "${tableName}" (no swagger schema located)`, item);
104
112
  }
105
113
  const operations = matchApi(select, item, apiSchemas) ?? [];
106
- ctx.tables.set(tableName, buildServiceTables(tableName, operations));
114
+ // Always use the canonical table name for ResolvedTable.name so that error messages
115
+ // ("in tables: …") show the service name, not the alias.
116
+ ctx.tables.set(key, buildServiceTables(tableName, operations));
107
117
  } catch (error) {
108
118
  if (error instanceof AthenaError) {
109
119
  throw error;
@@ -112,15 +122,41 @@ function resolveServiceTable(select: Select, item: BaseFrom, ctx: VisitContext):
112
122
  }
113
123
  }
114
124
 
115
- function restrictToFromClause(select: Select, ctx: VisitContext): void {
116
- const fromNames = new Set<string>();
117
- for (const item of fromClauseItems(select)) {
118
- if (isBaseFrom(item) || isJoin(item)) {
119
- fromNames.add(item.table);
120
- } else if (isTableExpr(item)) {
121
- fromNames.add(typeof item.as === 'string' ? item.as : '<subquery>');
122
- }
125
+ // Returns the alias name for a ValuesFrom or a standalone UnnestFrom (UNNEST(fn(...))).
126
+ function getFunctionAliasName(as: { name: { name: { value: string }[] } } | null): string | undefined {
127
+ return as?.name.name[0]?.value;
128
+ }
129
+
130
+ // UNNEST whose argument is a function call (e.g. SEQUENCE), not a column reference.
131
+ function isStandaloneUnnest(node: unknown): node is UnnestFrom {
132
+ return isUnnestFrom(node) && typeof (node.expr as { column?: unknown }).column !== 'string';
133
+ }
134
+
135
+ // Returns every name under which this FROM item can be stored in ctx.tables.
136
+ // Both the alias key and the canonical table name are returned so that service
137
+ // tables (stored under alias) and CTEs (stored under canonical name) both survive
138
+ // the prune in restrictToFromClause.
139
+ function fromItemTableNames(item: From): string[] {
140
+ if (isBaseFrom(item) || isJoin(item)) {
141
+ return item.as !== null ? [item.as, item.table] : [item.table];
142
+ }
143
+ if (isTableExpr(item)) {
144
+ return [typeof item.as === 'string' ? item.as : '<subquery>'];
145
+ }
146
+ if (isValuesFrom(item)) {
147
+ const alias = getFunctionAliasName(item.as);
148
+ return alias !== undefined ? [alias] : [];
149
+ }
150
+ const unknownItem = item as unknown;
151
+ if (isStandaloneUnnest(unknownItem)) {
152
+ const alias = getFunctionAliasName(unknownItem.as);
153
+ return alias !== undefined ? [alias] : [];
123
154
  }
155
+ return [];
156
+ }
157
+
158
+ function restrictToFromClause(select: Select, ctx: VisitContext): void {
159
+ const fromNames = new Set(fromClauseItems(select).flatMap(fromItemTableNames));
124
160
  for (const name of [...ctx.tables.keys()]) {
125
161
  if (!fromNames.has(name)) {
126
162
  ctx.tables.delete(name);
@@ -128,45 +164,55 @@ function restrictToFromClause(select: Select, ctx: VisitContext): void {
128
164
  }
129
165
  }
130
166
 
167
+ function tableIsResolved(tableName: string, storageKey: string, ctx: VisitContext): boolean {
168
+ return ctx.tables.has(storageKey) || ctx.tables.has(tableName);
169
+ }
170
+
171
+ // Shared resolution logic for BaseFrom and Join items (Join extends BaseFrom).
172
+ function resolveTableOrJoinItem(select: Select, item: BaseFrom, ctx: VisitContext): void {
173
+ const { table: tableName, as: alias } = item;
174
+ if (alias !== null) {
175
+ ctx.aliases.set(alias, tableName);
176
+ }
177
+ const storageKey = alias ?? tableName;
178
+ // Skip if already resolved: CTE stored under canonical name, or duplicate alias.
179
+ if (!tableIsResolved(tableName, storageKey, ctx)) {
180
+ resolveServiceTable(select, item, ctx, alias ?? undefined);
181
+ }
182
+ }
183
+
131
184
  function resolveFromClause(select: Select, ctx: VisitContext): void {
132
185
  for (const item of fromClauseItems(select)) {
133
- if (isUnnestFrom(item)) {
134
- continue;
135
- }
136
-
137
- if (isTableExpr(item)) {
186
+ const unknownItem = item as unknown;
187
+ if (isStandaloneUnnest(unknownItem)) {
188
+ // Standalone UNNEST(fn()) — register alias with declared column names (schema unknown).
189
+ const tableAlias = getFunctionAliasName(unknownItem.as);
190
+ if (tableAlias !== undefined) {
191
+ const columns = new Map(
192
+ (unknownItem.as?.args.value ?? []).map((columnRef) => {
193
+ const colName = (columnRef as { column: string }).column;
194
+ return [colName, [resolvedCol(colName, {})]];
195
+ }),
196
+ );
197
+ ctx.tables.set(tableAlias, [{ name: tableAlias, columns }]);
198
+ }
199
+ } else if (isUnnestFrom(unknownItem)) {
200
+ // CROSS JOIN UNNEST with a column ref — handled later by extractUnnestMappings.
201
+ } else if (isValuesFrom(item)) {
202
+ const tableAlias = getFunctionAliasName(item.as);
203
+ if (tableAlias !== undefined) {
204
+ const columns = new Map(
205
+ item.as.args.value.map((columnRef) => [columnRef.column, [resolvedCol(columnRef.column, {})]]),
206
+ );
207
+ ctx.tables.set(tableAlias, [{ name: tableAlias, columns }]);
208
+ }
209
+ } else if (isTableExpr(item)) {
138
210
  const alias = typeof item.as === 'string' ? item.as : '<subquery>';
139
211
  // eslint-disable-next-line no-use-before-define
140
212
  checkSelect(item.expr.ast, ctx, alias);
141
- continue;
142
- }
143
-
144
- if (isJoin(item)) {
145
- const { table: tableName, as: alias } = item;
146
- if (alias !== null) {
147
- ctx.aliases.set(alias, tableName);
148
- }
149
- if (!ctx.tables.has(tableName)) {
150
- resolveServiceTable(select, item, ctx);
151
- }
152
- continue;
213
+ } else if (isJoin(item) || isBaseFrom(item)) {
214
+ resolveTableOrJoinItem(select, item, ctx);
153
215
  }
154
-
155
- if (!isBaseFrom(item)) {
156
- continue;
157
- }
158
-
159
- const { table: tableName, as: alias } = item;
160
-
161
- if (alias !== null) {
162
- ctx.aliases.set(alias, tableName);
163
- }
164
-
165
- if (ctx.tables.has(tableName)) {
166
- continue;
167
- }
168
-
169
- resolveServiceTable(select, item, ctx);
170
216
  }
171
217
  }
172
218
 
@@ -188,8 +234,14 @@ function extractUnnestMappings(select: Select): UnnestMapping[] {
188
234
  continue;
189
235
  }
190
236
 
191
- const fromColumn = typeof item.expr.column === 'string' ? item.expr.column : undefined;
192
- assert.ok(fromColumn !== undefined, 'UNNEST expr must be a column_ref with a string column name');
237
+ const fromColumn =
238
+ typeof (item.expr as { column?: unknown }).column === 'string'
239
+ ? (item.expr as { column: string }).column
240
+ : undefined;
241
+ if (fromColumn === undefined) {
242
+ // Standalone UNNEST (e.g. UNNEST(SEQUENCE(...))) — registered in resolveFromClause.
243
+ continue;
244
+ }
193
245
 
194
246
  const aliasArgs = item.as?.args.value ?? [];
195
247
  const toColumns: string[] = [];
@@ -219,7 +271,7 @@ function applyUnnestPre(mappings: UnnestMapping[], ctx: VisitContext): UnnestMap
219
271
 
220
272
  const sourceColumns = ownerTable.columns.get(fromColumn) ?? [];
221
273
  const sourceSchema = sourceColumns[0]?.schema;
222
- const unnestTableName = `${ownerTable.name ?? '<anonymous>'}:<unnested>`;
274
+ const unnestTableName = `${ownerTable.name ?? ANONYMOUS_TABLE}:<unnested>`;
223
275
  const apiOperation = ownerTable.apiOperation !== undefined ? { apiOperation: ownerTable.apiOperation } : {};
224
276
 
225
277
  if (sourceSchema?.type === 'array') {
@@ -388,7 +440,7 @@ function lookupColumnOrThrow(colRef: string, ref: object, referencedTables: Reso
388
440
  const resolvedColumns = referencedTables.flatMap((table) => table.columns.get(colRef) ?? []);
389
441
  if (resolvedColumns.length === 0) {
390
442
  const tableNames = [
391
- ...new Set(referencedTables.map((referenceTable) => referenceTable.name ?? '<anonymous>')),
443
+ ...new Set(referencedTables.map((referenceTable) => referenceTable.name ?? ANONYMOUS_TABLE)),
392
444
  ].join(', ');
393
445
  const availableCols = [...new Set(referencedTables.flatMap((table) => [...table.columns.keys()]))].join(', ');
394
446
  throw new AthenaError(
@@ -460,10 +512,9 @@ function resolveSingleColumnRef(
460
512
 
461
513
  const referencedTables = tableRef !== undefined ? lookupTables(tableRef, ctx) : allTables;
462
514
  if (referencedTables.length === 0) {
463
- const tableNames = [...ctx.tables.keys()].join(', ');
464
515
  throw new AthenaError(
465
516
  ATHENA_ERROR,
466
- `unknown table or alias '${tableRef ?? colRef}'; known tables: ${tableNames}`,
517
+ `unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(', ')}`,
467
518
  ref,
468
519
  );
469
520
  }
@@ -20,13 +20,16 @@ import type {
20
20
  Join,
21
21
  Select,
22
22
  TableExpr,
23
+ ValuesFrom,
23
24
  With,
24
25
  } from './types';
25
26
 
26
27
  // UNNEST is not in types.ts (the grammar produces it but the TS types don't model it).
27
28
  export interface UnnestFrom {
28
29
  type: 'unnest';
29
- expr: ColumnRefItem;
30
+ // expr is a column_ref when used with CROSS JOIN; for standalone UNNEST (e.g.
31
+ // UNNEST(SEQUENCE(...))) it is a function call with no `column` property.
32
+ expr: ColumnRefItem | { type: string };
30
33
  parentheses: boolean;
31
34
  as: {
32
35
  type: 'function';
@@ -75,6 +78,14 @@ export function isDual(node: unknown): node is Dual {
75
78
  return typeof node === 'object' && node !== null && (node as { type?: unknown }).type === 'dual';
76
79
  }
77
80
 
81
+ export function isValuesFrom(node: unknown): node is ValuesFrom {
82
+ if (typeof node !== 'object' || node === null) {
83
+ return false;
84
+ }
85
+ const expr = (node as { expr?: unknown }).expr;
86
+ return typeof expr === 'object' && expr !== null && (expr as { type?: unknown }).type === 'values';
87
+ }
88
+
78
89
  export function isTableExpr(node: unknown): node is TableExpr {
79
90
  if (typeof node !== 'object' || node === null) {
80
91
  return false;
@@ -220,6 +231,9 @@ function walkFrom(node: From, visitor: VisitorMap): void {
220
231
  }
221
232
  return;
222
233
  }
234
+ if (isValuesFrom(node)) {
235
+ return;
236
+ }
223
237
  visitor.visitBaseFrom?.(node);
224
238
  }
225
239