terrymanu commented on issue #11116:
URL: 
https://github.com/apache/shardingsphere/issues/11116#issuecomment-3678751498

   Problem Understanding
   
     - SQL select order_id, user_id from t_order where order_id = 10 group by 
order_id having max(order_id) > 1 fails during SQL Federation conversion 
because AggregationProjection keeps only a string innerExpression; HAVING 
cannot be converted to Calcite AST. Expected:
       aggregation arguments should be ExpressionSegment so 
AggregationProjectionConverter can build a Calcite SqlBasicCall.
   
     Root Cause
   
     - During parsing, aggregation arguments are not populated into 
AggregationProjectionSegment.getParameters(), leaving only the string 
expression/innerExpression. AggregationProjectionConverter relies on 
parameters; when empty, it builds an operator without operands and
       Calcite validation fails.
   
     Problem Analysis
   
     - Current master dialect visitors (e.g., MySQL/PostgreSQL/Presto) create 
AggregationProjectionSegment and add ExpressionSegment parameters via 
getExpressions(ctx.aggregationExpression().expr()), which supports 
MAX(order_id).
     - If you still see only the string form, it points to an older release or 
a custom parsing path that skips parameter population, so AST info is missing.
     - Conversion chain: HavingSegment → ExpressionConverter → 
AggregationProjectionConverter; only non-empty parameters allow a valid Calcite 
aggregation node.
   
     Conclusion
   
     - The issue stems from missing aggregation arguments in 
AggregationProjectionSegment, not from Calcite. Parsing must emit 
ExpressionSegment parameters; otherwise SQL Federation conversion lacks 
operands.
   
     Design-Level Fix Proposal (PRs welcome!)
   
     - Parser: In each dialect’s 
visitAggregationFunction/createAggregationSegment, ensure 
ctx.aggregationExpression().expr() is parsed into ExpressionSegment and added 
to AggregationProjectionSegment.getParameters(), not just stored as raw text.
     - Converter: In AggregationProjectionConverter.convert, add an explicit 
check for empty parameters and throw a clear exception instead of creating 
operand-less aggregates.
     - Tests: Add SQL Node conversion cases under 
kernel/sql-federation/compiler covering HAVING MAX(order_id) > 1, asserting the 
Calcite AST contains the aggregation operand; add parser tests per dialect to 
confirm AggregationProjectionSegment.getParameters() includes
       ColumnSegment(order_id).
     - Community invitation: We warmly welcome contributors to submit PRs 
implementing the parsing fix and tests across major dialects 
(MySQL/PostgreSQL/SQLServer, etc.), and to include SQL Federation integration 
cases to strengthen regression coverage.
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to