[
https://issues.apache.org/jira/browse/CALCITE-4047?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
jamie12221 updated CALCITE-4047:
--------------------------------
Description:
{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}
was:
{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}
> 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)