@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.
- package/dist-mjs/athena/validate.mjs +78 -43
- package/dist-mjs/athena/visitor.mjs +12 -1
- package/dist-types/athena/types.d.ts +20 -1
- package/dist-types/athena/visitor.d.ts +5 -2
- package/package.json +1 -1
- package/src/athena/types.ts +10 -1
- package/src/athena/validate.ts +100 -49
- package/src/athena/visitor.ts +15 -1
|
@@ -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(
|
|
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
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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 ??
|
|
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 ??
|
|
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: ${
|
|
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,
|
|
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
|
|
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-
|
|
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"]}}}
|
package/src/athena/types.ts
CHANGED
|
@@ -67,7 +67,16 @@ export interface Dual {
|
|
|
67
67
|
type: 'dual';
|
|
68
68
|
loc?: LocationRange;
|
|
69
69
|
}
|
|
70
|
-
|
|
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;
|
package/src/athena/validate.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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 =
|
|
192
|
-
|
|
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 ??
|
|
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 ??
|
|
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: ${
|
|
517
|
+
`unknown table or alias '${tableRef ?? colRef}'; known tables: ${[...ctx.tables.keys()].join(', ')}`,
|
|
467
518
|
ref,
|
|
468
519
|
);
|
|
469
520
|
}
|
package/src/athena/visitor.ts
CHANGED
|
@@ -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
|
|
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
|
|