/*
* Heuristic to see if the database was dropped, and if it was we can
- * treat it as not an error, else treat as fatal and error out. TODO:
- * this could probably be improved with a tighter check.
+ * treat it as not an error, else treat as fatal and error out.
*/
if (DatabaseExists(db->dboid))
return DATACHECKSUMSWORKER_FAILED;
* DatabaseExists
*
* Scans the system catalog to check if a database with the given Oid exists
- * and returns true if it is found, else false.
+ * and returns true if it is found and valid, else false. Note, we cannot use
+ * database_is_invalid_oid here as it will ERROR out, and we want to gracefully
+ * handle errors.
*/
static bool
DatabaseExists(Oid dboid)
SysScanDesc scan;
bool found;
HeapTuple tuple;
+ Form_pg_database pg_database_tuple;
StartTransactionCommand();
tuple = systable_getnext(scan);
found = HeapTupleIsValid(tuple);
+ /* If the Oid exists, ensure that it's not partially dropped */
+ if (found)
+ {
+ pg_database_tuple = (Form_pg_database) GETSTRUCT(tuple);
+ if (database_is_invalid_form(pg_database_tuple))
+ found = false;
+ }
+
systable_endscan(scan);
table_close(rel, AccessShareLock);