Skip to content

Commit bce7051

Browse files
authored
fix(db): split advisors session setup from lint query (#4967)
fix(db): split advisors session setup from lint query (#4965)
1 parent 24b7304 commit bce7051

2 files changed

Lines changed: 52 additions & 7 deletions

File tree

internal/db/advisors/advisors.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io"
99
"os"
10+
"strings"
1011

1112
"github.com/go-errors/errors"
1213
"github.com/jackc/pgconn"
@@ -109,7 +110,12 @@ func queryLints(ctx context.Context, conn *pgx.Conn) ([]Lint, error) {
109110
}
110111
}()
111112

112-
rows, err := tx.Query(ctx, lintsSQL)
113+
setupSQL, querySQL := splitLintsSQL()
114+
if _, err := tx.Exec(ctx, setupSQL); err != nil {
115+
return nil, errors.Errorf("failed to prepare lint session: %w", err)
116+
}
117+
118+
rows, err := tx.Query(ctx, querySQL)
113119
if err != nil {
114120
return nil, errors.Errorf("failed to query lints: %w", err)
115121
}
@@ -145,6 +151,14 @@ func queryLints(ctx context.Context, conn *pgx.Conn) ([]Lint, error) {
145151
return lints, nil
146152
}
147153

154+
func splitLintsSQL() (string, string) {
155+
setupSQL, querySQL, found := strings.Cut(lintsSQL, ";\n\n")
156+
if !found {
157+
return "", lintsSQL
158+
}
159+
return setupSQL, querySQL
160+
}
161+
148162
func fetchSecurityAdvisors(ctx context.Context, projectRef string) ([]Lint, error) {
149163
resp, err := utils.GetSupabase().V1GetSecurityAdvisorsWithResponse(ctx, projectRef, &api.V1GetSecurityAdvisorsParams{})
150164
if err != nil {

internal/db/advisors/advisors_test.go

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ func TestQueryLints(t *testing.T) {
2929
t.Run("parses lint results from local database", func(t *testing.T) {
3030
utils.Config.Hostname = "127.0.0.1"
3131
utils.Config.Db.Port = 5432
32+
setupSQL, querySQL := splitLintsSQL()
3233
// Setup mock postgres
3334
conn := pgtest.NewConn()
3435
defer conn.Close(t)
3536
conn.Query("begin").Reply("BEGIN").
36-
Query(lintsSQL).
37+
Query(setupSQL).
38+
Reply("SET").
39+
Query(querySQL).
3740
Reply("SELECT 1",
3841
[]any{
3942
"rls_disabled_in_public",
@@ -59,10 +62,13 @@ func TestQueryLints(t *testing.T) {
5962
})
6063

6164
t.Run("handles empty results", func(t *testing.T) {
65+
setupSQL, querySQL := splitLintsSQL()
6266
conn := pgtest.NewConn()
6367
defer conn.Close(t)
6468
conn.Query("begin").Reply("BEGIN").
65-
Query(lintsSQL).
69+
Query(setupSQL).
70+
Reply("SET").
71+
Query(querySQL).
6672
Reply("SELECT 0").
6773
Query("rollback").Reply("ROLLBACK")
6874
// Run test
@@ -72,16 +78,32 @@ func TestQueryLints(t *testing.T) {
7278
})
7379

7480
t.Run("handles query error", func(t *testing.T) {
81+
setupSQL, querySQL := splitLintsSQL()
7582
conn := pgtest.NewConn()
7683
defer conn.Close(t)
7784
conn.Query("begin").Reply("BEGIN").
78-
Query(lintsSQL).
85+
Query(setupSQL).
86+
Reply("SET").
87+
Query(querySQL).
7988
ReplyError("42601", "syntax error").
8089
Query("rollback").Reply("ROLLBACK")
8190
// Run test
8291
_, err := queryLints(context.Background(), conn.MockClient(t))
8392
assert.Error(t, err)
8493
})
94+
95+
t.Run("handles setup error", func(t *testing.T) {
96+
setupSQL, _ := splitLintsSQL()
97+
conn := pgtest.NewConn()
98+
defer conn.Close(t)
99+
conn.Query("begin").Reply("BEGIN").
100+
Query(setupSQL).
101+
ReplyError("42601", "syntax error").
102+
Query("rollback").Reply("ROLLBACK")
103+
// Run test
104+
_, err := queryLints(context.Background(), conn.MockClient(t))
105+
assert.ErrorContains(t, err, "failed to prepare lint session")
106+
})
85107
}
86108

87109
func TestFilterLints(t *testing.T) {
@@ -313,11 +335,14 @@ func TestRunLocalWithDbUrl(t *testing.T) {
313335
t.Run("runs advisors against custom db-url", func(t *testing.T) {
314336
utils.Config.Hostname = "127.0.0.1"
315337
utils.Config.Db.Port = 5432
338+
setupSQL, querySQL := splitLintsSQL()
316339

317340
conn := pgtest.NewConn()
318341
defer conn.Close(t)
319342
conn.Query("begin").Reply("BEGIN").
320-
Query(lintsSQL).
343+
Query(setupSQL).
344+
Reply("SET").
345+
Query(querySQL).
321346
Reply("SELECT 1",
322347
[]any{
323348
"rls_disabled_in_public",
@@ -339,10 +364,13 @@ func TestRunLocalWithDbUrl(t *testing.T) {
339364
})
340365

341366
t.Run("returns no issues for empty results", func(t *testing.T) {
367+
setupSQL, querySQL := splitLintsSQL()
342368
conn := pgtest.NewConn()
343369
defer conn.Close(t)
344370
conn.Query("begin").Reply("BEGIN").
345-
Query(lintsSQL).
371+
Query(setupSQL).
372+
Reply("SET").
373+
Query(querySQL).
346374
Reply("SELECT 0").
347375
Query("rollback").Reply("ROLLBACK")
348376

@@ -351,10 +379,13 @@ func TestRunLocalWithDbUrl(t *testing.T) {
351379
})
352380

353381
t.Run("fails on error level when fail-on is set", func(t *testing.T) {
382+
setupSQL, querySQL := splitLintsSQL()
354383
conn := pgtest.NewConn()
355384
defer conn.Close(t)
356385
conn.Query("begin").Reply("BEGIN").
357-
Query(lintsSQL).
386+
Query(setupSQL).
387+
Reply("SET").
388+
Query(querySQL).
358389
Reply("SELECT 1",
359390
[]any{
360391
"rls_disabled_in_public",

0 commit comments

Comments
 (0)