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
JavaScript
;
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