UNPKG

rawsql-ts

Version:

[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.

63 lines 2.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DropTableParser = void 0; const SqlTokenizer_1 = require("./SqlTokenizer"); const DDLStatements_1 = require("../models/DDLStatements"); const Lexeme_1 = require("../models/Lexeme"); const FullNameParser_1 = require("./FullNameParser"); const ValueComponent_1 = require("../models/ValueComponent"); /** * Parses DROP TABLE statements. */ class DropTableParser { static parse(sql) { const tokenizer = new SqlTokenizer_1.SqlTokenizer(sql); const lexemes = tokenizer.readLexemes(); const result = this.parseFromLexeme(lexemes, 0); if (result.newIndex < lexemes.length) { throw new Error(`[DropTableParser] Unexpected token "${lexemes[result.newIndex].value}" after DROP TABLE statement.`); } return result.value; } static parseFromLexeme(lexemes, index) { var _a, _b, _c, _d; let idx = index; if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) !== "drop table") { throw new Error(`[DropTableParser] Expected DROP TABLE at index ${idx}.`); } idx++; // Handle optional IF EXISTS modifier. let ifExists = false; if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value.toLowerCase()) === "if exists") { ifExists = true; idx++; } const tables = []; // Parse comma-separated table list. while (idx < lexemes.length) { const { namespaces, name, newIndex } = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx); tables.push(new ValueComponent_1.QualifiedName(namespaces, name)); idx = newIndex; if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === Lexeme_1.TokenType.Comma) { idx++; continue; } break; } if (tables.length === 0) { throw new Error("[DropTableParser] DROP TABLE must specify at least one table."); } let behavior = null; const nextValue = (_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value.toLowerCase(); if (nextValue === "cascade" || nextValue === "restrict") { behavior = nextValue; idx++; } return { value: new DDLStatements_1.DropTableStatement({ tables, ifExists, behavior }), newIndex: idx }; } } exports.DropTableParser = DropTableParser; //# sourceMappingURL=DropTableParser.js.map