This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new ebbfe1dfa27 branch-2.1: [fix](nereids) Fix query err when topn push 
through union_all #54158 (#54258)
ebbfe1dfa27 is described below

commit ebbfe1dfa270580118a3a19b72180e01b8f622bd
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Aug 6 11:47:37 2025 +0800

    branch-2.1: [fix](nereids) Fix query err when topn push through union_all 
#54158 (#54258)
    
    Cherry-picked from #54158
    
    Co-authored-by: seawinde <[email protected]>
---
 .../rules/rewrite/PushDownTopNThroughUnion.java    |   9 +-
 .../push_down_top_n_through_union.out              | Bin 4103 -> 10108 bytes
 .../push_down_top_n_through_union.groovy           | 238 +++++++++++++++++++++
 3 files changed, 244 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughUnion.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughUnion.java
index c13c1143efd..b02d7a1e45d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughUnion.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughUnion.java
@@ -22,6 +22,7 @@ import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.SetOperation.Qualifier;
 import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
@@ -63,11 +64,13 @@ public class PushDownTopNThroughUnion implements 
RewriteRuleFactory {
                         .then(topN -> {
                             LogicalUnion union = topN.child();
                             List<Plan> newChildren = new ArrayList<>();
-                            for (Plan child : union.children()) {
+                            for (int j = 0; j < union.children().size(); j++) {
+                                Plan child = union.child(j);
+                                List<SlotReference> regularChildOutput = 
union.getRegularChildOutput(j);
                                 Map<Expression, Expression> replaceMap = new 
HashMap<>();
-                                for (int i = 0; i < union.getOutputs().size(); 
++i) {
+                                for (int i = 0; i < regularChildOutput.size(); 
++i) {
                                     NamedExpression output = 
union.getOutputs().get(i);
-                                    replaceMap.put(output, 
child.getOutput().get(i));
+                                    replaceMap.put(output, 
regularChildOutput.get(i));
                                 }
 
                                 List<OrderKey> orderKeys = 
topN.getOrderKeys().stream()
diff --git 
a/regression-test/data/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.out
 
b/regression-test/data/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.out
index be8053d8349..6a32bbce857 100644
Binary files 
a/regression-test/data/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.out
 and 
b/regression-test/data/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.out
 differ
diff --git 
a/regression-test/suites/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.groovy
 
b/regression-test/suites/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.groovy
index fa0eacd5b30..b8555432865 100644
--- 
a/regression-test/suites/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.groovy
@@ -74,4 +74,242 @@ suite("push_down_top_n_through_union") {
     qt_push_down_topn_union_complex_conditions """
         explain shape plan select * from (select * from table1 t1 where 
t1.score > 10 and t1.name = 'Test' union all select * from table1 t2 where 
t2.id < 5 and t2.score < 20) sub order by id limit 10;
     """
+
+
+    sql "DROP TABLE IF EXISTS t1";
+
+    sql """
+    CREATE TABLE `t1` (
+
+    `logTimestamp` datetime NULL,
+
+    `args1` varchar(65533) NULL,
+
+    `args2` variant NULL,
+
+    `args3` int NULL,
+
+    `args4` text NULL,
+
+    `args5` varchar(65533) NULL,
+
+    `args6` varchar(65533) NULL,
+
+    `args7` varchar(200) NULL,
+
+    `args8` varchar(65533) NULL,
+
+    `args9` variant NULL,
+
+    `args10` variant NULL,
+
+    `args11` variant NULL,
+
+    `args12` variant NULL,
+
+    `args13` varchar(65533) NULL,
+
+    `args14` text NULL,
+
+    `args15` variant NULL,
+
+    `log` variant NULL
+    ) ENGINE=OLAP
+
+    DISTRIBUTED BY RANDOM BUCKETS 10
+
+    PROPERTIES (
+
+            "replication_num" = "1"
+
+    );"""
+
+    sql """
+    INSERT INTO t1 (
+            `logTimestamp`, `args1`, `args2`, `args3`, `args4`,
+            `args5`, `args6`, `args7`, `args8`, `args9`,
+            `args10`, `args11`, `args12`, `args13`, `args14`,
+            `args15`, `log`
+    ) VALUES
+
+    ('2025-07-31 09:15:22', 'username=admin&password=*****', 
'{"action":"login","status":"success"}', 200, 'User authentication successful',
+    '192.168.1.100', '/api/v1/auth/login', '192.168.1.100', 
'auth.example.com', '{"app":"authentication","env":"production"}',
+    
'{"country":"CN","city":"Beijing","coordinates":{"lat":39.9042,"lon":116.4074}}',
 '{"Content-Type":"application/json","Authorization":"Bearer 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"}', 
'{"server":"auth-node-01","region":"east-1"}', 
'https://portal.example.com/login', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
+    '{"source":"web","tags":["security","auth"]}', 
'{"timestamp":"2025-07-31T09:15:22Z","level":"INFO","message":"Successful login 
for user 
admin","context":{"ip":"192.168.1.100","user_agent":"Chrome/125.0.0.0","session_id":"sess_xyz123"}}'),
+
+
+    ('2025-07-31 11:30:45', 'product_id=789&quantity=2&price=59.99', 
'{"event":"purchase","payment_method":"credit_card"}', 201, 'Order processed 
successfully',
+    '192.168.1.101', '/api/v1/orders', '192.168.1.101', 'shop.example.com', 
'{"app":"ecommerce","env":"production","version":"3.2.1"}',
+    '{"country":"US","city":"New 
York","coordinates":{"lat":40.7128,"lon":-74.0060}}', 
'{"Content-Type":"application/json","X-CSRF-Token":"csrf_abc123","Accept":"application/json"}',
 '{"server":"shop-node-03","region":"us-east-1"}', 
'https://shop.example.com/product/789', 'Mozilla/5.0 (iPhone; CPU iPhone OS 
16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 
Mobile/15E148 Safari/604.1',
+    '{"source":"mobile","tags":["transaction","order"]}', 
'{"timestamp":"2025-07-31T11:30:45Z","level":"INFO","message":"New order 
created","context":{"order_id":"ord_789xyz","amount":119.98,"currency":"USD","customer_id":"cust_123abc"}}'),
+
+
+    ('2025-07-31 14:20:18', 'transaction_id=txn_987654&amount=199.99', 
'{"type":"payment","gateway":"stripe","currency":"USD"}', 202, 'Payment 
processing started',
+    '192.168.1.102', '/api/v1/payments', '192.168.1.102', 'pay.example.com', 
'{"app":"payment","env":"production","features":["3d_secure","refunds"]}',
+    
'{"country":"GB","city":"London","coordinates":{"lat":51.5074,"lon":-0.1278}}', 
'{"Content-Type":"application/json","X-Request-ID":"req_987xyz","Idempotency-Key":"idemp_123"}',
 '{"server":"payment-gw-02","region":"eu-west-2"}', 
'https://checkout.example.com/payment', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
+    '{"source":"web","tags":["finance","payment"]}', 
'{"timestamp":"2025-07-31T14:20:18Z","level":"INFO","message":"Payment 
initiated","context":{"transaction_id":"txn_987654","amount":199.99,"currency":"USD","customer":"cust_456def"}}'),
+
+
+    ('2025-07-31 16:45:33', 
'error_code=500&message=Database+connection+failed', 
'{"severity":"critical","component":"database"}', 500, 'Database connection 
error',
+    '192.168.1.103', '/api/v1/products', '192.168.1.103', 'api.example.com', 
'{"app":"api-gateway","env":"production","dependencies":["mysql","redis"]}',
+    
'{"country":"JP","city":"Tokyo","coordinates":{"lat":35.6762,"lon":139.6503}}', 
'{"Content-Type":"application/json","X-Correlation-ID":"corr_456mno"}', 
'{"server":"api-node-05","region":"ap-northeast-1"}', 
'https://app.example.com/products', 'Mozilla/5.0 (Linux; Android 13; SM-S901B) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36',
+    '{"source":"mobile","tags":["error","database"]}', 
'{"timestamp":"2025-07-31T16:45:33Z","level":"ERROR","message":"Failed to 
connect to database","context":{"error":"Connection 
timeout","attempts":3,"database":"products_db","duration_ms":5000}}'),
+
+
+    ('2025-07-31 19:05:07', 'query=smartphone&page=1&sort=price_asc', 
'{"search_type":"product","filters":["in_stock","free_shipping"]}', 200, 
'Search results returned',
+    '192.168.1.104', '/api/v1/search', '192.168.1.104', 'search.example.com', 
'{"app":"search","env":"production","features":["autocomplete","faceted_search"]}',
+    
'{"country":"DE","city":"Berlin","coordinates":{"lat":52.5200,"lon":13.4050}}', 
'{"Content-Type":"application/json","X-Forwarded-For":"192.168.1.104, 
203.0.113.5"}', '{"server":"search-node-01","region":"eu-central-1"}', 
'https://www.example.com/search', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; 
rv:109.0) Gecko/20100101 Firefox/125.0',
+    '{"source":"web","tags":["search","query"]}', 
'{"timestamp":"2025-07-31T19:05:07Z","level":"INFO","message":"Search query 
processed","context":{"query":"smartphone","results_count":42,"response_time_ms":125,"filters_applied":2}}');
+   """
+
+    sql """
+    DROP TABLE IF EXISTS t2;
+    """
+
+    sql """
+    CREATE TABLE `t2` (
+
+    `logTimestamp` datetime NULL,
+
+    `args1` varchar(65533) NULL,
+
+    `args2` variant NULL,
+
+    `args3` int NULL,
+
+    `args4` text NULL,
+
+    `args5` varchar(65533) NULL,
+
+    `args6` varchar(65533) NULL,
+
+    `args7` varchar(200) NULL,
+
+    `args8` varchar(65533) NULL,
+
+    `args9` variant NULL,
+
+    `args10` variant NULL,
+
+    `args11` variant NULL,
+
+    `args12` variant NULL,
+
+    `args13` varchar(65533) NULL,
+
+    `args14` text NULL,
+
+    `args15` variant NULL,
+
+    `log` variant NULL
+
+    ) ENGINE=OLAP
+
+    DUPLICATE KEY(`logTimestamp`)
+
+    DISTRIBUTED BY RANDOM BUCKETS 10
+
+    PROPERTIES (
+
+            "replication_num" = "1"
+    );
+    """
+
+    sql """
+    INSERT INTO t2 (
+            `logTimestamp`, `args1`, `args2`, `args3`, `args4`,
+            `args5`, `args6`, `args7`, `args8`, `args9`,
+            `args10`, `args11`, `args12`, `args13`, `args14`,
+            `args15`, `log`
+    ) VALUES
+
+    ('2025-07-31 10:15:30', 'user_id=123&action=login', 
'{"type":"authentication","status":"success"}', 200, 'User login successful',
+    '192.168.1.100', '/api/v1/login', '192.168.1.100', 'api.example.com', 
'{"app":"web","env":"production"}',
+    '{"country":"China","city":"Beijing"}', 
'{"Content-Type":"application/json","Authorization":"Bearer abc123"}', 
'{"hostname":"web-server-01"}', 'https://referer.example.com', 'Mozilla/5.0 
(Windows NT 10.0; Win64; x64)',
+    '{"input_type":"http","tags":["auth","prod"]}', 
'{"timestamp":"2025-07-31T10:15:30Z","level":"info","message":"login 
success"}'),
+
+
+    ('2025-07-31 11:30:45', 'product_id=456&category=electronics', 
'{"type":"product_view","device":"mobile"}', 304, 'Product page viewed',
+    '192.168.1.101', '/products/456', '192.168.1.101', 'shop.example.com', 
'{"app":"ecommerce","env":"staging"}',
+    '{"country":"USA","city":"New York"}', 
'{"Content-Type":"text/html","Cache-Control":"max-age=3600"}', 
'{"hostname":"shop-server-02"}', 'https://search.example.com', 'Mozilla/5.0 
(iPhone; CPU iPhone OS 15_0 like Mac OS X)',
+    '{"input_type":"http","tags":["shop","mobile"]}', 
'{"timestamp":"2025-07-31T11:30:45Z","level":"info","message":"product view"}'),
+
+
+    ('2025-07-31 14:45:20', 'order_id=789&amount=99.99', 
'{"type":"payment","method":"credit_card"}', 201, 'Payment processed',
+    '192.168.1.102', '/api/v1/payments', '192.168.1.102', 'pay.example.com', 
'{"app":"payment","env":"production"}',
+    '{"country":"UK","city":"London"}', 
'{"Content-Type":"application/json","X-CSRF-Token":"xyz789"}', 
'{"hostname":"payment-gateway-01"}', 'https://checkout.example.com', 
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)',
+    '{"input_type":"api","tags":["payment","prod"]}', 
'{"timestamp":"2025-07-31T14:45:20Z","level":"info","message":"payment 
success"}'),
+
+
+    ('2025-07-31 16:30:10', 'search_term=laptop&page=2', 
'{"type":"search","results_count":25}', 200, 'Search results returned',
+    '192.168.1.103', '/search', '192.168.1.103', 'search.example.com', 
'{"app":"search","env":"production"}',
+    '{"country":"Japan","city":"Tokyo"}', 
'{"Content-Type":"application/json","Accept-Language":"en-US"}', 
'{"hostname":"search-server-03"}', 'https://www.example.com', 'Mozilla/5.0 
(Linux; Android 11; SM-G991B)',
+    '{"input_type":"search","tags":["search","prod"]}', 
'{"timestamp":"2025-07-31T16:30:10Z","level":"info","message":"search query"}'),
+
+
+    ('2025-07-31 18:15:55', 'error_code=500&message=Internal+Server+Error', 
'{"type":"error","severity":"high"}', 500, 'Internal server error occurred',
+    '192.168.1.104', '/api/v1/users', '192.168.1.104', 'api.example.com', 
'{"app":"web","env":"production"}',
+    '{"country":"Germany","city":"Berlin"}', 
'{"Content-Type":"application/json","X-Request-ID":"req123"}', 
'{"hostname":"web-server-02"}', 'https://client.example.com', 'Mozilla/5.0 
(Windows NT 10.0; Win64; x64)',
+    '{"input_type":"error","tags":["error","prod"]}', 
'{"timestamp":"2025-07-31T18:15:55Z","level":"error","message":"server 
error"}');
+     """
+
+
+    sql "DROP VIEW IF EXISTS view_test"
+
+
+    sql """
+    CREATE VIEW `view_test`AS
+    SELECT   t1.`logTimestamp`,
+    t1.`args1`,
+    t1.`args2`,
+    t1.`args3`,
+    t1.`args4`,
+    t1.`args5`,
+    t1.`args6`,
+    t1.`args7`,
+    t1.`args8`,
+    t1.`args9`,
+    t1.`args10`,
+    t1.`args11`,
+    t1.`args12`,
+    t1.`args13`,
+    t1.`args14`,
+    t1.`args15`,
+    t1.`log`
+    FROM t1
+    UNION all
+    SELECT   t2.`logTimestamp`,
+    t2.`args1`,
+    t2.`args2`,
+    t2.`args3`,
+    t2.`args4`,
+    t2.`args5`,
+    t2.`args6`,
+    t2.`args7`,
+    t2.`args8`,
+    t2.`args9`,
+    t2.`args10`,
+    t2.`args11`,
+    t2.`args12`,
+    t2.`args13`,
+    t2.`args14`,
+    t2.`args15`,
+    t2.`log`
+    FROM t2;
+    """
+
+
+    order_qt_union_all_push_down_top_n """
+    SELECT `args1`, `args2`, `args3`, `args4`, `args5`, `args6`, `args7`, 
`args8`, `args9`, `args10`, `args11`, `args12`, `args13`, `args14`, `args15`, 
`log`, logTimestamp
+    FROM view_test
+    ORDER BY logTimestamp desc
+    LIMIT 8;"""
+
+
+    order_qt_union_all_push_down_top_n_shape """
+    explain shape plan SELECT `args1`, `args2`, `args3`, `args4`, `args5`, 
`args6`, `args7`, `args8`, `args9`, `args10`, `args11`, `args12`, `args13`, 
`args14`, `args15`, `log`, logTimestamp
+    FROM view_test
+    ORDER BY logTimestamp desc
+    LIMIT 8;
+    """
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to