fix(oracle): preserve plsql block terminators

This commit is contained in:
LRcoding authored and GitHub committed 2026-07-07 15:29:43 +08:00
1 parent ef39c2bfe8
commit fc01cea80f
4 files changed
+153 -1

No files matched your search

@@ -65,6 +65,12 @@ END;
/
SELECT 1;`;
const oracleIssue2405PlSql = `DECLARE
PRE_TRD_DATE INTEGER ;
BEGIN
SELECT 1 + 2 INTO PRE_TRD_DATE FROM DUAL;
END;`;
const mysqlRoutineFixture = `CREATE PROCEDURE p()
BEGIN
SELECT 1;
@@ -184,6 +190,10 @@ describe("splitSqlStatementRanges", () => {
expect(ranges[0].sql).not.toContain("\n/");
});
it("keeps issue #2405 Oracle PL/SQL block together without a slash delimiter", () => {
expect(rangeSqlTexts(splitSqlStatementRanges(oracleIssue2405PlSql, "oracle"))).toEqual([oracleIssue2405PlSql]);
});
it("keeps SAP HANA DO blocks together", () => {
const ranges = splitSqlStatementRanges(sapHanaDoBlockFixture, "saphana");
@@ -438,6 +448,12 @@ WHERE request_json LIKE '%"paperFlag":null%';`;
expect(range?.sql.trim()).toBe(oraclePlSqlFixture.slice(0, oraclePlSqlFixture.indexOf("\n/")));
});
it("returns the full issue #2405 Oracle PL/SQL block for cursors inside the block", () => {
for (const cursor of [indexOf(oracleIssue2405PlSql, "PRE_TRD_DATE"), indexOf(oracleIssue2405PlSql, "SELECT 1 + 2"), indexOf(oracleIssue2405PlSql, "END;")]) {
expect(statementRangeAtCursor(oracleIssue2405PlSql, cursor, "oracle")?.sql.trim()).toBe(oracleIssue2405PlSql);
}
});
it("returns the full SAP HANA DO block for cursors inside nested statements", () => {
const range = statementRangeAtCursor(sapHanaDoBlockFixture, indexOf(sapHanaDoBlockFixture, "Result"), "saphana");
@@ -477,6 +493,10 @@ describe("executableStatementRanges", () => {
expect(rangeSqlTexts(executableStatementRanges(oraclePlSqlFixture, "oracle"))).toEqual([oraclePlSqlFixture.slice(0, oraclePlSqlFixture.indexOf("\n/")), "SELECT 1"]);
});
it("returns the issue #2405 Oracle PL/SQL block as one executable range", () => {
expect(rangeSqlTexts(executableStatementRanges(oracleIssue2405PlSql, "oracle"))).toEqual([oracleIssue2405PlSql]);
});
it("does not split executable MySQL routine ranges at inner statements", () => {
expect(rangeSqlTexts(executableStatementRanges(mysqlRoutineFixture, "mysql"))).toEqual([mysqlRoutineFixture.slice(0, mysqlRoutineFixture.indexOf("\nSELECT 2;")).replace(/;$/, "").trim(), "SELECT 2"]);
});