Commit 472c7e83 authored by terrymanu's avatar terrymanu
Browse files

support SHOW COLUMNS Syntax and COM_FIELD_LIST packet

parent 5596a7bf
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ public enum MySQLKeyword implements Keyword {
    DESCRIBE, 
    DATABASES, 
    TABLES, 
    COLUMNS,
    FIELDS, 
    DUAL, 
    LIMIT, 
    OFFSET, 
+21 −0
Original line number Diff line number Diff line
@@ -2,9 +2,13 @@ package io.shardingjdbc.core.parsing.parser.dialect.mysql.sql;

import io.shardingjdbc.core.parsing.lexer.LexerEngine;
import io.shardingjdbc.core.parsing.lexer.dialect.mysql.MySQLKeyword;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
import io.shardingjdbc.core.parsing.parser.clause.TableReferencesClauseParser;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowType;
import io.shardingjdbc.core.parsing.parser.sql.SQLParser;
import io.shardingjdbc.core.parsing.parser.token.SchemaToken;
import io.shardingjdbc.core.rule.ShardingRule;
import lombok.RequiredArgsConstructor;

/**
@@ -17,15 +21,32 @@ public final class MySQLShowParser implements SQLParser {
    
    private final LexerEngine lexerEngine;
    
    private final TableReferencesClauseParser tableReferencesClauseParser;
    
    public MySQLShowParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) {
        this.lexerEngine = lexerEngine;
        tableReferencesClauseParser = new TableReferencesClauseParser(shardingRule, lexerEngine);
    }
    
    @Override
    public ShowStatement parse() {
        lexerEngine.nextToken();
        lexerEngine.skipIfEqual(DefaultKeyword.FULL);
        if (lexerEngine.equalAny(MySQLKeyword.DATABASES)) {
            return new ShowStatement(ShowType.DATABASES);
        }
        if (lexerEngine.equalAny(MySQLKeyword.TABLES)) {
            return new ShowStatement(ShowType.TABLES);
        }
        if (lexerEngine.skipIfEqual(MySQLKeyword.COLUMNS, MySQLKeyword.FIELDS)) {
            ShowStatement result = new ShowStatement(ShowType.COLUMNS);
            lexerEngine.skipIfEqual(DefaultKeyword.FROM, DefaultKeyword.IN);
            tableReferencesClauseParser.parseSingleTableWithoutAlias(result);
            lexerEngine.skipIfEqual(DefaultKeyword.FROM, DefaultKeyword.IN);
            int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
            result.getSqlTokens().add(new SchemaToken(beginPosition, lexerEngine.getCurrentToken().getLiterals(), result.getTables().getSingleTableName()));
            return result;
        }
        return new ShowStatement(ShowType.OTHER);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -7,5 +7,5 @@ package io.shardingjdbc.core.parsing.parser.dialect.mysql.statement;
 */
public enum ShowType {
    
    DATABASES, TABLES, OTHER
    DATABASES, TABLES, COLUMNS, OTHER
}
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ public final class SQLParserFactory {
                case DESCRIBE:
                    return Optional.of(new MySQLDescParser(shardingRule, lexerEngine));
                case SHOW:
                    return Optional.of(new MySQLShowParser(lexerEngine));
                    return Optional.of(new MySQLShowParser(shardingRule, lexerEngine));
                default:
                    return Optional.absent();
            }
+59 −0
Original line number Diff line number Diff line
/*
 * Copyright 1999-2015 dangdang.com.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * </p>
 */

package io.shardingjdbc.core.parsing.parser.token;

import io.shardingjdbc.core.util.SQLUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

/**
 * Schema token.
 *
 * @author zhangliang
 */
@RequiredArgsConstructor
@ToString
public final class SchemaToken implements SQLToken {
    
    @Getter
    private final int beginPosition;
    
    @Getter
    private final String originalLiterals;
    
    private final String tableName;
    
    /**
     * Get schema name.
     * 
     * @return schema name
     */
    public String getSchemaName() {
        return SQLUtil.getExactlyValue(originalLiterals);
    }
    
    /**
     * Get table name.
     *
     * @return table name
     */
    public String getTableName() {
        return SQLUtil.getExactlyValue(tableName);
    }
}
Loading