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)