|
86 | 86 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable; |
87 | 87 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Execute; |
88 | 88 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExecuteImmediate; |
| 89 | +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Explain; |
| 90 | +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExplainAnalyze; |
89 | 91 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression; |
90 | 92 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion; |
91 | 93 | import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush; |
@@ -689,39 +691,59 @@ private IQueryExecution createQueryExecutionForTableModel( |
689 | 691 | List<Expression> parameters = Collections.emptyList(); |
690 | 692 | Map<NodeRef<Parameter>, Expression> parameterLookup = Collections.emptyMap(); |
691 | 693 |
|
692 | | - if (statement instanceof Execute) { |
693 | | - Execute executeStatement = (Execute) statement; |
| 694 | + // Unwrap Explain/ExplainAnalyze to check for inner Execute/ExecuteImmediate |
| 695 | + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement innerStatement = statement; |
| 696 | + if (statement instanceof Explain) { |
| 697 | + innerStatement = ((Explain) statement).getStatement(); |
| 698 | + } else if (statement instanceof ExplainAnalyze) { |
| 699 | + innerStatement = ((ExplainAnalyze) statement).getStatement(); |
| 700 | + } |
| 701 | + |
| 702 | + if (innerStatement instanceof Execute) { |
| 703 | + Execute executeStatement = (Execute) innerStatement; |
694 | 704 | String statementName = executeStatement.getStatementName().getValue(); |
695 | 705 |
|
696 | | - // Get prepared statement from session (contains cached AST) |
697 | 706 | PreparedStatementInfo preparedInfo = clientSession.getPreparedStatement(statementName); |
698 | 707 | if (preparedInfo == null) { |
699 | 708 | throw new SemanticException( |
700 | 709 | String.format("Prepared statement '%s' does not exist", statementName)); |
701 | 710 | } |
702 | 711 |
|
703 | | - // Use cached AST |
704 | | - statementToUse = preparedInfo.getSql(); |
705 | | - |
706 | | - // Bind parameters: create parameterLookup map |
707 | | - // Note: bindParameters() internally validates parameter count |
| 712 | + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement resolvedSql = |
| 713 | + preparedInfo.getSql(); |
708 | 714 | parameterLookup = |
709 | | - ParameterExtractor.bindParameters(statementToUse, executeStatement.getParameters()); |
| 715 | + ParameterExtractor.bindParameters(resolvedSql, executeStatement.getParameters()); |
710 | 716 | parameters = new ArrayList<>(executeStatement.getParameters()); |
711 | 717 |
|
712 | | - } else if (statement instanceof ExecuteImmediate) { |
713 | | - ExecuteImmediate executeImmediateStatement = (ExecuteImmediate) statement; |
| 718 | + if (statement instanceof Explain) { |
| 719 | + statementToUse = new Explain(resolvedSql); |
| 720 | + } else if (statement instanceof ExplainAnalyze) { |
| 721 | + statementToUse = new ExplainAnalyze(resolvedSql, ((ExplainAnalyze) statement).isVerbose()); |
| 722 | + } else { |
| 723 | + statementToUse = resolvedSql; |
| 724 | + } |
| 725 | + |
| 726 | + } else if (innerStatement instanceof ExecuteImmediate) { |
| 727 | + ExecuteImmediate executeImmediateStatement = (ExecuteImmediate) innerStatement; |
714 | 728 |
|
715 | | - // EXECUTE IMMEDIATE needs to parse SQL first |
716 | 729 | String sql = executeImmediateStatement.getSqlString(); |
717 | 730 | List<Literal> literalParameters = executeImmediateStatement.getParameters(); |
718 | 731 |
|
719 | | - statementToUse = sqlParser.createStatement(sql, clientSession.getZoneId(), clientSession); |
| 732 | + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement resolvedSql = |
| 733 | + sqlParser.createStatement(sql, clientSession.getZoneId(), clientSession); |
720 | 734 |
|
721 | 735 | if (!literalParameters.isEmpty()) { |
722 | | - parameterLookup = ParameterExtractor.bindParameters(statementToUse, literalParameters); |
| 736 | + parameterLookup = ParameterExtractor.bindParameters(resolvedSql, literalParameters); |
723 | 737 | parameters = new ArrayList<>(literalParameters); |
724 | 738 | } |
| 739 | + |
| 740 | + if (statement instanceof Explain) { |
| 741 | + statementToUse = new Explain(resolvedSql); |
| 742 | + } else if (statement instanceof ExplainAnalyze) { |
| 743 | + statementToUse = new ExplainAnalyze(resolvedSql, ((ExplainAnalyze) statement).isVerbose()); |
| 744 | + } else { |
| 745 | + statementToUse = resolvedSql; |
| 746 | + } |
725 | 747 | } |
726 | 748 |
|
727 | 749 | if (statement instanceof WrappedInsertStatement) { |
|
0 commit comments