UNPKG

rawsql-ts

Version:

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

77 lines 3.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeleteQueryParser = void 0; // Provides parsing for DELETE statements, supporting WITH, USING, WHERE, and RETURNING clauses. const DeleteQuery_1 = require("../models/DeleteQuery"); const SqlTokenizer_1 = require("./SqlTokenizer"); const DeleteClauseParser_1 = require("./DeleteClauseParser"); const UsingClauseParser_1 = require("./UsingClauseParser"); const WhereClauseParser_1 = require("./WhereClauseParser"); const ReturningClauseParser_1 = require("./ReturningClauseParser"); const WithClauseParser_1 = require("./WithClauseParser"); class DeleteQueryParser { /** * Parse SQL string to DeleteQuery AST. * @param query SQL string */ static parse(query) { const tokenizer = new SqlTokenizer_1.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_1.WithClauseParser.parseFromLexeme(lexemes, idx); withClause = withResult.value; idx = withResult.newIndex; } // Parse the mandatory DELETE FROM clause. const deleteClauseResult = DeleteClauseParser_1.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_1.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_1.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_1.ReturningClauseParser.parseFromLexeme(lexemes, idx); returningClause = returningResult.value; idx = returningResult.newIndex; } return { value: new DeleteQuery_1.DeleteQuery({ withClause, deleteClause, usingClause, whereClause, returning: returningClause }), newIndex: idx }; } } exports.DeleteQueryParser = DeleteQueryParser; //# sourceMappingURL=DeleteQueryParser.js.map