rawsql-ts
Version:
High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
69 lines • 2.92 kB
JavaScript
import { SqlTokenizer } from "./SqlTokenizer";
import { DropIndexStatement } from "../models/DDLStatements";
import { TokenType } from "../models/Lexeme";
import { FullNameParser } from "./FullNameParser";
import { QualifiedName } from "../models/ValueComponent";
/**
* Parses DROP INDEX statements.
*/
export class DropIndexParser {
static parse(sql) {
const tokenizer = new SqlTokenizer(sql);
const lexemes = tokenizer.readLexemes();
const result = this.parseFromLexeme(lexemes, 0);
if (result.newIndex < lexemes.length) {
throw new Error(`[DropIndexParser] Unexpected token "${lexemes[result.newIndex].value}" after DROP INDEX statement.`);
}
return result.value;
}
static parseFromLexeme(lexemes, index) {
var _a, _b, _c, _d, _e;
let idx = index;
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) !== "drop index") {
throw new Error(`[DropIndexParser] Expected DROP INDEX at index ${idx}.`);
}
idx++;
// Parse optional CONCURRENTLY modifier.
let concurrently = false;
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value.toLowerCase()) === "concurrently") {
concurrently = true;
idx++;
}
// Parse optional IF EXISTS modifier.
let ifExists = false;
if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value.toLowerCase()) === "if exists") {
ifExists = true;
idx++;
const next = lexemes[idx];
if (!next || next.type !== TokenType.Identifier) {
throw new Error("[DropIndexParser] Expected index name immediately after IF EXISTS.");
}
}
const indexNames = [];
// Parse comma-separated index identifiers.
while (idx < lexemes.length) {
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, idx);
indexNames.push(new QualifiedName(namespaces, name));
idx = newIndex;
if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.type) === TokenType.Comma) {
idx++;
continue;
}
break;
}
if (indexNames.length === 0) {
throw new Error("[DropIndexParser] DROP INDEX must specify at least one index name.");
}
let behavior = null;
const nextValue = (_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value.toLowerCase();
if (nextValue === "cascade" || nextValue === "restrict") {
behavior = nextValue;
idx++;
}
return {
value: new DropIndexStatement({ indexNames, concurrently, ifExists, behavior }),
newIndex: idx
};
}
}
//# sourceMappingURL=DropIndexParser.js.map