I'm having an issue with CoreFilters.FILTER_REDUCE_EXPRESSIONS.  I'm wondering 
if this is a problem with the rule, or with how I've set up my logical tree.

Conceptually I am trying to use the equivalent of a computed column in a WHERE. 
 Since this isn't legal:

   SELECT code, CASE WHEN code = 'test_val' THEN ABS(val) ELSE NULL END AS 
absval
    FROM TEST
  WHERE absval > 0

I need to move that same CASE logic into the WHERE clause, so:

   SELECT code, CASE WHEN code = 'test_val' THEN ABS(val) ELSE NULL END AS 
absval
    FROM TEST
 WHERE CASE WHEN code = 'test_val' THEN ABS(val) ELSE NULL END > 0

I'm able to set up my logical RelNode tree and generate exactly this SQL 
directly from the logical tree.  The builder logic has:

   RelNode relNode = builder
       .projectPlus(builder.alias(caseNode, "ABSVAL"))
       .filter(builder.greaterThan(caseNode, builder.literal(0)))
       .build();

However, when I try to generate a physical tree from this, I can see the 
FILTER_REDUCE_EXPRESSIONS rule coerses the CASE statement in the filter into a 
BOOLEAN expression, and it produces:

   SELECT code, CASE WHEN code = 'test_val' THEN ABS(val) ELSE NULL END AS 
absval
     FROM TEST
   WHERE CASE WHEN code = 'test_val' THEN ABS(val) > 0 ELSE FALSE END

Which isn't even valid SQL.   If I remove that rule from the planner altogether:

       planner.removeRule(FILTER_REDUCE_EXPRESSIONS)

The SQL looks correct (effectively the same as that translated directly from 
the logical tree above.)

Reply via email to