4747import org .opensearch .sql .calcite .CalcitePlanContext ;
4848import org .opensearch .sql .calcite .CalciteRelNodeVisitor ;
4949import org .opensearch .sql .calcite .OpenSearchSchema ;
50- import org .opensearch .sql .calcite .PplRelToSqlConverter ;
5150import org .opensearch .sql .calcite .SysLimit ;
5251import org .opensearch .sql .calcite .plan .LogicalSystemLimit ;
5352import org .opensearch .sql .calcite .plan .LogicalSystemLimit .SystemLimitType ;
53+ import org .opensearch .sql .calcite .validate .PplRelToSqlNodeConverter ;
54+ import org .opensearch .sql .calcite .validate .PplRelToSqlRelShuttle ;
5455import org .opensearch .sql .common .response .ResponseListener ;
5556import org .opensearch .sql .common .setting .Settings ;
5657import org .opensearch .sql .datasource .DataSourceService ;
@@ -73,8 +74,8 @@ public class QueryService {
7374 private final Planner planner ;
7475 private DataSourceService dataSourceService ;
7576 private Settings settings ;
76- private static final PplRelToSqlConverter converter =
77- new PplRelToSqlConverter (MysqlSqlDialect .DEFAULT );
77+ private static final PplRelToSqlNodeConverter converter =
78+ new PplRelToSqlNodeConverter (MysqlSqlDialect .DEFAULT );
7879
7980 @ Getter (lazy = true )
8081 private final CalciteRelNodeVisitor relNodeVisitor = new CalciteRelNodeVisitor (dataSourceService );
@@ -295,8 +296,11 @@ public LogicalPlan analyze(UnresolvedPlan plan, QueryType queryType) {
295296 * @return the validated (and potentially modified) relation node
296297 */
297298 private RelNode validate (RelNode relNode , CalcitePlanContext context ) {
299+ // Fix interval literals before conversion to SQL
300+ RelNode sqlRelNode = relNode .accept (new PplRelToSqlRelShuttle (context .rexBuilder , true ));
301+
298302 // Convert RelNode to SqlNode for validation
299- SqlImplementor .Result result = converter .visitRoot (relNode );
303+ SqlImplementor .Result result = converter .visitRoot (sqlRelNode );
300304 SqlNode root = result .asStatement ();
301305
302306 // Rewrite SqlNode to remove database qualifiers
@@ -318,20 +322,14 @@ public SqlNode visit(SqlIdentifier id) {
318322 SqlValidator validator = context .getValidator ();
319323 if (rewritten != null ) {
320324 try {
321- String before = rewritten .toString ();
322- // rewritten will be modified in-place by validation
325+ log .debug ("Before validation: {}" , rewritten );
323326 validator .validate (rewritten );
324327 log .debug ("After validation: {}" , rewritten );
325- String after = rewritten .toString ();
326- if (before .equals (after )) {
327- // If the rewritten SQL node is not modified, return the original RelNode as is
328- return relNode ;
329- }
330328 } catch (CalciteContextException e ) {
331329 throw new ExpressionEvaluationException (e .getMessage (), e );
332330 }
333331 } else {
334- log .debug ("Failed to rewrite the SQL node before validation: {}" , root );
332+ log .info ("Failed to rewrite the SQL node before validation: {}" , root );
335333 return relNode ;
336334 }
337335
@@ -348,8 +346,8 @@ public SqlNode visit(SqlIdentifier id) {
348346 cluster ,
349347 StandardConvertletTable .INSTANCE ,
350348 SqlToRelConverter .config ());
351- RelRoot validatedRelRoot = sql2rel .convertQuery (rewritten , true , true );
352- return validatedRelRoot .rel ;
349+ RelRoot validatedRelRoot = sql2rel .convertQuery (rewritten , false , true );
350+ return validatedRelRoot .rel . accept ( new PplRelToSqlRelShuttle ( context . rexBuilder , false )) ;
353351 }
354352
355353 /** Translate {@link LogicalPlan} to {@link PhysicalPlan}. */
0 commit comments