22-1.sharding-jdbc源码之INSERT解析

本文详细解析了Sharding-JDBC如何处理INSERT语句的源码,包括从lexerEngine.nextToken()开始的7个步骤,分析了如何解析表名、列、值以及处理不支持的语法和生成主键等过程。
摘要由CSDN通过智能技术生成

阿飞Javaer,转载请注明原创出处,谢谢!!

INSERT语法

分析insert解析之前,首先看一下mysql官方对insert语法的定义,因为SQL解析跟语法息息相关:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...
    [ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    SET assignment_list
    [ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    SELECT ...
    [ON DUPLICATE KEY UPDATE assignment_list]

摘自https://dev.mysql.com/doc/refman/8.0/en/insert.html

INSERT解析

接下来分析sharding-jdbc是如何解析insert类型的SQL语句的,通过SQLStatement result = sqlParser.parse();得到SQL解析器后,执行AbstractInsertParserparse()方法解析insert sql,核心源码如下:

@Override
public final DMLStatement parse() {
    lexerEngine.nextToken();
    InsertStatement result = new InsertStatement();
    insertClauseParserFacade.getInsertIntoClauseParser().parse(result);
    insertClauseParserFacade.getInsertColumnsClauseParser().parse(result);
    if (lexerEngine.equalAny(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
        throw new UnsupportedOperationException("Cannot INSERT SELECT");
    }
    insertClauseParserFacade.getInsertValuesClauseParser().parse(result);
    insertClauseParserFacade.getInsertSetClauseParser().parse(result);
    appendGenerateKey(result);
    return result;
}

对应的泳道图如下所示:
INSERT解析泳道图

第1步-lexerEngine.nextToken()

由parse()源码可知,insert解析第1步就是调用 lexerEngine.nextToken(),nextToken()在之前的文章已经分析过(戳链接),即跳到下一个token,由于任意SQL解析都会在SQLParsing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值