class PreExecutionBenchmark {

    private Analyzer analyzer;
    private Node node;
    private Sessions sqlOperations;
    private Planner planner;
    private ClusterService clusterService;
    private NodeContext nodeCtx;

    @Setup
    public void setup() throws Exception {<FILL_FUNCTION_BODY>}

    @TearDown
    public void teardown() throws Exception {
        node.close();
    }

    @Benchmark
    public Statement measure_parse_simple_select() throws Exception {
        return SqlParser.createStatement("select name from users");
    }

    @Benchmark
    public AnalyzedStatement measure_parse_and_analyze_simple_select() throws Exception {
        String sql = "select name from users";
        CoordinatorTxnCtx systemTransactionContext = CoordinatorTxnCtx.systemTransactionContext();
        Analysis analysis = new Analysis(systemTransactionContext, ParamTypeHints.EMPTY, Cursors.EMPTY);
        return analyzer.analyzedStatement(SqlParser.createStatement(sql), analysis);
    }

    @Benchmark
    public Plan measure_parse_analyze_and_plan_simple_select() throws Exception {
        String sql = "select name from users";
        CoordinatorTxnCtx systemTransactionContext = CoordinatorTxnCtx.systemTransactionContext();
        Analysis analysis = new Analysis(systemTransactionContext, ParamTypeHints.EMPTY, Cursors.EMPTY);
        AnalyzedStatement analyzedStatement = analyzer.analyzedStatement(SqlParser.createStatement(sql), analysis);
        var jobId = UUID.randomUUID();
        var routingProvider = new RoutingProvider(Randomness.get().nextInt(), planner.getAwarenessAttributes());
        var clusterState = clusterService.state();
        var txnCtx = CoordinatorTxnCtx.systemTransactionContext();
        var plannerContext = new PlannerContext(
            clusterState,
            routingProvider,
            jobId,
            txnCtx,
            nodeCtx,
            0,
            null,
            Cursors.EMPTY,
            TransactionState.IDLE,
            new PlanStats(nodeCtx, CoordinatorTxnCtx.systemTransactionContext(), new TableStats()),
            planner::optimize
        );
        return planner.plan(analyzedStatement, plannerContext);
    }
}

        Path tempDir = Files.createTempDirectory("");
        Settings settings = Settings.builder()
            .put("path.home", tempDir.toAbsolutePath().toString())
            .build();
        Environment environment = new Environment(settings, tempDir);
        node = new Node(
            environment,
            List.of(
                Netty4Plugin.class
            ),
            true
        );
        node.start();
        Injector injector = node.injector();
        sqlOperations = injector.getInstance(Sessions.class);
        analyzer = injector.getInstance(Analyzer.class);
        planner = injector.getInstance(Planner.class);
        clusterService = injector.getInstance(ClusterService.class);
        nodeCtx = injector.getInstance(NodeContext.class);

        String statement = "create table users (id int primary key, name string, date timestamp, text string index using fulltext)";
        var resultReceiver = new BaseResultReceiver();
        try (Session session = sqlOperations.newSystemSession()) {
            session.quickExec(statement, resultReceiver, Row.EMPTY);
        }
        resultReceiver.completionFuture().get(5, TimeUnit.SECONDS);
    
<no_super_class>