[ https://issues.apache.org/jira/browse/CALCITE-4047?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17146840#comment-17146840 ]
jamie12221 commented on CALCITE-4047: ------------------------------------- I hope that when a rule exception occurs, the optimizer can continue to run rather than exit because of the exception > at > org.apache.calcite.rel.rules.PushProjector.getAdjustments(java.lang.ArrayIndexOutOfBoundsException: > 0) > --------------------------------------------------------------------------------------------------------- > > Key: CALCITE-4047 > URL: https://issues.apache.org/jira/browse/CALCITE-4047 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.23.0 > Reporter: jamie12221 > Priority: Trivial > > > > {code:java} > 28:LogicalUnion(all=[true]) > 21:LogicalProject > 20:LogicalTableScan(table=[[db1]]) > 23:LogicalProject > 22:LogicalTableScan(table=[[db2]]) > 25:LogicalProject > 24:LogicalTableScan(table=[[db3]]) > 27:LogicalProject > 26:LogicalTableScan(table=[[db3]]) > {code} > > > {code:java} > 16:32:01 T=noBindingExecutor0 [org.apache.calcite.plan.RelOptPlanner fireRule > at 324]-[DEBUG] call#3: Apply rule [ProjectSetOpTransposeRule] to > [rel#44:LogicalProject.NONE.[](input=HepRelVertex#43,exprs=[1]), > rel#42:LogicalUnion.NONE.[](input#0=HepRelVertex#32,input#1=HepRelVertex#35,input#2=HepRelVertex#38,input#3=HepRelVertex#41,all=true)]16:32:01 > T=noBindingExecutor0 [io.mycat.proxy.session.Session setLastMessage at > 122]-[ERROR] java.lang.ArrayIndexOutOfBoundsException: 0 at > org.apache.calcite.rel.rules.PushProjector.getAdjustments(PushProjector.java:572) > at > org.apache.calcite.rel.rules.ProjectSetOpTransposeRule.onMatch(ProjectSetOpTransposeRule.java:92) > at > org.apache.calcite.plan.AbstractRelOptPlanner.fireRule(AbstractRelOptPlanner.java:338) > at org.apache.calcite.plan.hep.HepPlanner.applyRule(HepPlanner.java:540) at > org.apache.calcite.plan.hep.HepPlanner.applyRules(HepPlanner.java:405) at > org.apache.calcite.plan.hep.HepPlanner.executeInstruction(HepPlanner.java:270) > at > org.apache.calcite.plan.hep.HepInstruction$RuleCollection.execute(HepInstruction.java:74) > at > org.apache.calcite.plan.hep.HepPlanner.executeProgram(HepPlanner.java:201) at > org.apache.calcite.plan.hep.HepPlanner.findBestExp(HepPlanner.java:188) > {code} > > > The test case: > {code:java} > public class Test { > /***/ > public static class Author { > public final int id; > public final String fname; > public final String lname; > public Author(final int id, final String firstname, final String > lastname) { > this.id = id; > this.fname = firstname; > this.lname = lastname; > } > } > /***/ > public static class Book { > public final int id; > public final String title; > public final int year; > public final Author author; > public Book(final int id, final String title, final int year, final > Author author) { > this.id = id; > this.title = title; > this.year = year; > this.author = author; > } > } > /***/ > public static class BookStore { > public final Author[] author = new Author[]{ > new Author(1, "Victor", "Hugo"), > new Author(2, "Alexandre", "Dumas") > }; > public final Book[] book = new Book[]{ > new Book(1, "Les Miserables", 1862, author[0]), > new Book(2, "The Hunchback of Notre-Dame", 1829, author[0]), > new Book(3, "The Last Day of a Condemned Man", 1829, author[0]), > new Book(4, "The three Musketeers", 1844, author[1]), > new Book(5, "The Count of Monte Cristo", 1884, author[1]) > }; > } > @org.junit.Test > public void example() throws Exception { > CalciteSchema schema = CalciteSchema.createRootSchema(true); > schema.add("bs", new ReflectiveSchema(new BookStore())); > RelDataTypeFactory typeFactory = new JavaTypeFactoryImpl(); > Properties props = new Properties(); > props.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(), > "false"); > CalciteConnectionConfig config = new CalciteConnectionConfigImpl(props); > CalciteCatalogReader catalogReader = new CalciteCatalogReader(schema, > Collections.singletonList("bs"), > typeFactory, config); > RelOptCluster cluster = newCluster(typeFactory); > RelBuilder relBuilder = > SqlToRelConverter.Config.DEFAULT.getRelBuilderFactory().create(cluster, > catalogReader); > SchemaOnlyDataContext schemaOnlyDataContext = new > SchemaOnlyDataContext(schema); > Assert.assertEquals(5, new Interpreter(schemaOnlyDataContext, relBuilder > .scan("Book").build()).count()); > RelNode relNode = relBuilder > .scan("Book").project() > .scan("Book").project() > .scan("Book").project() > .union(true, 3) > .project(ImmutableList.of(),ImmutableList.of(),true) > .build(); > HepProgramBuilder builder = new HepProgramBuilder(); > builder.addRuleInstance(ProjectSetOpTransposeRule.INSTANCE); > builder.addRuleInstance(ProjectFilterTransposeRule.INSTANCE); > builder.addRuleInstance(ProjectJoinTransposeRule.INSTANCE); > builder.addRuleInstance(ProjectCorrelateTransposeRule.INSTANCE); > HepProgram program = builder.build(); > HepPlanner planner = new HepPlanner(program); > planner.setRoot(relNode); > relNode = planner.findBestExp(); > Assert.assertEquals(15, new Interpreter(schemaOnlyDataContext,relNode > ).count()); > } > private static RelOptCluster newCluster(RelDataTypeFactory factory) { > RelOptPlanner planner = new VolcanoPlanner(); > planner.addRelTraitDef(ConventionTraitDef.INSTANCE); > return RelOptCluster.create(planner, new RexBuilder(factory)); > } > private static final RelOptTable.ViewExpander NOOP_EXPANDER = new > RelOptTable.ViewExpander() { > @Override public RelRoot expandView(final RelDataType rowType, final > String queryString, > final List<String> schemaPath, > final List<String> viewPath) { > return null; > } > }; > /** > * A simple data context only with schema information. > */ > private static final class SchemaOnlyDataContext implements DataContext { > private final SchemaPlus schema; > SchemaOnlyDataContext(CalciteSchema calciteSchema) { > this.schema = calciteSchema.plus(); > } > @Override public SchemaPlus getRootSchema() { > return schema; > } > @Override public JavaTypeFactory getTypeFactory() { > return new JavaTypeFactoryImpl(); > } > @Override public QueryProvider getQueryProvider() { > return null; > } > @Override public Object get(final String name) { > return null; > } > } > } > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)