snowflake-sql-validator
Version:
Snowflake SQL validator for React applications
104 lines • 5.06 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CaseInsensitiveSnowflakeLexer = void 0;
const SnowflakeLexer_1 = require("./parser/snowflake/SnowflakeLexer");
/**
* Case-insensitive wrapper for SnowflakeLexer that handles lowercase SQL keywords
* Optimized for performance with Map-based keyword lookup
*/
class CaseInsensitiveSnowflakeLexer extends SnowflakeLexer_1.SnowflakeLexer {
constructor(input) {
super(input);
}
/**
* Override the nextToken method to handle case-insensitive matching
* Optimized with Map lookup and minimal string operations
*/
nextToken() {
const token = super.nextToken();
// If it's an identifier, check if it matches any SQL keywords (case-insensitive)
if (token.type === SnowflakeLexer_1.SnowflakeLexer.ID && token.text) {
const text = token.text.toUpperCase();
const keywordType = CaseInsensitiveSnowflakeLexer.keywordMap.get(text);
if (keywordType) {
// Check if the text is a valid case pattern for SQL keywords
const isLowerCase = token.text === token.text.toLowerCase();
const isUpperCase = token.text === token.text.toUpperCase();
if (isLowerCase || isUpperCase) {
// Valid case pattern - convert to keyword token
const newToken = {
...token,
type: keywordType
};
return newToken;
}
else {
// Mixed case keywords are not allowed - keep as identifier but mark as invalid
// This will be caught by the validation visitor
const newToken = {
...token,
type: SnowflakeLexer_1.SnowflakeLexer.ID // Keep as identifier but with mixed case
};
return newToken;
}
}
}
return token;
}
}
exports.CaseInsensitiveSnowflakeLexer = CaseInsensitiveSnowflakeLexer;
// Static keyword map for efficient lookup - initialized once
CaseInsensitiveSnowflakeLexer.keywordMap = new Map([
['SELECT', SnowflakeLexer_1.SnowflakeLexer.SELECT],
['FROM', SnowflakeLexer_1.SnowflakeLexer.FROM],
['WHERE', SnowflakeLexer_1.SnowflakeLexer.WHERE],
['INSERT', SnowflakeLexer_1.SnowflakeLexer.INSERT],
['UPDATE', SnowflakeLexer_1.SnowflakeLexer.UPDATE],
['DELETE', SnowflakeLexer_1.SnowflakeLexer.DELETE],
['CREATE', SnowflakeLexer_1.SnowflakeLexer.CREATE],
['DROP', SnowflakeLexer_1.SnowflakeLexer.DROP],
['ALTER', SnowflakeLexer_1.SnowflakeLexer.ALTER],
['AS', SnowflakeLexer_1.SnowflakeLexer.AS],
['AND', SnowflakeLexer_1.SnowflakeLexer.AND],
['OR', SnowflakeLexer_1.SnowflakeLexer.OR],
['INTO', SnowflakeLexer_1.SnowflakeLexer.INTO],
['VALUES', SnowflakeLexer_1.SnowflakeLexer.VALUES],
['SET', SnowflakeLexer_1.SnowflakeLexer.SET],
['JOIN', SnowflakeLexer_1.SnowflakeLexer.JOIN],
['LEFT', SnowflakeLexer_1.SnowflakeLexer.LEFT],
['RIGHT', SnowflakeLexer_1.SnowflakeLexer.RIGHT],
['INNER', SnowflakeLexer_1.SnowflakeLexer.INNER],
['OUTER', SnowflakeLexer_1.SnowflakeLexer.OUTER],
['ON', SnowflakeLexer_1.SnowflakeLexer.ON],
['GROUP', SnowflakeLexer_1.SnowflakeLexer.GROUP],
['BY', SnowflakeLexer_1.SnowflakeLexer.BY],
['ORDER', SnowflakeLexer_1.SnowflakeLexer.ORDER],
['HAVING', SnowflakeLexer_1.SnowflakeLexer.HAVING],
['LIMIT', SnowflakeLexer_1.SnowflakeLexer.LIMIT],
['OFFSET', SnowflakeLexer_1.SnowflakeLexer.OFFSET],
['UNION', SnowflakeLexer_1.SnowflakeLexer.UNION],
['ALL', SnowflakeLexer_1.SnowflakeLexer.ALL],
['DISTINCT', SnowflakeLexer_1.SnowflakeLexer.DISTINCT],
['COUNT', SnowflakeLexer_1.SnowflakeLexer.COUNT],
['SUM', SnowflakeLexer_1.SnowflakeLexer.SUM],
['AVG', SnowflakeLexer_1.SnowflakeLexer.AVG],
['CASE', SnowflakeLexer_1.SnowflakeLexer.CASE],
['WHEN', SnowflakeLexer_1.SnowflakeLexer.WHEN],
['THEN', SnowflakeLexer_1.SnowflakeLexer.THEN],
['ELSE', SnowflakeLexer_1.SnowflakeLexer.ELSE],
['END', SnowflakeLexer_1.SnowflakeLexer.END],
['IS', SnowflakeLexer_1.SnowflakeLexer.IS],
['NULL', SnowflakeLexer_1.SnowflakeLexer.NULL_],
['NOT', SnowflakeLexer_1.SnowflakeLexer.NOT],
['LIKE', SnowflakeLexer_1.SnowflakeLexer.LIKE],
['IN', SnowflakeLexer_1.SnowflakeLexer.IN],
['BETWEEN', SnowflakeLexer_1.SnowflakeLexer.BETWEEN],
['EXISTS', SnowflakeLexer_1.SnowflakeLexer.EXISTS],
['CAST', SnowflakeLexer_1.SnowflakeLexer.CAST],
['CURRENT_DATE', SnowflakeLexer_1.SnowflakeLexer.CURRENT_DATE],
['CURRENT_TIME', SnowflakeLexer_1.SnowflakeLexer.CURRENT_TIME],
['CURRENT_TIMESTAMP', SnowflakeLexer_1.SnowflakeLexer.CURRENT_TIMESTAMP],
['TRUE', SnowflakeLexer_1.SnowflakeLexer.TRUE],
['FALSE', SnowflakeLexer_1.SnowflakeLexer.FALSE]
]);
//# sourceMappingURL=CaseInsensitiveSnowflakeLexer.js.map
;