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