diff --git a/internal/component/database_observability/postgres/collector/explain_plans.go b/internal/component/database_observability/postgres/collector/explain_plans.go index 9cf9f4d9fa2..50a2f5b0802 100644 --- a/internal/component/database_observability/postgres/collector/explain_plans.go +++ b/internal/component/database_observability/postgres/collector/explain_plans.go @@ -568,6 +568,11 @@ func (c *ExplainPlans) fetchExplainPlanJSON(ctx context.Context, qi queryInfo) ( } defer conn.Close() + setSearchPathStatement := fmt.Sprintf("SET SESSION search_path TO \"%s\", public", qi.datname) + if _, err := conn.ExecContext(ctx, setSearchPathStatement); err != nil { + return nil, fmt.Errorf("failed to set search path: %w", err) + } + preparedStatementName := strings.ReplaceAll(fmt.Sprintf("explain_plan_%s", qi.queryId), "-", "_") preparedStatementText := fmt.Sprintf("PREPARE %s AS %s", preparedStatementName, qi.queryText) logger := log.With(c.logger, "query_id", qi.queryId, "datname", qi.datname, "preparedStatementName", preparedStatementName, "preparedStatementText", preparedStatementText) @@ -581,11 +586,6 @@ func (c *ExplainPlans) fetchExplainPlanJSON(ctx context.Context, qi queryInfo) ( } }() - setSearchPathStatement := fmt.Sprintf("SET search_path TO %s, public", qi.datname) - if _, err := conn.ExecContext(ctx, setSearchPathStatement); err != nil { - return nil, fmt.Errorf("failed to set search path: %w", err) - } - if _, err := conn.ExecContext(ctx, "SET plan_cache_mode = force_generic_plan"); err != nil { return nil, fmt.Errorf("failed to set plan cache mode: %w", err) } diff --git a/internal/component/database_observability/postgres/collector/explain_plans_test.go b/internal/component/database_observability/postgres/collector/explain_plans_test.go index f29a916ef45..c2daa6b5dc8 100644 --- a/internal/component/database_observability/postgres/collector/explain_plans_test.go +++ b/internal/component/database_observability/postgres/collector/explain_plans_test.go @@ -2915,8 +2915,8 @@ func TestExplainPlanFetchExplainPlans(t *testing.T) { require.Equal(t, "complex_aggregation_with_case.json", jsonFile.Name) jsonData := jsonFile.Data + mock.ExpectExec("SET SESSION search_path TO \"testdb\", public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("PREPARE explain_plan_123456 AS select * from some_table where id = $1").WillReturnResult(sqlmock.NewResult(0, 1)) - mock.ExpectExec("SET search_path TO testdb, public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("SET plan_cache_mode = force_generic_plan").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectQuery("EXPLAIN (FORMAT JSON) EXECUTE explain_plan_123456(null)").WillReturnRows(sqlmock.NewRows([]string{"json"}).AddRow(jsonData)) mock.ExpectExec("DEALLOCATE explain_plan_123456").WillReturnResult(sqlmock.NewResult(0, 1)) @@ -2982,8 +2982,8 @@ func TestExplainPlanFetchExplainPlans(t *testing.T) { require.Equal(t, "complex_aggregation_with_case.json", jsonFile.Name) jsonData := jsonFile.Data + mock.ExpectExec("SET SESSION search_path TO \"testdb\", public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("PREPARE explain_plan_123456 AS with cte as (select * from some_table where id = $1) select * from cte").WillReturnResult(sqlmock.NewResult(0, 1)) - mock.ExpectExec("SET search_path TO testdb, public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("SET plan_cache_mode = force_generic_plan").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectQuery("EXPLAIN (FORMAT JSON) EXECUTE explain_plan_123456(null)").WillReturnRows(sqlmock.NewRows([]string{"json"}).AddRow(jsonData)) mock.ExpectExec("DEALLOCATE explain_plan_123456").WillReturnResult(sqlmock.NewResult(0, 1)) @@ -3049,8 +3049,8 @@ func TestExplainPlanFetchExplainPlans(t *testing.T) { require.Equal(t, "complex_aggregation_with_case.json", jsonFile.Name) jsonData := jsonFile.Data + mock.ExpectExec("SET SESSION search_path TO \"testdb\", public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("PREPARE explain_plan_123456 AS select * from some_table").WillReturnResult(sqlmock.NewResult(0, 1)) - mock.ExpectExec("SET search_path TO testdb, public").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectExec("SET plan_cache_mode = force_generic_plan").WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectQuery("EXPLAIN (FORMAT JSON) EXECUTE explain_plan_123456").WillReturnRows(sqlmock.NewRows([]string{"json"}).AddRow(jsonData)) mock.ExpectExec("DEALLOCATE explain_plan_123456").WillReturnResult(sqlmock.NewResult(0, 1))