diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParser.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParser.java index d2fa91fa3cf85794f52378ddd9e8f090de7a8d6a..b703d465ad08716c637e9ad01f4a5a95b165608d 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParser.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParser.java @@ -151,10 +151,8 @@ public class SQLScriptParser // that block is not preceded by the prefix e.g 'AS', because in many dialects // there's no direct header block terminators // like 'BEGIN ... END' but 'DECLARE ... BEGIN ... END' - if (curBlock != null && curBlock.isHeader) { - if (prevNotEmptyTokenType != SQLTokenType.T_KEYWORD || !ArrayUtils.contains(dialect.getInnerBlockPrefixes(), lastKeyword)) { - curBlock = curBlock.parent; - } + if (curBlock != null && curBlock.isHeader && !ArrayUtils.contains(dialect.getInnerBlockPrefixes(), lastKeyword)) { + curBlock = curBlock.parent; } curBlock = new ScriptBlockInfo(curBlock, false); hasBlocks = true; diff --git a/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParserTest.java b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParserTest.java index ec2cdc2df38aabc1c7909cac015c58fb6e239a44..da901e728050e86224a65b10d7f567805acc2bfb 100644 --- a/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParserTest.java +++ b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/model/sql/parser/SQLScriptParserTest.java @@ -246,6 +246,42 @@ public class SQLScriptParserTest { " DBMS_OUTPUT.PUT_LINE(rec2.name);\n" + "END;" }); + + assertParse(ORACLE_DIALECT, + "DECLARE\n" + + " test_v NUMBER:=0;\n" + + " FUNCTION test_f(value_in_v IN number)\n" + + " RETURN\n" + + " varchar2\n" + + " IS\n" + + " value_char_out VARCHAR2(10);\n" + + " BEGIN\n" + + " SELECT to_char(value_in_v) INTO value_char_out FROM dual;\n" + + " RETURN value_char_out;\n" + + " END; \n" + + "BEGIN\n" + + " dbms_output.put_line('Start');\n" + + " dbms_output.put_line(test_v||chr(9)||test_f(test_v));\n" + + " dbms_output.put_line('End');\n" + + "END;", + new String[]{ + "DECLARE\n" + + " test_v NUMBER:=0;\n" + + " FUNCTION test_f(value_in_v IN number)\n" + + " RETURN\n" + + " varchar2\n" + + " IS\n" + + " value_char_out VARCHAR2(10);\n" + + " BEGIN\n" + + " SELECT to_char(value_in_v) INTO value_char_out FROM dual;\n" + + " RETURN value_char_out;\n" + + " END; \n" + + "BEGIN\n" + + " dbms_output.put_line('Start');\n" + + " dbms_output.put_line(test_v||chr(9)||test_f(test_v));\n" + + " dbms_output.put_line('End');\n" + + "END;" + }); } private void assertParse(SQLDialect dialect, String query, String[] expected) {