You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by "ASF subversion and git services (Jira)" <ji...@apache.org> on 2020/11/12 19:09:00 UTC

[jira] [Commented] (ASTERIXDB-2798) Limit pushdown not working when SQL++ functions are involved

    [ https://issues.apache.org/jira/browse/ASTERIXDB-2798?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17230867#comment-17230867 ] 

ASF subversion and git services commented on ASTERIXDB-2798:
------------------------------------------------------------

Commit 4ca89b5d5b989d4017746b2277c39e9a4a2b1e7d in asterixdb's branch refs/heads/master from Dmitry Lychagin
[ https://gitbox.apache.org/repos/asf?p=asterixdb.git;h=4ca89b5 ]

[ASTERIXDB-2798][COMP] Copy limit through subplans

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- CopyLimitDownRule should push limit through subplans

Change-Id: Ia5fa4b7a25cafadb6dd2c050749e851e7e2adec5
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/8846
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>
Reviewed-by: Ali Alsuliman <al...@gmail.com>


> Limit pushdown not working when SQL++ functions are involved
> ------------------------------------------------------------
>
>                 Key: ASTERIXDB-2798
>                 URL: https://issues.apache.org/jira/browse/ASTERIXDB-2798
>             Project: Apache AsterixDB
>          Issue Type: Bug
>          Components: COMP - Compiler, SQL - Translator SQL++
>    Affects Versions: 0.9.6
>            Reporter: Gift Sinthong
>            Assignee: Dmitry Lychagin
>            Priority: Major
>
> I created a function below.
>  
> {code:java}
> CREATE OR REPLACE FUNCTION drop_columns(r){ (SELECT VALUE OBJECT_REMOVE(t, 'nickname') FROM (SELECT VALUE OBJECT_REMOVE(t, 'gender') FROM (SELECT VALUE t FROM to_array(r) AS t) t) t)[0]};
> {code}
> Apply it to a dataset.
>  
>  
> {code:java}
> SELECT VALUE drop_columns(t) FROM (SELECT VALUE t FROM TinySocial.GleambookUsers t) t LIMIT 5;
> {code}
> Here is the resulting query plan. We don't get limit pushdown here.
>  
> {code:java}
> distribute result [$$65]
> -- DISTRIBUTE_RESULT  |UNPARTITIONED|
>   exchange
>   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
>     limit 5
>     -- STREAM_LIMIT  |UNPARTITIONED|
>       exchange
>       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
>         project ([$$65])
>         -- STREAM_PROJECT  |PARTITIONED|
>           assign [$$65] <- [get-item($$63, 0)]
>           -- ASSIGN  |PARTITIONED|
>             limit 5
>             -- STREAM_LIMIT  |PARTITIONED|
>               project ([$$63])
>               -- STREAM_PROJECT  |PARTITIONED|
>                 subplan {
>                           aggregate [$$63] <- [listify($$62)]
>                           -- AGGREGATE  |LOCAL|
>                             assign [$$62] <- [object-remove(object-remove($$t, "gender"), "nickname")]
>                             -- ASSIGN  |LOCAL|
>                               unnest $$t <- scan-collection($$57)
>                               -- UNNEST  |LOCAL|
>                                 nested tuple source
>                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
>                        }
>                 -- SUBPLAN  |PARTITIONED|
>                   project ([$$57])
>                   -- STREAM_PROJECT  |PARTITIONED|
>                     assign [$$57] <- [to-array($$t)]
>                     -- ASSIGN  |PARTITIONED|
>                       project ([$$t])
>                       -- STREAM_PROJECT  |PARTITIONED|
>                         exchange
>                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
>                           data-scan []<-[$$66, $$t] <- TinySocial.GleambookUsers
>                           -- DATASOURCE_SCAN  |PARTITIONED|
>                             exchange
>                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
>                               empty-tuple-source
>                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
> {code}
> Instead, if we do the query below we do get limit pushdown.
> {code:java}
> SELECT VALUE OBJECT_REMOVE(t, 'nickname') FROM (SELECT VALUE OBJECT_REMOVE(t, 'gender') FROM (SELECT VALUE t FROM TinySocial.GleambookUsers AS t) t) t LIMIT 5;
> {code}
> Here is that query plan.
> {code:java}
> distribute result [$$37]
> -- DISTRIBUTE_RESULT  |UNPARTITIONED|
>   exchange
>   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
>     limit 5
>     -- STREAM_LIMIT  |UNPARTITIONED|
>       project ([$$37])
>       -- STREAM_PROJECT  |PARTITIONED|
>         exchange
>         -- SORT_MERGE_EXCHANGE [$$38(ASC) ]  |PARTITIONED|
>           project ([$$38, $$37])
>           -- STREAM_PROJECT  |PARTITIONED|
>             assign [$$37] <- [object-remove(object-remove($$t, "gender"), "nickname")]
>             -- ASSIGN  |PARTITIONED|
>               limit 5
>               -- STREAM_LIMIT  |PARTITIONED|
>                 exchange
>                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
>                   data-scan []<-[$$38, $$t] <- TinySocial.GleambookUsers limit 5
>                   -- DATASOURCE_SCAN  |PARTITIONED|
>                     exchange
>                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
>                       empty-tuple-source
>                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
> {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)