fix(sql): split GaussDB procedures with repeated declarations
This commit is contained in:
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") {
|
||||
|
||||
Reference in new issue
Block a user