Sign in
Sign up
Explore
Enterprise
Education
Search
Help
Terms of use
About Us
Explore
Enterprise
Education
Gitee Premium
Gitee AI
Sign in
Sign up
Fetch the repository succeeded.
Open Source
>
Database Related
>
Database Service
&&
Donate
Please sign in before you donate.
Cancel
Sign in
Scan WeChat QR to Pay
Cancel
Complete
Prompt
Switch to Alipay.
OK
Cancel
Watch
Unwatch
Watching
Releases Only
Ignoring
442
Star
1.5K
Fork
1.8K
openGauss
/
openGauss-server
Code
Issues
963
Pull Requests
165
Wiki
Insights
Pipelines
Service
Quality Analysis
Jenkins for Gitee
Tencent CloudBase
Tencent Cloud Serverless
悬镜安全
Aliyun SAE
Codeblitz
SBOM
Don’t show this again
Update failed. Please try again later!
Remove this flag
Content Risk Flag
This task is identified by
as the content contains sensitive information such as code security bugs, privacy leaks, etc., so it is only accessible to contributors of this repository.
支持包含union子查询的谓词下推
In Design
#IBEWNV
Requirement
dyyy
Opened this issue
2024-12-31 15:37
【需求背景】 【需求描述】 <!-- #请详细说明需求需要做什么事情,达成什么样的效果 --> 【其他说明】 用例构造: -- 创建 PROMOTIONS 表 CREATE TABLE PROMOTIONS ( PROMO_ID INT PRIMARY KEY, PROD_ID VARCHAR(50), PROMO_NAME VARCHAR(100) ); -- 创建 SALES 表 CREATE TABLE SALES ( PROD_ID VARCHAR(50), AMOUNT_SOLD INT, PROMO_ID INT ); -- 创建 COSTS 表 CREATE TABLE COSTS ( PROD_ID VARCHAR(50), UNIT_PRICE DECIMAL(10, 2), PROMO_ID INT ); -- 创建 PRODUCTS 表 CREATE TABLE PRODUCTS ( PROD_ID VARCHAR(50) PRIMARY KEY, PROD_NAME VARCHAR(100), CATEGORY VARCHAR(50), DESCRIPTION varchar(50) ); create index idx1 on PROMOTIONS(PROD_ID); create index idx2 on SALES(PROD_ID); create index idx3 on SALES(PROMO_ID); create index idx4 on COSTS(PROD_ID); create index idx5 on COSTS(PROMO_ID); CREATE OR REPLACE PROCEDURE GenerateData(IN numRows INT) LANGUAGE plpgsql AS $$ DECLARE i INT := 0; BEGIN -- 生成 PRODUCTS 数据 WHILE i < numRows LOOP INSERT INTO PRODUCTS (PROD_ID, PROD_NAME, CATEGORY, DESCRIPTION) VALUES (CONCAT('P', i), CONCAT('Product ', i), 'Category ' || (i % 5), 'Description for product ' || (i % 10)); i := i + 1; END LOOP; i := 0; -- 生成 PROMOTIONS 数据 WHILE i < numRows LOOP INSERT INTO PROMOTIONS (PROMO_ID, PROD_ID, PROMO_NAME) VALUES (i, CONCAT('P', FLOOR(RANDOM() * numRows)), CONCAT('Promotion ', i)); i := i + 1; END LOOP; i := 0; -- 生成 SALES 数据 WHILE i < numRows LOOP INSERT INTO SALES (PROD_ID, AMOUNT_SOLD, PROMO_ID) VALUES (CONCAT('P', FLOOR(RANDOM() * numRows)), FLOOR(RANDOM() * 1000), FLOOR(RANDOM() * numRows)); i := i + 1; END LOOP; i := 0; -- 生成 COSTS 数据 WHILE i < numRows LOOP INSERT INTO COSTS (PROD_ID, UNIT_PRICE, PROMO_ID) VALUES (CONCAT('P', FLOOR(RANDOM() * numRows)), ROUND(RANDOM() * 100, 2), FLOOR(RANDOM() * numRows)); i := i + 1; END LOOP; END; $$; -- 使用存储过程 CALL GenerateData(10000); -- 生成 10000 行数据 执行用例无法下推: select prod.* from PROMOTIONS prod join ( select AMOUNT_SOLD,s.PROMO_ID from sales s union select UNIT_PRICE,c.PROMO_ID from COSTS c ) V on prod.PROMO_ID=v.PROMO_ID and prod.prod_id = 'P8289'; 需要手动下推,修改SQL为: select prod.* from PROMOTIONS prod join ( select AMOUNT_SOLD,s.PROMO_ID from sales s where s.PROMO_ID in (select PROMO_ID from PROMOTIONS where prod_id = 'P8289') union select UNIT_PRICE,c.PROMO_ID from COSTS c where c.PROMO_ID in (select PROMO_ID from PROMOTIONS where prod_id = 'P8289')) V on prod.PROMO_ID=v.PROMO_ID and prod.prod_id = 'P8289';
【需求背景】 【需求描述】 <!-- #请详细说明需求需要做什么事情,达成什么样的效果 --> 【其他说明】 用例构造: -- 创建 PROMOTIONS 表 CREATE TABLE PROMOTIONS ( PROMO_ID INT PRIMARY KEY, PROD_ID VARCHAR(50), PROMO_NAME VARCHAR(100) ); -- 创建 SALES 表 CREATE TABLE SALES ( PROD_ID VARCHAR(50), AMOUNT_SOLD INT, PROMO_ID INT ); -- 创建 COSTS 表 CREATE TABLE COSTS ( PROD_ID VARCHAR(50), UNIT_PRICE DECIMAL(10, 2), PROMO_ID INT ); -- 创建 PRODUCTS 表 CREATE TABLE PRODUCTS ( PROD_ID VARCHAR(50) PRIMARY KEY, PROD_NAME VARCHAR(100), CATEGORY VARCHAR(50), DESCRIPTION varchar(50) ); create index idx1 on PROMOTIONS(PROD_ID); create index idx2 on SALES(PROD_ID); create index idx3 on SALES(PROMO_ID); create index idx4 on COSTS(PROD_ID); create index idx5 on COSTS(PROMO_ID); CREATE OR REPLACE PROCEDURE GenerateData(IN numRows INT) LANGUAGE plpgsql AS $$ DECLARE i INT := 0; BEGIN -- 生成 PRODUCTS 数据 WHILE i < numRows LOOP INSERT INTO PRODUCTS (PROD_ID, PROD_NAME, CATEGORY, DESCRIPTION) VALUES (CONCAT('P', i), CONCAT('Product ', i), 'Category ' || (i % 5), 'Description for product ' || (i % 10)); i := i + 1; END LOOP; i := 0; -- 生成 PROMOTIONS 数据 WHILE i < numRows LOOP INSERT INTO PROMOTIONS (PROMO_ID, PROD_ID, PROMO_NAME) VALUES (i, CONCAT('P', FLOOR(RANDOM() * numRows)), CONCAT('Promotion ', i)); i := i + 1; END LOOP; i := 0; -- 生成 SALES 数据 WHILE i < numRows LOOP INSERT INTO SALES (PROD_ID, AMOUNT_SOLD, PROMO_ID) VALUES (CONCAT('P', FLOOR(RANDOM() * numRows)), FLOOR(RANDOM() * 1000), FLOOR(RANDOM() * numRows)); i := i + 1; END LOOP; i := 0; -- 生成 COSTS 数据 WHILE i < numRows LOOP INSERT INTO COSTS (PROD_ID, UNIT_PRICE, PROMO_ID) VALUES (CONCAT('P', FLOOR(RANDOM() * numRows)), ROUND(RANDOM() * 100, 2), FLOOR(RANDOM() * numRows)); i := i + 1; END LOOP; END; $$; -- 使用存储过程 CALL GenerateData(10000); -- 生成 10000 行数据 执行用例无法下推: select prod.* from PROMOTIONS prod join ( select AMOUNT_SOLD,s.PROMO_ID from sales s union select UNIT_PRICE,c.PROMO_ID from COSTS c ) V on prod.PROMO_ID=v.PROMO_ID and prod.prod_id = 'P8289'; 需要手动下推,修改SQL为: select prod.* from PROMOTIONS prod join ( select AMOUNT_SOLD,s.PROMO_ID from sales s where s.PROMO_ID in (select PROMO_ID from PROMOTIONS where prod_id = 'P8289') union select UNIT_PRICE,c.PROMO_ID from COSTS c where c.PROMO_ID in (select PROMO_ID from PROMOTIONS where prod_id = 'P8289')) V on prod.PROMO_ID=v.PROMO_ID and prod.prod_id = 'P8289';
Comments (
2
)
Sign in
to comment
Status
In Design
In Design
Fixing
方案设计
Backlog
需求分析
需求认领
需求评议
需求接纳
Declined
Done
Accepted
资料验收
Confirmed
挂起
Assignees
Not set
Labels
Not set
Projects
Unprojected
Unprojected
Milestones
No related milestones
No related milestones
Pull Requests
None yet
None yet
Successfully merging a pull request will close this issue.
Branches
No related branch
Branches (17)
Tags (29)
master
6.0.0
7.0.0-RC1
master_bak08271930
5.0.0
bugfix_0725
3.0.0
iud_dev
dev_board
5.1.0
kms
2.0.0
3.1.0
2.1.0
1.1.0
1.0.1
1.0.0
v6.0.2
v7.0.0-RC1
v6.0.1
v3.0.6
v6.0.0
v3.0.5B009
v5.0.3
v5.0.2
v6.0.0-RC1
v3.0.5
v5.0.1
v5.1.0
5.1.0
v5.0.0
v3.0.3
v3.1.1
v3.0.2
v3.1.0
v2.0.5
v3.0.1
v2.0.4
v2.0.3
v3.0.0
v2.1.0
v2.0.1
v2.0.0
v1.1.0
v1.0.1
v1.0.0
Planed to start   -   Planed to end
-
Top level
Not Top
Top Level: High
Top Level: Medium
Top Level: Low
Priority
Not specified
Serious
Main
Secondary
Unimportant
Duration
(hours)
参与者(1)
C++
1
https://gitee.com/opengauss/openGauss-server.git
git@gitee.com:opengauss/openGauss-server.git
opengauss
openGauss-server
openGauss-server
Going to Help Center
Search
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
Repository Report
Back to the top
Login prompt
This operation requires login to the code cloud account. Please log in before operating.
Go to login
No account. Register