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

Chris Baynes commented on CALCITE-1328:
---------------------------------------

Ah ok, didn't realise the rules had to be manually configured. So I've tried 
that now, but it doesn't seem make any difference to the planner trace.
Here's what I tried:

{code}
JdbcConvention out = JdbcConvention.of(null, null, "postgresconv");
List<RelOptRule> rules = JdbcRules.rules(out);
Program program = Programs.ofRules(rules);

FrameworkConfig config = Frameworks.newConfigBuilder()
                .defaultSchema(rootSchema.getSubSchema("source1"))
                .parserConfig(SqlParser.Config.DEFAULT)
                .programs(program)
                .build();

RelBuilder builder = RelBuilder.create(config);

RelNode root = builder
                .scan("agg_lc_06_sales_fact_1997")
                .filter(builder.call(SqlStdOperatorTable.EQUALS, 
builder.field(1, 0, "time_id"), builder.literal(400)))
                .project(builder.field(1, 0, "time_id"))
                .build();
{code}

Perhaps you can see what I'm doing wrong there?

> RelBuilder not pushing down jdbc predicates
> -------------------------------------------
>
>                 Key: CALCITE-1328
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1328
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Chris Baynes
>            Assignee: Julian Hyde
>
> Querying a jdbc datasource does not push down any predicates (filters, 
> projects, or joins). This seems to be the case no matter whether the database 
> is postgres or mysql.
> The lack of push down can be reproduced using the foodmart database and the 
> following query:
> {code}
> RelNode root = builder
>       .scan("agg_lc_06_sales_fact_1997")
>       .filter(builder.call(SqlStdOperatorTable.EQUALS, builder.field(1, 0, 
> "time_id"), builder.literal(400)))
>       .project(builder.field(1, 0, "time_id"))
>       .build();
> {code}
> The full planner trace is 
> https://gist.github.com/chris-baynes/79bc39a7e40d3310ca0b9f0cdb34293f
> Here's the cheapest plan from the planner trace:
> {noformat}
> 1064 [main] DEBUG org.apache.calcite.plan.RelOptPlanner  - Cheapest plan:
> EnumerableProject(time_id=[$0]): rowcount = 15.0, cumulative cost = {80.0 
> rows, 165.0 cpu, 0.0 io}, id = 52
>   EnumerableFilter(condition=[=($0, 400)]): rowcount = 15.0, cumulative cost 
> = {65.0 rows, 150.0 cpu, 0.0 io}, id = 51
>     EnumerableInterpreter: rowcount = 100.0, cumulative cost = {50.0 rows, 
> 50.0 cpu, 0.0 io}, id = 50
>       BindableTableScan(table=[[source1, agg_lc_06_sales_fact_1997]]): 
> rowcount = 100.0, cumulative cost = {1.0 rows, 1.01 cpu, 0.0 io}, id = 41
> 1066 [main] DEBUG org.apache.calcite.plan.RelOptPlanner  - Provenance:
> EnumerableProject#52
>   direct
>     
> rel#30:EnumerableProject.ENUMERABLE.[](input=rel#29:Subset#3.ENUMERABLE.[],time_id=$0)
>       call#133 rule [EnumerableProjectRule]
>         
> rel#25:LogicalProject.NONE.[](input=rel#24:Subset#3.NONE.[],time_id=$0)
>           call#62 rule [FilterProjectTransposeRule]
>             
> rel#8:LogicalFilter.NONE.[](input=rel#7:Subset#1.NONE.[],condition==($0, 400))
>               no parent
>             
> rel#6:LogicalProject.NONE.[](input=rel#5:Subset#0.NONE.[],time_id=$0)
>               no parent
> EnumerableFilter#51
>   direct
>     
> rel#34:EnumerableFilter.ENUMERABLE.[](input=rel#33:Subset#0.ENUMERABLE.[],condition==($0,
>  400))
>       call#110 rule [EnumerableFilterRule]
>         
> rel#22:LogicalFilter.NONE.[](input=rel#5:Subset#0.NONE.[],condition==($0, 
> 400))
>           call#62 rule [FilterProjectTransposeRule]
>             rel#8 (see above)
>             rel#6 (see above)
> EnumerableInterpreter#50
>   direct
>     
> rel#45:EnumerableInterpreter.ENUMERABLE.[](input=rel#42:Subset#0.BINDABLE.[])
>       call#255 rule [EnumerableInterpreterRule]
>         rel#42:Subset#0.BINDABLE.[]
>           subset rel#42:Subset#0.BINDABLE.[]
>             rel#41:BindableTableScan.BINDABLE.[](table=[source1, 
> agg_lc_06_sales_fact_1997])
>               call#5 rule [BindableTableScanRule]
>                 rel#0:LogicalTableScan.NONE.[](table=[source1, 
> agg_lc_06_sales_fact_1997])
>                   no parent
> rel#41 (see above)
> {noformat}
> I couldn't reproduce with a testcase in the JdbcAdapterTest. Filters and 
> projects against the default hsqldb are always pushed down. I couldn't get 
> the tests to use anything other than hsqldb though: using 
> -Dcalcite.test.db=postgresql after creating a local foodmart db as the 
> foodmart user always throws the exception: 
> org.apache.calcite.sql.validate.SqlValidatorException: Table 
> 'sales_fact_1997' not found - but the table is definitely there.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to