[ https://issues.apache.org/jira/browse/HIVE-10811?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14560335#comment-14560335 ]
Laljo John Pullokkaran commented on HIVE-10811: ----------------------------------------------- Why do we need to keep the fields from input that is part of the collation but is not used by parent. If no operators from parent refer to that column then i don't see how preserving sort order is helpful. > RelFieldTrimmer throws NoSuchElementException in some cases > ----------------------------------------------------------- > > Key: HIVE-10811 > URL: https://issues.apache.org/jira/browse/HIVE-10811 > Project: Hive > Issue Type: Bug > Components: CBO > Reporter: Jesus Camacho Rodriguez > Assignee: Jesus Camacho Rodriguez > Attachments: HIVE-10811.01.patch, HIVE-10811.02.patch, > HIVE-10811.patch > > > RelFieldTrimmer runs into NoSuchElementException in some cases. > Stack trace: > {noformat} > Exception in thread "main" java.lang.AssertionError: Internal error: While > invoking method 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Sort,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trim(RelFieldTrimmer.java:175) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner$CalcitePlannerAction.applyPreJoinOrderingTransforms(CalcitePlanner.java:947) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner$CalcitePlannerAction.apply(CalcitePlanner.java:820) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner$CalcitePlannerAction.apply(CalcitePlanner.java:768) > at org.apache.calcite.tools.Frameworks$1.apply(Frameworks.java:109) > at > org.apache.calcite.prepare.CalcitePrepareImpl.perform(CalcitePrepareImpl.java:730) > at org.apache.calcite.tools.Frameworks.withPrepare(Frameworks.java:145) > at org.apache.calcite.tools.Frameworks.withPlanner(Frameworks.java:105) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.getOptimizedAST(CalcitePlanner.java:607) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.genOPTree(CalcitePlanner.java:244) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:10048) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.analyzeInternal(CalcitePlanner.java:207) > at > org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:227) > at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:424) > at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:308) > at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1122) > at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1170) > at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1059) > at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1049) > at > org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:213) > at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:165) > at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376) > at > org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:736) > at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681) > at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.hadoop.util.RunJar.run(RunJar.java:221) > at org.apache.hadoop.util.RunJar.main(RunJar.java:136) > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 32 more > Caused by: java.lang.AssertionError: Internal error: While invoking method > 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Sort,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:210) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:499) > ... 37 more > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 40 more > Caused by: java.lang.AssertionError: Internal error: While invoking method > 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Project,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:210) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:499) > ... 45 more > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 48 more > Caused by: java.lang.AssertionError: Internal error: While invoking method > 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Aggregate,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:210) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:345) > ... 53 more > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 56 more > Caused by: java.lang.AssertionError: Internal error: While invoking method > 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Project,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:210) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:772) > ... 61 more > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 64 more > Caused by: java.lang.AssertionError: Internal error: While invoking method > 'public org.apache.calcite.sql2rel.RelFieldTrimmer$TrimResult > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(org.apache.calcite.rel.core.Project,org.apache.calcite.util.ImmutableBitSet,java.util.Set)' > at org.apache.calcite.util.Util.newInternal(Util.java:743) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:543) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:269) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:210) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:345) > ... 69 more > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:536) > ... 72 more > Caused by: java.util.NoSuchElementException > at java.util.AbstractList$Itr.next(AbstractList.java:364) > at java.util.AbstractList.hashCode(AbstractList.java:540) > at org.apache.calcite.util.Util.hash(Util.java:230) > at org.apache.calcite.util.Pair.hashCode(Pair.java:87) > at > com.google.common.base.Equivalences$Equals.doHash(Equivalences.java:70) > at com.google.common.base.Equivalence.hash(Equivalence.java:105) > at com.google.common.cache.LocalCache.hash(LocalCache.java:1888) > at com.google.common.cache.LocalCache.getIfPresent(LocalCache.java:3953) > at > com.google.common.cache.LocalCache$LocalManualCache.getIfPresent(LocalCache.java:4758) > at > org.apache.calcite.rel.type.RelDataTypeFactoryImpl.canonize(RelDataTypeFactoryImpl.java:352) > at > org.apache.calcite.rel.type.RelDataTypeFactoryImpl.createStructType(RelDataTypeFactoryImpl.java:148) > at > org.apache.calcite.rel.type.RelDataTypeFactoryImpl.createStructType(RelDataTypeFactoryImpl.java:172) > at org.apache.calcite.plan.RelOptUtil.permute(RelOptUtil.java:2589) > at > org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:383) > ... 77 more > {noformat} > query: > {noformat} > SELECT w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > ship_carriers, > year, > Sum(jan_sales) AS jan_sales, > Sum(feb_sales) AS feb_sales, > Sum(jan_sales / w_warehouse_sq_ft) AS jan_sales_per_sq_foot, > Sum(feb_sales / w_warehouse_sq_ft) AS feb_sales_per_sq_foot, > Sum(jan_net) AS jan_net, > Sum(feb_net) AS feb_net > FROM (SELECT w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > Concat('DHL', ',', 'BARIAN') AS ship_carriers, > d_year AS year, > Sum(CASE > WHEN d_moy = 1 THEN ws_ext_sales_price * ws_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS jan_sales, > Sum(CASE > WHEN d_moy = 2 THEN ws_ext_sales_price * ws_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS feb_sales, > Sum(CASE > WHEN d_moy = 1 THEN ws_net_paid * ws_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS jan_net, > Sum(CASE > WHEN d_moy = 2 THEN ws_net_paid * ws_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS feb_net > FROM web_sales > JOIN warehouse > ON web_sales.ws_warehouse_sk = warehouse.w_warehouse_sk > JOIN date_dim > ON web_sales.ws_sold_date_sk = date_dim.d_date_sk > JOIN time_dim > ON web_sales.ws_sold_time_sk = time_dim.t_time_sk > JOIN ship_mode > ON web_sales.ws_ship_mode_sk = ship_mode.sm_ship_mode_sk > WHERE d_year = 2001 > AND t_time BETWEEN 30838 AND 30838 + 28800 > AND sm_carrier IN ( 'DHL', 'BARIAN' ) > GROUP BY w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > d_year > UNION DISTINCT > SELECT w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > Concat('DHL', ',', 'BARIAN') AS ship_carriers, > d_year AS year, > Sum(CASE > WHEN d_moy = 1 THEN cs_sales_price * cs_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS jan_sales, > Sum(CASE > WHEN d_moy = 2 THEN cs_sales_price * cs_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS feb_sales, > Sum(CASE > WHEN d_moy = 1 THEN cs_net_paid_inc_tax * cs_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS jan_net, > Sum(CASE > WHEN d_moy = 2 THEN cs_net_paid_inc_tax * cs_quantity > ELSE Cast(0 AS DECIMAL(7, 2)) > end) AS feb_net > FROM catalog_sales > JOIN warehouse > ON catalog_sales.cs_warehouse_sk = warehouse.w_warehouse_sk > JOIN date_dim > ON catalog_sales.cs_sold_date_sk = date_dim.d_date_sk > JOIN time_dim > ON catalog_sales.cs_sold_time_sk = time_dim.t_time_sk > JOIN ship_mode > ON catalog_sales.cs_ship_mode_sk = ship_mode.sm_ship_mode_sk > WHERE d_year = 2001 > AND t_time BETWEEN 30838 AND 30838 + 28800 > AND sm_carrier IN ( 'DHL', 'BARIAN' ) > GROUP BY w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > d_year) x > GROUP BY w_warehouse_name, > w_warehouse_sq_ft, > w_city, > w_county, > w_state, > w_country, > ship_carriers, > year > ORDER BY w_warehouse_name > LIMIT 100; > {noformat} > Seems like use of Sum(jan_sales / w_warehouse_sq_ft) AS > jan_sales_per_sq_foot, > Sum(feb_sales / w_warehouse_sq_ft) AS feb_sales_per_sq_foot in the select > clause causing the error. > Query works fine if I turn off cbo or remove these two columns from select > clause. -- This message was sent by Atlassian JIRA (v6.3.4#6332)