@sunshine_22 您好,针对社区issue:https://gitee.com/opengauss/openGauss-server/issues/I5MDRL 根据排查,我们认为generate_series函数表现符合逻辑。相关场景下generate_series函数的执行详细如下:
在openGauss,若使用多个generate_series函数执行insert操作,插入的行数将会是这些generate_series产生数据个数的最小公倍数。以描述的内容为例: # 插入行数为2和3的最小公倍数6 insert into k1 values(generate_series(1,2),generate_series(1,3)); # 插入行数为2和4的最小公倍数4 insert into k1 values(generate_series(1,2),generate_series(1,4)); # 插入行数为2和5的最小公倍数10 insert into k1 values(generate_series(1,2),generate_series(1,5)); 类似地,若执行语句 insert into k1 values(generate_series(1,2),generate_series(1,3),generate_series(1,5)); 这里将会插入30行数据。 为了更直观地体现每行插入流程,我们将对描述中的表格执行以下语句: insert into k1 values(generate_series(1,2),generate_series(3,5)); 这里,generate_series函数将被调用17次来产生数据:
1. generate_series(1,2)产生数字1 2. generate_series(3,5)产生数字3 这里,表格将会插入第一行数据(1,3) 3. generate_series(1,2)产生数字2 4. generate_series(3,5)产生数字4 这里,表格将会插入第二行数据(2,4) 5. generate_series(1,2)产生数字3。由于产生的数字超过了其范围,这里会将generate_series(1,2)状态改为DONE,数字3不会被返回。 6. generate_series(3,5)产生数字5 7. 由于generate_series(3,5)仍能产生内容,且generate_series(1,2)由于结束而没有输出结果与之匹配,这里会重新启动generate_series(1,2),使其产生数字1 这里,表格将会插入第三行数据(1,5) 8. generate_series(1,2)产生数字2 9. generate_series(3,5)产生数字6。不返回并将状态设置为DONE 10. 与第7步相似,由于generate_series(1,2)仍未结束,generate_series(3,5)将重头开始产生数字3与之匹配,这里产生数字3. 这里,表格将会插入第四行数据(2,3) 11. generate_series(1,2)产生数字3。不返回并将状态设置为DONE 12. generate_series(3,5)产生数字4 13. 与第7步相似,generate_series(1,2)将重头产生数字1. 这里,表格将会插入第五行数据(1,4) 14. generate_series(1,2)产生数字2 15. generate_series(3,5)产生数字5 这里,表格将会插入第六行数据(2,5) 16. generate_series(1,2)产生数字3,不返回,状态改为DONE 17. generate_series(3,5)产生数字6,不返回,状态改为DONE 至此,所有generate_series函数都已经结束,插入完成 综上所述,generate_series的行为是符合逻辑的。
如果您还有其他疑问,欢迎与我们继续讨论。如果没有收到您其他疑问的信息,我们将在本周关闭此issue。
谢谢!