5151import org .opensearch .sql .calcite .CalcitePlanContext ;
5252import org .opensearch .sql .calcite .CalciteRelNodeVisitor ;
5353import org .opensearch .sql .calcite .OpenSearchSchema ;
54- import org .opensearch .sql .calcite .PplRelToSqlConverter ;
5554import org .opensearch .sql .calcite .SysLimit ;
5655import org .opensearch .sql .calcite .plan .LogicalSystemLimit ;
5756import org .opensearch .sql .calcite .plan .LogicalSystemLimit .SystemLimitType ;
57+ import org .opensearch .sql .calcite .validate .PplRelToSqlNodeConverter ;
58+ import org .opensearch .sql .calcite .validate .PplRelToSqlRelShuttle ;
5859import org .opensearch .sql .common .response .ResponseListener ;
5960import org .opensearch .sql .common .setting .Settings ;
6061import org .opensearch .sql .datasource .DataSourceService ;
@@ -80,8 +81,8 @@ public class QueryService {
8081 private final Planner planner ;
8182 private DataSourceService dataSourceService ;
8283 private Settings settings ;
83- private static final PplRelToSqlConverter converter =
84- new PplRelToSqlConverter (MysqlSqlDialect .DEFAULT );
84+ private static final PplRelToSqlNodeConverter converter =
85+ new PplRelToSqlNodeConverter (MysqlSqlDialect .DEFAULT );
8586
8687 @ Getter (lazy = true )
8788 private final CalciteRelNodeVisitor relNodeVisitor = new CalciteRelNodeVisitor (dataSourceService );
@@ -314,8 +315,11 @@ public LogicalPlan analyze(UnresolvedPlan plan, QueryType queryType) {
314315 * @return the validated (and potentially modified) relation node
315316 */
316317 private RelNode validate (RelNode relNode , CalcitePlanContext context ) {
318+ // Fix interval literals before conversion to SQL
319+ RelNode sqlRelNode = relNode .accept (new PplRelToSqlRelShuttle (context .rexBuilder , true ));
320+
317321 // Convert RelNode to SqlNode for validation
318- SqlImplementor .Result result = converter .visitRoot (relNode );
322+ SqlImplementor .Result result = converter .visitRoot (sqlRelNode );
319323 SqlNode root = result .asStatement ();
320324
321325 // Rewrite SqlNode to remove database qualifiers
@@ -337,20 +341,14 @@ public SqlNode visit(SqlIdentifier id) {
337341 SqlValidator validator = context .getValidator ();
338342 if (rewritten != null ) {
339343 try {
340- String before = rewritten .toString ();
341- // rewritten will be modified in-place by validation
344+ log .debug ("Before validation: {}" , rewritten );
342345 validator .validate (rewritten );
343346 log .debug ("After validation: {}" , rewritten );
344- String after = rewritten .toString ();
345- if (before .equals (after )) {
346- // If the rewritten SQL node is not modified, return the original RelNode as is
347- return relNode ;
348- }
349347 } catch (CalciteContextException e ) {
350348 throw new ExpressionEvaluationException (e .getMessage (), e );
351349 }
352350 } else {
353- log .debug ("Failed to rewrite the SQL node before validation: {}" , root );
351+ log .info ("Failed to rewrite the SQL node before validation: {}" , root );
354352 return relNode ;
355353 }
356354
@@ -367,8 +365,8 @@ public SqlNode visit(SqlIdentifier id) {
367365 cluster ,
368366 StandardConvertletTable .INSTANCE ,
369367 SqlToRelConverter .config ());
370- RelRoot validatedRelRoot = sql2rel .convertQuery (rewritten , true , true );
371- return validatedRelRoot .rel ;
368+ RelRoot validatedRelRoot = sql2rel .convertQuery (rewritten , false , true );
369+ return validatedRelRoot .rel . accept ( new PplRelToSqlRelShuttle ( context . rexBuilder , false )) ;
372370 }
373371
374372 /** Translate {@link LogicalPlan} to {@link PhysicalPlan}. */
0 commit comments