Commit c24955be authored by terrymanu's avatar terrymanu
Browse files

SQLJudgeEngine provide more details for SQL statement

parent 6258a59f
Loading
Loading
Loading
Loading
+24 −5
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import io.shardingjdbc.core.parsing.parser.exception.SQLParsingException;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.DMLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingjdbc.core.parsing.parser.sql.tcl.TCLStatement;
import lombok.RequiredArgsConstructor;
@@ -61,17 +62,16 @@ public final class SQLJudgeEngine {
            TokenType tokenType = lexerEngine.getCurrentToken().getType();
            if (tokenType instanceof Keyword) {
                if (isDQL(tokenType)) {
                    return new SelectStatement();
                    return getDQLStatement();
                }
                // TODO use InsertStatement, UpdateStatement ...
                if (isDML(tokenType)) {
                    return new DMLStatement();
                    return getDMLStatement(tokenType);
                }
                if (isDDL(tokenType)) {
                    return new DDLStatement();
                    return getDDLStatement();
                }
                if (isTCL(tokenType)) {
                    return new TCLStatement();
                    return getTCLStatement();
                }
                if (isDAL(tokenType)) {
                    return getDALStatement(tokenType, lexerEngine);
@@ -105,6 +105,25 @@ public final class SQLJudgeEngine {
        return DefaultKeyword.USE == tokenType || DefaultKeyword.DESC == tokenType || MySQLKeyword.DESCRIBE == tokenType || MySQLKeyword.SHOW == tokenType;
    }
    
    private SQLStatement getDQLStatement() {
        return new SelectStatement();
    }
    
    private SQLStatement getDMLStatement(final TokenType tokenType) {
        if (DefaultKeyword.INSERT == tokenType) {
            return new InsertStatement();
        }
        return new DMLStatement();
    }
    
    private SQLStatement getDDLStatement() {
        return new DDLStatement();
    }
    
    private SQLStatement getTCLStatement() {
        return new TCLStatement();
    }
    
    private SQLStatement getDALStatement(final TokenType tokenType, final LexerEngine lexerEngine) {
        if (DefaultKeyword.USE == tokenType) {
            return new UseStatement();
+74 −6
Original line number Diff line number Diff line
@@ -17,9 +17,17 @@

package io.shardingjdbc.core.parsing;

import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.DescribeStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowColumnsStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowOtherStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.UseStatement;
import io.shardingjdbc.core.parsing.parser.exception.SQLParsingException;
import io.shardingjdbc.core.parsing.parser.sql.dml.DMLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.DQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.tcl.TCLStatement;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.instanceOf;
@@ -28,27 +36,87 @@ import static org.junit.Assert.assertThat;
public final class SQLJudgeEngineTest {
    
    @Test
    public void assertPrepareParseForSelect() {
    public void assertJudgeForSelect() {
        assertThat(new SQLJudgeEngine(" /*COMMENT*/  \t \n  \r \fsElecT\t\n  * from table  ").judge(), instanceOf(DQLStatement.class));
    }
    
    @Test
    public void assertPrepareParseForInsert() {
        assertThat(new SQLJudgeEngine(" - - COMMENT  \t \n  \r \fInsert\t\n  into table  ").judge(), instanceOf(DMLStatement.class));
    public void assertJudgeForInsert() {
        assertThat(new SQLJudgeEngine(" - - COMMENT  \t \n  \r \finsert\t\n  into table  ").judge(), instanceOf(InsertStatement.class));
    }
    
    @Test
    public void assertPrepareParseForUpdate() {
    public void assertJudgeForUpdate() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fuPdAte\t\n  table  ").judge(), instanceOf(DMLStatement.class));
    }
    
    @Test
    public void assertPrepareParseForDelete() {
    public void assertJudgeForDelete() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fdelete\t\n  table  ").judge(), instanceOf(DMLStatement.class));
    }
    
    @Test
    public void assertJudgeForSet() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fset\t\n  autocommit  ").judge(), instanceOf(TCLStatement.class));
    }
    
    @Test
    public void assertJudgeForCommit() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fcommit  ").judge(), instanceOf(TCLStatement.class));
    }
    
    @Test
    public void assertJudgeForRollback() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \frollback  ").judge(), instanceOf(TCLStatement.class));
    }
    
    @Test
    public void assertJudgeForSavePoint() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fSavePoint  ").judge(), instanceOf(TCLStatement.class));
    }
    
    @Test
    public void assertJudgeForBegin() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fbegin  ").judge(), instanceOf(TCLStatement.class));
    }
    
    @Test
    public void assertJudgeForUse() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fuse sharding_db  ").judge(), instanceOf(UseStatement.class));
    }
    
    @Test
    public void assertJudgeForDescribe() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fdescribe t_order  ").judge(), instanceOf(DescribeStatement.class));
    }
    
    @Test
    public void assertJudgeForDesc() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fdesc t_order  ").judge(), instanceOf(DescribeStatement.class));
    }
    
    @Test
    public void assertJudgeForShowDatabases() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fshow databases  ").judge(), instanceOf(ShowDatabasesStatement.class));
    }
    
    @Test
    public void assertJudgeForShowTables() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fshow tables  ").judge(), instanceOf(ShowTablesStatement.class));
    }
    
    @Test
    public void assertJudgeForShowColumns() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fshow columns t_order ").judge(), instanceOf(ShowColumnsStatement.class));
    }
    
    @Test
    public void assertJudgeForShowOthers() {
        assertThat(new SQLJudgeEngine(" /*+ HINT SELECT * FROM TT*/  \t \n  \r \fshow session ").judge(), instanceOf(ShowOtherStatement.class));
    }
    
    @Test(expected = SQLParsingException.class)
    public void assertPrepareParseForInvalidSQL() {
    public void assertJudgeForInvalidSQL() {
        new SQLJudgeEngine("int i = 0").judge();
    }
}