shardingjdbc5.0.0创建视图报空指针异常

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:idea调用shardingjdbc5.0.0的jar包

场景、问题:


已进行操作:

创建视图时报了空指针异常 看了一下数据库里面还创建成功了
1649670999(1)
有大佬遇到这个问题嘛

现状:

@whu-咸鱼 感谢反馈,student 表是分片表吗?麻烦提供下配置。

配置如下 一主两从

private static DataSource getMasterSlaveDataSource() throws SQLException {

    List<ReadwriteSplittingDataSourceRuleConfiguration> dsConfigurations = new ArrayList<>();
    dsConfigurations.add(new ReadwriteSplittingDataSourceRuleConfiguration("ds", null, "ds_master",Arrays.asList("ds_slave","ds_slave2"), "load_balancer"));
    //负载均衡算法配置
    Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers = new HashMap<>();
    loadBalancers.put("load_balancer", new ShardingSphereAlgorithmConfiguration("ROUND_ROBIN", new Properties()));
    ReadwriteSplittingRuleConfiguration ruleConfiguration = new ReadwriteSplittingRuleConfiguration(dsConfigurations, loadBalancers);
    //创建DS
    return ShardingSphereDataSourceFactory.createDataSource(createDataSourceMap(), Collections.singleton(ruleConfiguration), new Properties());

}

/**
 * 用 主从库的 DataSource 构造 map
 * @return
 */
private static Map<String, DataSource> createDataSourceMap() {
    Map<String, DataSource> result = new HashMap<>();
    result.put("ds_master", dsMaster);
    result.put("ds_slave", dsSlave);
    result.put("ds_slave2", dsSlave2);
    return result;
}

我看到问题所在了
在CreateViewStatementSchemaRefresher这个类里
有一行:String viewName = sqlStatement.getView().getTableName().getIdentifier().getValue();
而getView是空的。
在PostgreSQLDDLStatementSQLVisitor里面
public ASTNode visitCreateView(final CreateViewContext ctx) {
return new PostgreSQLCreateViewStatement();
}
直接返回一个新的PostgreSQLCreateViewStatement 没有做相应的处理。
我改了一下g4文件
createView
: CREATE (OR REPLACE)? (TEMP | TEMPORARY)? RECURSIVE? VIEW tableName
(LP_ (columnList (COMMA_ columnList)*)? RP_)?
(WITH reloptions)?
AS select
(WITH (CASCADE | LOCAL)? CHECK OPTION)?
;
只是把加粗的部分从qualifiedName变成tableName
生成了新的parser和lexer后
把这段代码改成
public ASTNode visitCreateView(final CreateViewContext ctx) {
PostgreSQLCreateViewStatement result = new PostgreSQLCreateViewStatement();
result.setView((SimpleTableSegment) visit(ctx.tableName()));
return result;
}
现在勉强能用了 至少没遇到什么错误

我也复现了问题,下个版本会增强下 PG 视图的功能

已提交 PR 优化——Support PostgreSQL/openGauss create view, alter view and drop view statements with single table by strongduanmu · Pull Request #16771 · apache/shardingsphere · GitHub ,欢迎在 PR merge 之后帮忙验证。

好的没有问题 谢谢

我还发现了适配pg数据库的一些问题:
1.不能执行无参的excute 语句 如 excute fooblen; 会报解析错误
调整一下g4文件加了个?就解决了
2.


create table tablename as 会报解析错误
而create table tablename() as不报错 也是g4文件有问题
在createTable 下的(createDefinitionClause | (OF anyName (LP_ typedTableElementList RP_)?) | (PARTITION OF qualifiedName (LP_ typedTableElementList RP_)? partitionBoundSpec))后加个?也能解决。
3.当create临时表或临时视图后 只有主库上有这个临时表和临时视图 而select 临时表时 发从库就会报错。目前我是建了个数据结构来存储临时表名/临时视图名 当select时比较是否查了临时表和临时视图解决的。

感谢反馈,目前 PG 还有些语句解析不支持,我们正在完善中。

京ICP备2021015875号