Mao Jiayi created FLINK-40337:
---------------------------------

             Summary: Preserve operator precedence in generated Janino 
expressions
                 Key: FLINK-40337
                 URL: https://issues.apache.org/jira/browse/FLINK-40337
             Project: Flink
          Issue Type: Bug
          Components: Flink CDC
            Reporter: Mao Jiayi


When Flink CDC translates a Pipeline transform expression from Calcite SQL 
nodes to Janino code, {{JaninoCompiler}} constructs {{Java.BinaryOperation}} 
nodes and serializes them via {{Java.Rvalue#toString()}}. This method 
concatenates operands directly without considering operator precedence, so 
parentheses present in the original expression are silently dropped.

For example, the following expressions all change semantics after code 
generation:

{code}
(a + b) * c    →  a + b * c
(a OR b) AND c →  a || b && c
a / (b * c)    →  a / b * c
a - (b - c)    →  a - b - c
{code}

The generated Janino code evaluates with different grouping than the user's 
original transform expression, producing incorrect results without any error or 
warning. Expressions without nesting are unaffected.

*Expected behavior*: the generated code preserves the original expression's 
semantics — parentheses are retained where grouping matters, and omitted where 
precedence already guarantees correct evaluation order (e.g. {{a + b * c}} 
should stay as-is).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to