Skip to content

Commit

Permalink
first try of error recovery for statement and statements
Browse files Browse the repository at this point in the history
  • Loading branch information
wumpz committed Jul 21, 2016
1 parent 1e30760 commit a7247eb
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 49 deletions.
139 changes: 93 additions & 46 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ import java.util.*;
* The parser generated by JavaCC
*/
public class CCJSqlParser {
boolean errorRecovery = false;
List<ParseException> parseErrors = new ArrayList<ParseException>();

private void linkAST(ASTNodeAccess access, SimpleNode node) {
access.setASTNode(node);
node.jjtSetValue(access);
Expand All @@ -89,6 +92,14 @@ public class CCJSqlParser {
public Node getASTRoot() {
return jjtree.rootNode();
}

public void setErrorRecovery(boolean errorRecovery) {
this.errorRecovery = errorRecovery;
}

public List<ParseException> getParseErrors() {
return parseErrors;
}
}

PARSER_END(CCJSqlParser)
Expand Down Expand Up @@ -284,53 +295,71 @@ TOKEN:
Statement Statement() #Statement:
{ Statement stm; }
{
stm = SingleStatement()
[<ST_SEMICOLON>]
<EOF>
{
return stm;
try {
stm = SingleStatement()
[<ST_SEMICOLON>]
<EOF>
{
return stm;
}
} catch (ParseException e) {
if (errorRecovery) {
parseErrors.add(e);
error_skipto(ST_SEMICOLON);
}
else
throw e;
}
}

Statement SingleStatement() :
{ Statement stm;}
{ Statement stm = null;}
{
(
stm = Select()
|
stm = Update()
|
stm = Insert()
|
stm = Delete()
|
stm = Replace()
|
LOOKAHEAD(2)
stm = AlterTable()
|
stm = Merge()
|
LOOKAHEAD(CreateIndex())
stm = CreateIndex()
|
LOOKAHEAD(2)
stm = CreateTable()
|
LOOKAHEAD(2)
stm = CreateView()
|
stm = AlterView()
|
stm = Drop()
|
stm = Truncate()
|
stm = Execute()
|
stm = Set()
)
{ return stm; }
try {
(
stm = Select()
|
stm = Update()
|
stm = Insert()
|
stm = Delete()
|
stm = Replace()
|
LOOKAHEAD(2)
stm = AlterTable()
|
stm = Merge()
|
LOOKAHEAD(CreateIndex())
stm = CreateIndex()
|
LOOKAHEAD(2)
stm = CreateTable()
|
LOOKAHEAD(2)
stm = CreateView()
|
stm = AlterView()
|
stm = Drop()
|
stm = Truncate()
|
stm = Execute()
|
stm = Set()
)
} catch (ParseException e) {
if (errorRecovery) {
parseErrors.add(e);
error_skipto(ST_SEMICOLON);
}
else
throw e;
}
{ return stm; }
}

Statements Statements() #Statements :
Expand All @@ -339,16 +368,34 @@ Statements Statements() #Statements :
Statement stm; }
{
(<ST_SEMICOLON>)*
stm = SingleStatement() { list.add(stm); }
( <ST_SEMICOLON> [ stm = SingleStatement() { list.add(stm); } ] )*
<EOF>

try {
stm = SingleStatement() { list.add(stm); }
( <ST_SEMICOLON> [stm = SingleStatement() { list.add(stm); }] )*
<EOF>
} catch (ParseException e) {
if (errorRecovery) {
parseErrors.add(e);
error_skipto(ST_SEMICOLON);
}
else
throw e;
}
{
stmts.setStatements(list);
return stmts;
}
}

JAVACODE
void error_skipto(int kind) {
ParseException e = generateParseException();
System.out.println(e.toString());
Token t;
do {
t = getNextToken();
} while (t.kind != kind && t.kind != EOF);
}

SetStatement Set(): {
String name;
Expression value;
Expand Down
46 changes: 43 additions & 3 deletions src/test/java/net/sf/jsqlparser/statement/StatementsTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package net.sf.jsqlparser.statement;

import java.io.StringReader;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParser;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.parser.ParseException;
import net.sf.jsqlparser.statement.select.Select;
import org.junit.After;
import org.junit.AfterClass;
Expand Down Expand Up @@ -35,9 +38,6 @@ public void setUp() {
public void tearDown() {
}

/**
* Test of toString method, of class Statements.
*/
@Test
public void testStatements() throws JSQLParserException {
String sqls = "select * from mytable; select * from mytable2;";
Expand All @@ -59,5 +59,45 @@ public void testStatementsProblem() throws JSQLParserException {
assertTrue(parseStatements.getStatements().get(0) instanceof Select);
assertTrue(parseStatements.getStatements().get(1) instanceof Select);
}

@Test
public void testStatementsErrorRecovery() throws JSQLParserException, ParseException {
String sqls = "select * from mytable; select * from;";
CCJSqlParser parser = new CCJSqlParser(new StringReader(sqls));
parser.setErrorRecovery(true);
Statements parseStatements = parser.Statements();

assertEquals(2, parseStatements.getStatements().size());

assertTrue(parseStatements.getStatements().get(0) instanceof Select);
assertNull(parseStatements.getStatements().get(1));
}

@Test
public void testStatementsErrorRecovery2() throws JSQLParserException, ParseException {
String sqls = "select * from1 table;";
CCJSqlParser parser = new CCJSqlParser(new StringReader(sqls));
parser.setErrorRecovery(true);
Statements parseStatements = parser.Statements();

assertEquals(1, parseStatements.getStatements().size());

assertTrue(parseStatements.getStatements().get(0) instanceof Select);
assertEquals(1,parser.getParseErrors().size());
}

@Test
public void testStatementsErrorRecovery3() throws JSQLParserException, ParseException {
String sqls = "select * from mytable; select * from;select * from mytable2";
CCJSqlParser parser = new CCJSqlParser(new StringReader(sqls));
parser.setErrorRecovery(true);
Statements parseStatements = parser.Statements();

assertEquals(2, parseStatements.getStatements().size());

assertTrue(parseStatements.getStatements().get(0) instanceof Select);
assertNull(parseStatements.getStatements().get(1));

assertEquals(2,parser.getParseErrors().size());
}
}

0 comments on commit a7247eb

Please sign in to comment.