diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 8fffbd88b2..825b02c29e 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -1626,6 +1626,10 @@ ASTOuterJoinExpression OuterJoinExpression() : * See https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Functions.html#GUID-D079EFD3-C683-441F-977E-2C9503089982 * See https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/About-User-Defined-Functions.html#GUID-4EB3E236-8216-471C-BA44-23D87BDFEA67 * + * XML Functions: + * https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/XMLROOT.html#GUID-5BD300E2-7138-436D-87AF-21658840CF9D + * https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/XMLFOREST.html#GUID-68E5C67E-CE97-4BF8-B7FF-2365E062C363 + * * A function reference/name might be: * function_name * package.function_name @@ -1644,9 +1648,12 @@ ASTFunctionCall FunctionCall() : | LOOKAHEAD({"XMLCAST".equalsIgnoreCase(token.getImage())}) "(" Expression() Datatype() ")" | LOOKAHEAD({"XMLQUERY".equalsIgnoreCase(token.getImage())}) "(" StringLiteral() [ LOOKAHEAD({isKeyword("PASSING")}) XMLPassingClause() ] KEYWORD("CONTENT") [ ] ")" | LOOKAHEAD({"CAST".equalsIgnoreCase(token.getImage())}) "(" ( "(" Subquery() ")" | Expression() ) Datatype() ")" - | LOOKAHEAD({"XMLFOREST".equalsIgnoreCase(token.getImage())}) "(" SqlExpression() [ ] [ ID() ] ( "," SqlExpression() [ ] [ ID() ] )* ")" + | LOOKAHEAD({"XMLFOREST".equalsIgnoreCase(token.getImage())}) "(" SqlExpression() [ ID() ] ( "," SqlExpression() [ ID() ] )* ")" | LOOKAHEAD({"XMLELEMENT".equalsIgnoreCase(token.getImage())}) XMLElement() - | LOOKAHEAD({"XMLROOT".equalsIgnoreCase(token.getImage())}) "(" Expression() "," KEYWORD("VERSION") (LOOKAHEAD(2) ( "VALUE") | Expression() ) [ "," KEYWORD("STANDALONE") ( | )] [ "VALUE" ] ")" + | LOOKAHEAD({"XMLROOT".equalsIgnoreCase(token.getImage())}) + "(" Expression() "," KEYWORD("VERSION") ( KEYWORD("VALUE") | Expression() ) + [ "," KEYWORD("STANDALONE") ( | [ LOOKAHEAD({isKeyword("VALUE")}) KEYWORD("VALUE") ] ) ] + ")" | Arguments() ) @@ -1732,7 +1739,7 @@ ASTXMLPassingClause XMLPassingClause() : {} { KEYWORD("PASSING") - [ "VALUE" ] + [ KEYWORD("VALUE") ] ( SqlExpression() [ LOOKAHEAD(2) ID() ] ) ( "," SqlExpression() [ LOOKAHEAD(2) ID() ] )* { return jjtThis; } @@ -2485,7 +2492,7 @@ ASTUpdateSetClause UpdateSetClause() : ( LOOKAHEAD(1) "=" Name() | - "VALUE" "(" TableAlias() ")" "=" ( LOOKAHEAD(1) "(" Subquery() ")" | Expression() ) + LOOKAHEAD({isKeyword("VALUE")}) KEYWORD("VALUE") "(" TableAlias() ")" "=" ( LOOKAHEAD(1) "(" Subquery() ")" | Expression() ) | ( ( @@ -5280,7 +5287,7 @@ ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {} // PL/SQL UNRESERVED KEYWORDS - V$RESERVED.RESERVED='N' ( "REF" | "LAST" | "TRIM" | "OVER" | "UNBOUNDED" | "PRECEDING" | "FOLLOWING" | "WITHIN" | -"OVERFLOW" | "ERROR" | "WITHOUT" | "COUNT" | "VALUE" | "SUBPARTITION" | "LOG" | "ERRORS" | "REJECT" | "UNLIMITED" | +"OVERFLOW" | "ERROR" | "WITHOUT" | "COUNT" | "SUBPARTITION" | "LOG" | "ERRORS" | "REJECT" | "UNLIMITED" | | | diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/XMLFunctions.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/XMLFunctions.pls index 84fb445628..a3e887eee7 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/XMLFunctions.pls +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/XMLFunctions.pls @@ -18,4 +18,22 @@ SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Docks', 'xmlns:a="htt SELECT XMLELEMENT("Emp", XMLFOREST(e.employee_id, e.last_name, e.salary)) "Emp Element" - FROM employees e WHERE employee_id = 204; \ No newline at end of file + FROM employees e WHERE employee_id = 204; + +SELECT XMLROOT ( XMLType('143598'), VERSION '1.0', STANDALONE YES) + AS "XMLROOT" FROM DUAL; + +SELECT XMLROOT ( XMLType('143598'), VERSION '1.0', STANDALONE NO) + AS "XMLROOT" FROM DUAL; + +SELECT XMLROOT ( XMLType('143598'), VERSION '1.0', STANDALONE NO VALUE) + AS "XMLROOT" FROM DUAL; + +SELECT XMLROOT ( XMLType('143598'), VERSION NO VALUE, STANDALONE YES) + AS "XMLROOT" FROM DUAL; + +SELECT XMLROOT ( XMLType('143598'), VERSION NO VALUE) + AS "XMLROOT" FROM DUAL; + +SELECT XMLROOT ( XMLType('143598'), VERSION '1.0') + AS "XMLROOT" FROM DUAL;