🐛 fix(sql-editor): 修复存储过程定义执行截断

This commit is contained in:
Syngnat
2026-06-04 15:46:09 +08:00
parent 4cef232271
commit 8f7c790700
8 changed files with 328 additions and 229 deletions

View File

@@ -86,6 +86,72 @@ describe('sqlStatementSelection', () => {
});
});
it('keeps Oracle CREATE PROCEDURE definitions as one executable statement', () => {
const sql = [
'CREATE OR REPLACE PROCEDURE proc_tally2accept(',
' p_tallyacceptno IN t_tally_accept_h.acceptno%TYPE,',
' out_acceptno OUT t_accept_h.acceptno%TYPE',
') IS',
' v_busno t_tally_accept_h.busno%TYPE;',
' v_count PLS_INTEGER;',
'BEGIN',
" SELECT COUNT(*) INTO v_count FROM t_tally_accept_h WHERE acceptno = p_tallyacceptno;",
' IF v_count > 0 THEN',
' out_acceptno := p_tallyacceptno;',
' END IF;',
'END;',
'SELECT 1 FROM dual;',
].join('\n');
const ranges = findSqlStatementRanges(sql).map((range) => range.text);
expect(ranges).toEqual([
[
'CREATE OR REPLACE PROCEDURE proc_tally2accept(',
' p_tallyacceptno IN t_tally_accept_h.acceptno%TYPE,',
' out_acceptno OUT t_accept_h.acceptno%TYPE',
') IS',
' v_busno t_tally_accept_h.busno%TYPE;',
' v_count PLS_INTEGER;',
'BEGIN',
" SELECT COUNT(*) INTO v_count FROM t_tally_accept_h WHERE acceptno = p_tallyacceptno;",
' IF v_count > 0 THEN',
' out_acceptno := p_tallyacceptno;',
' END IF;',
'END;',
].join('\n'),
'SELECT 1 FROM dual',
]);
expect(resolveExecutableSql(sql, sql.indexOf('v_busno'))).toEqual({
sql: ranges[0],
source: 'statement',
});
});
it('keeps PostgreSQL dollar-quoted CREATE FUNCTION definitions as one executable statement', () => {
const sql = [
'CREATE OR REPLACE FUNCTION refresh_stats() RETURNS void AS $$',
'BEGIN',
' PERFORM refresh_now();',
'END;',
'$$ LANGUAGE plpgsql;',
'SELECT 2;',
].join('\n');
const ranges = findSqlStatementRanges(sql).map((range) => range.text);
expect(ranges).toEqual([
[
'CREATE OR REPLACE FUNCTION refresh_stats() RETURNS void AS $$',
'BEGIN',
' PERFORM refresh_now();',
'END;',
'$$ LANGUAGE plpgsql',
].join('\n'),
'SELECT 2',
]);
});
it('still splits transaction BEGIN statements', () => {
const sql = 'BEGIN; UPDATE accounts SET balance = balance - 1 WHERE id = 1; COMMIT;';