ShardingSphere LogicSQL 的生成探索

本文详细探讨了ShardingSphere LogicSQL的生成过程,从源码角度出发,揭示了从逻辑SQL到真实SQL转换的关键步骤。通过分析SQLToken的生成和SQL语句的构造,特别指出在OrderRepositoryImpl.java中触发的解析过程,以及在MySQLStatementParser.java中的复杂解析逻辑,包括插入语句的处理。虽然解析规则复杂,但解析结果为构建真实的SQL提供了必要的元数据和索引信息。

简介

在上两篇文中,我们探索了SQLToken和真实SQL的生成的想关代码,本文继续来探索最开始的一个LogicSQL的生成,补全这一块拼图

源码探索

继续上面两篇的探索:

其中生成真实的SQL有两个要素:

  • 逻辑表名到真实表名的映射:这个在SQLToken生成的
  • 拼接SQL语句时,对应的index位置,这个目前看来是在LogicSQL中就生成好了的

目前就还差index生成的东西,我们接下来就看看LogicSQL的相关代码:

寻找切入点

下面是LogicSQL的生成部分:

    private ExecutionContext createExecutionContext() {
   
   
        LogicSQL logicSQL = createLogicSQL();
        SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(), logicSQL.getParameters(), 
                metaDataContexts.getMetaData(connection.getSchemaName()).getRuleMetaData().getRules(), connection.getSchemaName(), metaDataContexts.getMetaDataMap(), null);
        ExecutionContext result = kernelProcessor.generateExecutionContext(logicSQL, metaDataContexts.getMetaData(connection.getSchemaName()), metaDataContexts.getProps());
        findGeneratedKey(result).ifPresent(generatedKey -> generatedValues.addAll(generatedKey.getGeneratedValues()));
        return result;
    }
    
    private LogicSQL createLogicSQL() {
   
   
        List<Object> parameters = new ArrayList<>(getParameters());
        SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), parameters, sqlStatement, connection.getSchemaName());
        return new LogicSQL(sqlStatementContext, sql, parameters);
    }

但通过debug看到相关的东西其实之前就生成好了:

image.png

其中的preparedStatement就有了相关的index信息,看来是在某一步就初始化好了的,我们找到对应的初始化语句,如下:

# ShardingSpherePreparedStatement.java
    private ShardingSpherePreparedStatement(final ShardingSphereConnection connection, final String sql,
                                            final int resultSetType, final int resultSetConcurrency, final
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值