Skip to content

Commit 82dd860

Browse files
authored
Merge pull request #2737 from KhokhlovDV/fix/gc-builder-placeholders
fix: use gc db builder for correct query placheolder. #2375
2 parents 6bec092 + 364beeb commit 82dd860

3 files changed

Lines changed: 34 additions & 8 deletions

File tree

internal/storage/postgres/gc/gc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func (gc *GC) getLastTransactionIDForTenant(ctx context.Context, tenantID string
195195

196196
// deleteRecordsForTenant generates and executes DELETE queries for relation_tuples and attributes tables for a specific tenant.
197197
func (gc *GC) deleteRecordsForTenant(ctx context.Context, table, tenantID string, lastTransactionID uint64) error {
198-
queryBuilder := utils.GenerateGCQueryForTenant(table, tenantID, lastTransactionID)
198+
queryBuilder := utils.GenerateGCQueryForTenant(gc.database.Builder, table, tenantID, lastTransactionID)
199199
query, args, err := queryBuilder.ToSql()
200200
if err != nil {
201201
return err

internal/storage/postgres/utils/common.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ func SnapshotQuery(sl squirrel.SelectBuilder, value uint64, snapshotValue string
8585
// GenerateGCQuery generates a Squirrel DELETE query builder for garbage collection.
8686
// It constructs a query to delete expired records from the specified table
8787
// based on the provided value, which represents a transaction ID.
88-
func GenerateGCQuery(table string, value uint64) squirrel.DeleteBuilder {
88+
func GenerateGCQuery(sl squirrel.StatementBuilderType, table string, value uint64) squirrel.DeleteBuilder {
8989
// Create a Squirrel DELETE builder for the specified table.
90-
deleteBuilder := squirrel.Delete(table)
90+
deleteBuilder := sl.Delete(table)
9191

9292
// Create an expression to check if 'expired_tx_id' is not equal to ActiveRecordTxnID (expired records).
9393
expiredNotActiveExpr := squirrel.Expr("expired_tx_id <> ?::xid8", ActiveRecordTxnID)
@@ -102,9 +102,9 @@ func GenerateGCQuery(table string, value uint64) squirrel.DeleteBuilder {
102102
// GenerateGCQueryForTenant generates a Squirrel DELETE query builder for tenant-aware garbage collection.
103103
// It constructs a query to delete expired records from the specified table for a specific tenant
104104
// based on the provided value, which represents a transaction ID.
105-
func GenerateGCQueryForTenant(table, tenantID string, value uint64) squirrel.DeleteBuilder {
105+
func GenerateGCQueryForTenant(sl squirrel.StatementBuilderType, table, tenantID string, value uint64) squirrel.DeleteBuilder {
106106
// Create a Squirrel DELETE builder for the specified table.
107-
deleteBuilder := squirrel.Delete(table)
107+
deleteBuilder := sl.Delete(table)
108108

109109
// Create an expression to check if 'expired_tx_id' is not equal to ActiveRecordTxnID (expired records).
110110
expiredNotActiveExpr := squirrel.Expr("expired_tx_id <> ?::xid8", ActiveRecordTxnID)

internal/storage/postgres/utils/common_test.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ var _ = Describe("Common", func() {
6969
})
7070
})
7171

72-
Context("TestGarbageCollectQuery", func() {
72+
Context("TestGarbageCollectQuery question placeholder", func() {
7373
It("Case 1", func() {
74-
query := utils.GenerateGCQuery("relation_tuples", 100)
74+
sl := squirrel.StatementBuilder.PlaceholderFormat(squirrel.Question)
75+
query := utils.GenerateGCQuery(sl, "relation_tuples", 100)
7576
sql, args, err := query.ToSql()
7677
Expect(err).ShouldNot(HaveOccurred())
7778

@@ -81,7 +82,8 @@ var _ = Describe("Common", func() {
8182
})
8283

8384
It("Case 2 - Tenant Aware", func() {
84-
query := utils.GenerateGCQueryForTenant("relation_tuples", "tenant1", 100)
85+
sl := squirrel.StatementBuilder.PlaceholderFormat(squirrel.Question)
86+
query := utils.GenerateGCQueryForTenant(sl, "relation_tuples", "tenant1", 100)
8587
sql, args, err := query.ToSql()
8688
Expect(err).ShouldNot(HaveOccurred())
8789

@@ -91,6 +93,30 @@ var _ = Describe("Common", func() {
9193
})
9294
})
9395

96+
Context("TestGarbageCollectQuery dollar placeholder", func() {
97+
It("Case 1", func() {
98+
sl := squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
99+
query := utils.GenerateGCQuery(sl, "relation_tuples", 100)
100+
sql, args, err := query.ToSql()
101+
Expect(err).ShouldNot(HaveOccurred())
102+
103+
expectedSQL := "DELETE FROM relation_tuples WHERE expired_tx_id <> $1::xid8 AND expired_tx_id < $2::xid8"
104+
Expect(expectedSQL).Should(Equal(sql))
105+
Expect(args).Should(Equal([]interface{}{utils.ActiveRecordTxnID, uint64(100)}))
106+
})
107+
108+
It("Case 2 - Tenant Aware", func() {
109+
sl := squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
110+
query := utils.GenerateGCQueryForTenant(sl, "relation_tuples", "tenant1", 100)
111+
sql, args, err := query.ToSql()
112+
Expect(err).ShouldNot(HaveOccurred())
113+
114+
expectedSQL := "DELETE FROM relation_tuples WHERE tenant_id = $1 AND expired_tx_id <> $2::xid8 AND expired_tx_id < $3::xid8"
115+
Expect(expectedSQL).Should(Equal(sql))
116+
Expect(args).Should(Equal([]interface{}{"tenant1", utils.ActiveRecordTxnID, uint64(100)}))
117+
})
118+
})
119+
94120
Context("Error Handling", func() {
95121
var (
96122
ctx context.Context

0 commit comments

Comments
 (0)