spanner-annotationsimpls-fixes (#102622)

* Fix DELETE statements.
* Reset sequence generator when truncating tables.
* Quote "at", since it's a keyword in Spanner.
This commit is contained in:
Peter Štibraný
2025-03-21 16:10:51 +01:00
committed by GitHub
parent 19d1ded3bf
commit 3d53968ecb
7 changed files with 28 additions and 6 deletions
@@ -119,8 +119,8 @@ func TestIntegrationAnnotationCleanUp(t *testing.T) {
t.Cleanup(func() {
err := fakeSQL.WithDbSession(context.Background(), func(session *db.Session) error {
_, deleteAnnotationErr := session.Exec("DELETE FROM annotation")
_, deleteAnnotationTagErr := session.Exec("DELETE FROM annotation_tag")
_, deleteAnnotationErr := session.Exec("DELETE FROM annotation WHERE true")
_, deleteAnnotationTagErr := session.Exec("DELETE FROM annotation_tag WHERE true")
return errors.Join(deleteAnnotationErr, deleteAnnotationTagErr)
})
assert.NoError(t, err)
@@ -157,7 +157,7 @@ func TestIntegrationOldAnnotationsAreDeletedFirst(t *testing.T) {
t.Cleanup(func() {
err := fakeSQL.WithDbSession(context.Background(), func(session *db.Session) error {
_, err := session.Exec("DELETE FROM annotation")
_, err := session.Exec("DELETE FROM annotation WHERE true")
return err
})
assert.NoError(t, err)
@@ -333,10 +333,11 @@ func (r *xormRepositoryImpl) Get(ctx context.Context, query annotations.ItemQuer
}
if len(tags) > 0 {
// "at" is a keyword in Spanner and needs to be quoted.
tagsSubQuery := fmt.Sprintf(`
SELECT SUM(1) FROM annotation_tag at
INNER JOIN tag on tag.id = at.tag_id
WHERE at.annotation_id = a.id
SELECT SUM(1) FROM annotation_tag `+r.db.Quote("at")+`
INNER JOIN tag on tag.id = `+r.db.Quote("at")+`.tag_id
WHERE `+r.db.Quote("at")+`.annotation_id = a.id
AND (
%s
)
+2
View File
@@ -628,6 +628,8 @@ func TestMain(m *testing.M) {
if err := testSQLStore.dialect.TruncateDBTables(testSQLStore.GetEngine()); err != nil {
return nil, err
}
testSQLStore.engine.ResetSequenceGenerator()
if err := testSQLStore.Reset(); err != nil {
return nil, err
}
@@ -183,6 +183,7 @@ func NewTestStore(tb TestingTB, opts ...TestOption) *SQLStore {
tb.Fatalf("failed to truncate DB tables after migrations: %v", err)
panic("unreachable")
}
testSQLStore.engine.ResetSequenceGenerator()
}
return store
+4
View File
@@ -19,6 +19,10 @@ func newSequenceGenerator(db *sql.DB) *sequenceGenerator {
}
}
func (sg *sequenceGenerator) Reset() {
// Nothing to do. This generator always uses state from DB.
}
func (sg *sequenceGenerator) Next(ctx context.Context, table, column string) (int64, error) {
// Current implementation fetches new value for each Next call.
key := fmt.Sprintf("%s:%s", table, column)
+7
View File
@@ -18,6 +18,13 @@ func newInMemSequenceGenerator() *inMemSequenceGenerator {
}
}
func (g *inMemSequenceGenerator) Reset() {
g.sequencesMu.Lock()
defer g.sequencesMu.Unlock()
g.nextValues = make(map[string]int)
}
func (g *inMemSequenceGenerator) Next(_ context.Context, table, column string) (int64, error) {
if table == "migration_log" {
// Don't use sequential IDs for migration log entries, as we don't clean up migration_log table between tests,
+7
View File
@@ -127,8 +127,15 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
return engine, nil
}
func (engine *Engine) ResetSequenceGenerator() {
if engine.sequenceGenerator != nil {
engine.sequenceGenerator.Reset()
}
}
type SequenceGenerator interface {
Next(ctx context.Context, table, column string) (int64, error)
Reset()
}
type DialectExt interface {