[
https://issues.apache.org/jira/browse/HIVE-24373?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
mahesh kumar behera updated HIVE-24373:
---------------------------------------
Attachment: HIVE-24373.patch
> Wrong predicate is pushed down for view with constant value projection.
> -----------------------------------------------------------------------
>
> Key: HIVE-24373
> URL: https://issues.apache.org/jira/browse/HIVE-24373
> Project: Hive
> Issue Type: Bug
> Reporter: mahesh kumar behera
> Assignee: mahesh kumar behera
> Priority: Major
> Attachments: HIVE-24373-explain-paln.txt, HIVE-24373.patch
>
>
> For below query the predicate pushed down for one of the table scan is not
> proper.
>
> {code:java}
> set hive.explain.user=false;
> set hive.cbo.enable=false;
> set hive.optimize.ppd=true;DROP TABLE arc;
> CREATE table arc(`dt_from` string, `dt_to` string);
> CREATE table loc1(`dt_from` string, `dt_to` string);
> CREATE
> VIEW view AS
> SELECT
> '9999' as DT_FROM,
> uuid() as DT_TO
> FROM
> loc1
> UNION ALL
> SELECT
> dt_from as DT_FROM,
> uuid() as DT_TO
> FROM
> arc;
> EXPLAIN
> SELECT
> dt_from, dt_to
> FROM
> view
> WHERE
> '2020' between dt_from and dt_to;
> {code}
>
> For table loc1, DT_FROM is projected as '9999' so the predicate "predicate:
> '2020' BETWEEN '9999' AND _col1 (type: boolean)" is proper. But for table
> arc, the column is projected so the predicate should be "predicate: '2020'
> BETWEEN _col0 (type: boolean) AND _col1 (type: boolean)".
> This is because the predicates are stored in a map for each expression. Here
> the expression is "_col0". When the predicate is pushed down the union, the
> same predicate is used for creating the filter expression. Later when
> constant replacement is done, the first filter is overwriting the second one.
> So we should create a clone (as done at other places) before using the cached
> predicate for filter. This way the overwrite can be avoided.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)