rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
39 lines • 1.8 kB
JavaScript
// Provides parsing for SET clauses in UPDATE queries.
import { TokenType } from "../models/Lexeme";
import { SetClause, SetClauseItem } from "../models/Clause";
import { ValueParser } from "./ValueParser";
import { FullNameParser } from "./FullNameParser";
/**
* Parse SET clause from lexemes (including 'SET' keyword check).
*/
export class SetClauseParser {
static parseFromLexeme(lexemes, idx) {
var _a, _b;
if (lexemes[idx].value !== "set") {
throw new Error(`Syntax error at position ${idx}: Expected 'SET' but found '${lexemes[idx].value}'.`);
}
idx++;
let setClauseItems = [];
while (idx < lexemes.length && lexemes[idx].type === TokenType.Identifier) {
// Parse fully qualified column name (e.g. table.column, schema.table.column)
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, idx);
idx = newIndex;
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== TokenType.Operator || lexemes[idx].value !== "=") {
throw new Error(`Syntax error at position ${idx}: Expected '=' after column name in SET clause.`);
}
idx++;
// Parse value expression
const value = ValueParser.parseFromLexeme(lexemes, idx);
setClauseItems.push(new SetClauseItem({ namespaces, column: name }, value.value));
idx = value.newIndex;
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === TokenType.Comma) {
idx++;
}
else {
break;
}
}
return { setClause: new SetClause(setClauseItems), newIndex: idx };
}
}
//# sourceMappingURL=SetClauseParser.js.map