fix(sql): split GaussDB procedures with repeated declarations

This commit is contained in:
zipg authored and GitHub committed 2026-07-28 01:17:37 +08:00
1 parent 1672d64619
commit d163136b6f
3 files changed
+83 -1

No files matched your search

@@ -92,6 +92,37 @@ END$function$;
DROP FUNCTION IF EXISTS dbx_issue_4572_tmp_missing;`;
const gaussDbIssue4573Script = `CREATE OR REPLACE PROCEDURE createIndex (
dbName IN VARCHAR(32),
tableName IN VARCHAR(64),
indexInfo IN VARCHAR(64),
indexColumns IN VARCHAR(128)
) AS
DECLARE STMT TEXT;
DECLARE flag int;
BEGIN
SELECT
count(*) INTO flag
FROM
PG_CATALOG.PG_INDEXES
WHERE
schemaname = dbName
AND TABLENAME = tableName
AND INDEXNAME = indexInfo;
IF flag = 0 THEN STMT := 'CREATE INDEX ' || indexInfo || ' ON ' || dbName || '.' || tableName || '(' || indexColumns || ')';
EXECUTE STMT;
END IF;
END;
SELECT 1 AS after_procedure;
SELECT 2 AS final_statement;`;
const xuguProgrammableObjectFixtures = [
`CREATE OR REPLACE PROCEDURE dbx_xugu_procedure AS
v_value INTEGER;
@@ -313,6 +344,10 @@ describe("splitSqlStatementRanges", () => {
]);
});
it("separates the issue #4573 GaussDB procedure from following statements", () => {
expect(rangeSqlTexts(splitSqlStatementRanges(gaussDbIssue4573Script, "gaussdb"))).toEqual([gaussDbIssue4573Script.slice(0, gaussDbIssue4573Script.indexOf("\n\nSELECT 1")), "SELECT 1 AS after_procedure", "SELECT 2 AS final_statement"]);
});
it("keeps Xugu programmable object DDL together and retains its terminator", () => {
for (const sql of xuguProgrammableObjectFixtures) {
const ranges = splitSqlStatementRanges(`${sql}\nSELECT 1;`, "xugu");
@@ -876,6 +911,11 @@ WHERE request_json LIKE '%"paperFlag":null%';`;
expect(statementRangeAtCursor(gaussDbNestedProcedure, outerNull, "gaussdb")?.sql.trim()).toBe(gaussDbNestedProcedure);
});
it("returns only the issue #4573 GaussDB procedure for a gutter cursor", () => {
const expected = gaussDbIssue4573Script.slice(0, gaussDbIssue4573Script.indexOf("\n\nSELECT 1"));
expect(statementRangeAtCursor(gaussDbIssue4573Script, indexOf(gaussDbIssue4573Script, "count(*)"), "gaussdb")?.sql.trim()).toBe(expected);
});
it("returns the full SAP HANA DO block for cursors inside nested statements", () => {
const range = statementRangeAtCursor(sapHanaDoBlockFixture, indexOf(sapHanaDoBlockFixture, "Result"), "saphana");
@@ -1705,7 +1705,7 @@ function oraclePlSqlBlockIsComplete(sql: string): boolean {
if (token.kind !== "word") continue;
if (token.value === "DECLARE") {
stack.push("DECLARATION");
if (stack[stack.length - 1] !== "DECLARATION") stack.push("DECLARATION");
continue;
}
if (token.value === "BEGIN") {