[plsql] Support REGEXP_LIKE condition
This commit is contained in:
@ -1310,6 +1310,8 @@ void Condition2() #void :
|
||||
LOOKAHEAD(9) InCondition()
|
||||
|
|
||||
LOOKAHEAD(9) LikeCondition()
|
||||
|
|
||||
LOOKAHEAD(9) RegexpLikeCondition()
|
||||
|
|
||||
LOOKAHEAD(4) BetweenCondition()
|
||||
|
|
||||
@ -1342,6 +1344,19 @@ ASTLikeCondition LikeCondition() :
|
||||
{ return jjtThis; }
|
||||
}
|
||||
|
||||
ASTRegexpLikeCondition RegexpLikeCondition() :
|
||||
{
|
||||
Token matchParam = null;
|
||||
}
|
||||
{
|
||||
<REGEXP_LIKE> "("
|
||||
ID() ","
|
||||
StringLiteral()
|
||||
[ "," ( matchParam = <CHARACTER_LITERAL> | matchParam = <STRING_LITERAL> ) {jjtThis.setMatchParam(matchParam.toString());} ]
|
||||
")"
|
||||
{ return jjtThis; }
|
||||
}
|
||||
|
||||
ASTExistsCondition ExistsCondition() :
|
||||
{}
|
||||
{
|
||||
@ -4365,6 +4380,7 @@ TOKEN [IGNORE_CASE]:
|
||||
<RECORD: "RECORD"> |
|
||||
<REF: "REF"> |
|
||||
<REFERENCES: "REFERENCES"> |
|
||||
<REGEXP_LIKE: "REGEXP_LIKE"> |
|
||||
<RELEASE: "RELEASE"> |
|
||||
<RELIES_ON: "RELIES_ON"> |
|
||||
<RENAME: "RENAME"> | //SRT 2011-04-17
|
||||
@ -5523,7 +5539,7 @@ ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {}
|
||||
| <REFERENCES>
|
||||
//| <REFERENCING>
|
||||
//| <REFRESH>
|
||||
//| <REGEXP_LIKE>
|
||||
| <REGEXP_LIKE>
|
||||
//| <REGISTER>
|
||||
//| <REJECT>
|
||||
//| <REKEY>
|
||||
|
@ -62,6 +62,7 @@
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPrimaryPrefix.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPrimarySuffix.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTProgramUnit.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTRegexpLikeCondition.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSelectIntoStatement.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSelectStatement.java" />
|
||||
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSubqueryOperation.java" />
|
||||
|
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
package net.sourceforge.pmd.lang.plsql.ast;
|
||||
|
||||
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=true,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
|
||||
public class ASTRegexpLikeCondition extends net.sourceforge.pmd.lang.plsql.ast.AbstractPLSQLNode {
|
||||
private String matchParam;
|
||||
|
||||
public ASTRegexpLikeCondition(int id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
public ASTRegexpLikeCondition(PLSQLParser p, int id) {
|
||||
super(p, id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object jjtAccept(PLSQLParserVisitor visitor, Object data) {
|
||||
return visitor.visit(this, data);
|
||||
}
|
||||
|
||||
void setMatchParam(String matchParam) {
|
||||
this.matchParam = matchParam;
|
||||
}
|
||||
|
||||
public String getMatchParam() {
|
||||
return this.matchParam;
|
||||
}
|
||||
|
||||
public ASTID getSourceChar() {
|
||||
return (ASTID) jjtGetChild(0);
|
||||
}
|
||||
|
||||
public ASTStringLiteral getPattern() {
|
||||
return (ASTStringLiteral) jjtGetChild(1);
|
||||
}
|
||||
}
|
||||
/* JavaCC - OriginalChecksum=afb8806a0c67f95b736d6e8bc46def15 (do not edit this line) */
|
@ -1011,4 +1011,9 @@ public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor {
|
||||
public Object visit(ASTSubmultisetCondition node, Object data) {
|
||||
return visit((PLSQLNode) node, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(ASTRegexpLikeCondition node, Object data) {
|
||||
return visit((PLSQLNode) node, data);
|
||||
}
|
||||
}
|
||||
|
@ -1105,6 +1105,11 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar
|
||||
return visit((PLSQLNode) node, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(ASTRegexpLikeCondition node, Object data) {
|
||||
return visit((PLSQLNode) node, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Treat all Executable Code
|
||||
*/
|
||||
|
@ -82,4 +82,16 @@ public class WhereClauseTest extends AbstractPLSQLParserTst {
|
||||
StandardCharsets.UTF_8);
|
||||
ASTInput input = parsePLSQL(code);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegexpLikeCondition() throws Exception {
|
||||
String code = IOUtils.toString(this.getClass().getResourceAsStream("WhereClauseRegexpLike.pls"),
|
||||
StandardCharsets.UTF_8);
|
||||
ASTInput input = parsePLSQL(code);
|
||||
List<ASTRegexpLikeCondition> regexps = input.findDescendantsOfType(ASTRegexpLikeCondition.class);
|
||||
Assert.assertEquals(2, regexps.size());
|
||||
Assert.assertEquals("last_name", regexps.get(1).getSourceChar().getImage());
|
||||
Assert.assertEquals("'([aeiou])\\1'", regexps.get(1).getPattern().getImage());
|
||||
Assert.assertEquals("'i'", regexps.get(1).getMatchParam());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,20 @@
|
||||
--
|
||||
-- Where Clause With Regexp Like
|
||||
-- https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Pattern-matching-Conditions.html#GUID-D2124F3A-C6E4-4CCA-A40E-2FFCABFD8E19
|
||||
--
|
||||
|
||||
BEGIN
|
||||
|
||||
SELECT first_name, last_name
|
||||
INTO test
|
||||
FROM employees
|
||||
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$')
|
||||
ORDER BY first_name, last_name;
|
||||
|
||||
SELECT last_name
|
||||
INTO test
|
||||
FROM employees
|
||||
WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i')
|
||||
ORDER BY last_name;
|
||||
END;
|
||||
/
|
Reference in New Issue
Block a user