方便更快捷的说明问题,可以按需填写(可删除)
使用环境:idea调用shardingjdbc5.0.0的jar包
场景、问题:
已进行操作:
创建视图时报了空指针异常 看了一下数据库里面还创建成功了
有大佬遇到这个问题嘛
方便更快捷的说明问题,可以按需填写(可删除)
创建视图时报了空指针异常 看了一下数据库里面还创建成功了
有大佬遇到这个问题嘛
配置如下 一主两从
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.
感谢反馈,目前 PG 还有些语句解析不支持,我们正在完善中。