internal/postgres; don't delete module from paths
When deleting a module, don't delete its path from the paths table,
because that path may be used elsewhere.
For golang/go#47954
Change-Id: I2085b745616ab3ab29f62dcc4be7b3e4a4d71b6f
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/344954
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
diff --git a/internal/postgres/delete.go b/internal/postgres/delete.go
index ed25317..4bf3626 100644
--- a/internal/postgres/delete.go
+++ b/internal/postgres/delete.go
@@ -34,13 +34,14 @@
if err != sql.ErrNoRows || err == nil {
return err
}
- // No versions of this module exist; remove it from paths and
- // imports_unique.
- //
- // Deleting from paths will also cascade a DELETE to
- // latest_module_versions. Other tables should already have removed any
- // rows referencing the paths table.
- if _, err = tx.Exec(ctx, `DELETE FROM paths WHERE path = $1`, modulePath); err != nil {
+ // No versions of this module exist.
+ // We can't remove it from paths, because the module path may be a package or directory
+ // path for a different module.
+ // But we can remove it from latest_module_versions and imports_unique.
+ if _, err = tx.Exec(ctx, `
+ DELETE FROM latest_module_versions
+ WHERE module_path_id = (SELECT id FROM paths WHERE path = $1)
+ `, modulePath); err != nil {
return err
}
return deleteModuleFromImportsUnique(ctx, tx, modulePath)