Files
dbgate/packages/web/src/query/analyseQuerySources.ts
2023-02-05 20:03:15 +01:00

39 lines
1.2 KiB
TypeScript

export default function analyseQuerySources(sql, sourceNames) {
const upperSourceNames = sourceNames.map(x => x.toUpperCase());
const tokens = sql.split(/\s+/);
const res = [];
for (let i = 0; i < tokens.length; i += 1) {
const lastWordMatch = tokens[i].match(/([^.]+)$/);
if (lastWordMatch) {
const word = lastWordMatch[1];
const wordUpper = word.toUpperCase();
if (upperSourceNames.includes(wordUpper)) {
const preWord = tokens[i - 1];
if (preWord && /^((join)|(from)|(update)|(delete)|(insert))$/i.test(preWord)) {
let postWord = tokens[i + 1];
if (postWord && /^as$/i.test(postWord)) {
postWord = tokens[i + 2];
}
if (!postWord) {
res.push({
name: word,
});
} else if (
/^((where)|(inner)|(left)|(right)|(on)|(join)|(set)|(order)|(group))$/i.test(postWord) ||
!/^[a-zA-Z][a-zA-Z0-9]*$/i.test(postWord)
) {
res.push({
name: word,
});
} else
res.push({
name: word,
alias: postWord,
});
}
}
}
}
return res;
}