From 2894896386cb161cf8d5bd7de6bdfe7f3c023381 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 8 Feb 2021 22:27:58 +0100 Subject: [PATCH] [jOOQ/jOOQ#11389] Add parser support for PL/SQL style variable declarations in function / procedure headers --- .../main/java/org/jooq/impl/BlockImpl.java | 10 +++--- .../main/java/org/jooq/impl/ParserImpl.java | 34 ++++++++++++++++--- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java index b0d94bd6e2..b2aa38c9e3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java @@ -99,9 +99,9 @@ final class BlockImpl extends AbstractRowCountQuery implements Block { /** * Generated UID */ - private static final long serialVersionUID = 6881305779639901498L; - private static final Set REQUIRES_EXECUTE_IMMEDIATE_ON_DDL = SQLDialect.supportedBy(FIREBIRD); - private static final Set SUPPORTS_NULL_STATEMENT = SQLDialect.supportedBy(POSTGRES); + private static final long serialVersionUID = 6881305779639901498L; + private static final Set REQUIRES_EXECUTE_IMMEDIATE_ON_DDL = SQLDialect.supportedBy(FIREBIRD); + private static final Set SUPPORTS_NULL_STATEMENT = SQLDialect.supportedBy(POSTGRES); @@ -115,8 +115,8 @@ final class BlockImpl extends AbstractRowCountQuery implements Block { - private final Collection statements; - final boolean alwaysWrapInBeginEnd; + final Collection statements; + final boolean alwaysWrapInBeginEnd; BlockImpl(Configuration configuration, Collection statements, boolean alwaysWrapInBeginEnd) { super(configuration); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 0640de5492..5c4d8018a1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -73,6 +73,7 @@ import static org.jooq.impl.DSL.atan; import static org.jooq.impl.DSL.atan2; import static org.jooq.impl.DSL.avg; import static org.jooq.impl.DSL.avgDistinct; +import static org.jooq.impl.DSL.begin; import static org.jooq.impl.DSL.bitAnd; import static org.jooq.impl.DSL.bitCount; import static org.jooq.impl.DSL.bitLength; @@ -290,6 +291,7 @@ import static org.jooq.impl.DSL.splitPart; import static org.jooq.impl.DSL.sql; import static org.jooq.impl.DSL.sqrt; import static org.jooq.impl.DSL.square; +// ... import static org.jooq.impl.DSL.stddevPop; import static org.jooq.impl.DSL.stddevSamp; import static org.jooq.impl.DSL.sum; @@ -954,7 +956,7 @@ final class ParserContext { case 'B': if (!parseResultQuery && peekKeyword("BEGIN")) - return parseBlock(); + return parseBlock(false); break; @@ -974,7 +976,7 @@ final class ParserContext { case 'D': if (!parseResultQuery && peekKeyword("DECLARE") && requireProEdition()) - return parseBlock(); + return parseBlock(true); else if (!parseResultQuery && (peekKeyword("DELETE") || peekKeyword("DEL"))) return parseDelete(null); else if (!parseResultQuery && peekKeyword("DROP")) @@ -986,7 +988,7 @@ final class ParserContext { case 'E': if (!parseResultQuery && peekKeyword("EXECUTE BLOCK AS BEGIN")) - return parseBlock(); + return parseBlock(false); else if (!parseResultQuery && peekKeyword("EXEC")) return parseExec(); @@ -2942,14 +2944,14 @@ final class ParserContext { } } - private final Block parseBlock() { + private final Block parseBlock(boolean allowDeclare) { List statements = new ArrayList<>(); - if (parseKeywordIf("DECLARE") && requireProEdition()) + if (allowDeclare && parseKeywordIf("DECLARE") && requireProEdition()) @@ -3059,6 +3061,16 @@ final class ParserContext { + + + + + + + + + + @@ -5376,6 +5388,18 @@ final class ParserContext { + + + + + + + + + + + +