UNPKG

rawsql-ts

Version:

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

73 lines 3.31 kB
// Provides parsing for DELETE statements, supporting WITH, USING, WHERE, and RETURNING clauses. import { DeleteQuery } from "../models/DeleteQuery"; import { SqlTokenizer } from "./SqlTokenizer"; import { DeleteClauseParser } from "./DeleteClauseParser"; import { UsingClauseParser } from "./UsingClauseParser"; import { WhereClauseParser } from "./WhereClauseParser"; import { ReturningClauseParser } from "./ReturningClauseParser"; import { WithClauseParser } from "./WithClauseParser"; export class DeleteQueryParser { /** * Parse SQL string to DeleteQuery AST. * @param query SQL string */ static parse(query) { const tokenizer = new SqlTokenizer(query); const lexemes = tokenizer.readLexemes(); const result = this.parseFromLexeme(lexemes, 0); if (result.newIndex < lexemes.length) { throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The DELETE query is complete but there are additional tokens.`); } return result.value; } /** * Parse from lexeme array (for internal use and tests). */ static parseFromLexeme(lexemes, index) { var _a, _b, _c, _d; let idx = index; // Parse optional WITH clause before the DELETE command. let withClause = null; if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) === "with") { const withResult = WithClauseParser.parseFromLexeme(lexemes, idx); withClause = withResult.value; idx = withResult.newIndex; } // Parse the mandatory DELETE FROM clause. const deleteClauseResult = DeleteClauseParser.parseFromLexeme(lexemes, idx); const deleteClause = deleteClauseResult.value; idx = deleteClauseResult.newIndex; // Parse optional USING clause that supplies joined tables. let usingClause = null; if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value) === "using") { const usingResult = UsingClauseParser.parseFromLexeme(lexemes, idx); usingClause = usingResult.value; idx = usingResult.newIndex; } // Parse optional WHERE clause restricting deleted rows. let whereClause = null; if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value) === "where") { const whereResult = WhereClauseParser.parseFromLexeme(lexemes, idx); whereClause = whereResult.value; idx = whereResult.newIndex; } // Parse optional RETURNING clause to capture output columns. let returningClause = null; if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) === "returning") { const returningResult = ReturningClauseParser.parseFromLexeme(lexemes, idx); returningClause = returningResult.value; idx = returningResult.newIndex; } return { value: new DeleteQuery({ withClause, deleteClause, usingClause, whereClause, returning: returningClause }), newIndex: idx }; } } //# sourceMappingURL=DeleteQueryParser.js.map