UNPKG

rawsql-ts

Version:

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

88 lines 4.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateQueryParser = void 0; // Provides parsing for UPDATE queries, supporting SET, WHERE, FROM, and RETURNING clauses. const UpdateQuery_1 = require("../models/UpdateQuery"); const SqlTokenizer_1 = require("./SqlTokenizer"); const UpdateClauseParser_1 = require("./UpdateClauseParser"); const WhereClauseParser_1 = require("./WhereClauseParser"); const ReturningClauseParser_1 = require("./ReturningClauseParser"); const FromClauseParser_1 = require("./FromClauseParser"); const SetClauseParser_1 = require("./SetClauseParser"); const WithClauseParser_1 = require("./WithClauseParser"); class UpdateQueryParser { /** * Parse SQL string to UpdateQuery AST. * @param query SQL string */ static parse(query) { const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); const lexemes = tokenizer.readLexmes(); 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 UPDATE 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, _e; let idx = index; // Parse optional WITH clause (CTE) let withClause = null; if (((_b = (_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === "with") { const withResult = WithClauseParser_1.WithClauseParser.parseFromLexeme(lexemes, idx); withClause = withResult.value; idx = withResult.newIndex; } // Expect UPDATE if (lexemes[idx].value !== "update") { throw new Error(`Syntax error at position ${idx}: Expected 'UPDATE' but found '${lexemes[idx].value}'.`); } idx++; // Parse updateClause (table or source expression) const updateClauseResult = UpdateClauseParser_1.UpdateClauseParser.parseFromLexeme(lexemes, idx); const updateClause = updateClauseResult.value; idx = updateClauseResult.newIndex; // Parse set clause (including 'SET' keyword check) const setClauseResult = SetClauseParser_1.SetClauseParser.parseFromLexeme(lexemes, idx); let setClause = setClauseResult.setClause; idx = setClauseResult.newIndex; // Optional FROM (not always supported in all dialects) let from = null; if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value) === "from") { const result = FromClauseParser_1.FromClauseParser.parseFromLexeme(lexemes, idx); from = result.value; idx = result.newIndex; } // Optional WHERE let where = null; if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) === "where") { const result = WhereClauseParser_1.WhereClauseParser.parseFromLexeme(lexemes, idx); where = result.value; idx = result.newIndex; } // Optional RETURNING let returning = null; if (((_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value) === "returning") { const result = ReturningClauseParser_1.ReturningClauseParser.parseFromLexeme(lexemes, idx); returning = result.value; idx = result.newIndex; } return { value: new UpdateQuery_1.UpdateQuery({ withClause, updateClause, setClause, whereClause: where, fromClause: from, returning }), newIndex: idx }; } } exports.UpdateQueryParser = UpdateQueryParser; //# sourceMappingURL=UpdateQueryParser.js.map