Check the removeType in IsDropCitusStmt (#3859)

We should check the remove type in IsDropCitusStmt because if the remove
type is not OBJECT_EXTENSION then the stored objects in
dropStmt->objects may not be of type Value. This was crashing PG-13.

Also rename the method as IsDropCitusExtensionStmt.
pull/3871/head
SaitTalhaNisanci 2020-06-05 20:49:54 +03:00 committed by GitHub
parent f7224a12f2
commit d0f47eb338
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 9 deletions

View File

@ -669,7 +669,7 @@ ShouldPropagateExtensionCommand(Node *parseTree)
{ {
return false; return false;
} }
else if (IsDropCitusStmt(parseTree)) else if (IsDropCitusExtensionStmt(parseTree))
{ {
return false; return false;
} }
@ -718,21 +718,28 @@ IsCreateAlterExtensionUpdateCitusStmt(Node *parseTree)
/* /*
* IsDropCitusStmt iterates the objects to be dropped in a drop statement * IsDropCitusExtensionStmt iterates the objects to be dropped in a drop statement
* and try to find citus there. * and try to find citus extension there.
*/ */
bool bool
IsDropCitusStmt(Node *parseTree) IsDropCitusExtensionStmt(Node *parseTree)
{ {
/* if it is not a DropStmt, it is needless to search for citus */ /* if it is not a DropStmt, it is needless to search for citus */
if (!IsA(parseTree, DropStmt)) if (!IsA(parseTree, DropStmt))
{ {
return false; return false;
} }
DropStmt *dropStmt = (DropStmt *) parseTree;
/* now that we have a DropStmt, check if citus is among the objects to dropped */ /* check if the drop command is a DROP EXTENSION command */
if (dropStmt->removeType != OBJECT_EXTENSION)
{
return false;
}
/* now that we have a DropStmt, check if citus extension is among the objects to dropped */
Value *objectName; Value *objectName;
foreach_ptr(objectName, ((DropStmt *) parseTree)->objects) foreach_ptr(objectName, dropStmt->objects)
{ {
const char *extensionName = strVal(objectName); const char *extensionName = strVal(objectName);

View File

@ -458,7 +458,7 @@ multi_ProcessUtility(PlannedStmt *pstmt,
} }
} }
if (IsDropCitusStmt(parsetree)) if (IsDropCitusExtensionStmt(parsetree))
{ {
StopMaintenanceDaemon(MyDatabaseId); StopMaintenanceDaemon(MyDatabaseId);
} }
@ -628,7 +628,7 @@ multi_ProcessUtility(PlannedStmt *pstmt,
PostprocessVacuumStmt(vacuumStmt, queryString); PostprocessVacuumStmt(vacuumStmt, queryString);
} }
if (!IsDropCitusStmt(parsetree) && !IsA(parsetree, DropdbStmt)) if (!IsDropCitusExtensionStmt(parsetree) && !IsA(parsetree, DropdbStmt))
{ {
/* /*
* Ensure value is valid, we can't do some checks during CREATE * Ensure value is valid, we can't do some checks during CREATE

View File

@ -73,7 +73,7 @@ extern ObjectAddress DefineCollationStmtObjectAddress(Node *stmt, bool missing_o
extern List * PostprocessDefineCollationStmt(Node *stmt, const char *queryString); extern List * PostprocessDefineCollationStmt(Node *stmt, const char *queryString);
/* extension.c - forward declarations */ /* extension.c - forward declarations */
extern bool IsDropCitusStmt(Node *parsetree); extern bool IsDropCitusExtensionStmt(Node *parsetree);
extern bool IsCreateAlterExtensionUpdateCitusStmt(Node *parsetree); extern bool IsCreateAlterExtensionUpdateCitusStmt(Node *parsetree);
extern void ErrorIfUnstableCreateOrAlterExtensionStmt(Node *parsetree); extern void ErrorIfUnstableCreateOrAlterExtensionStmt(Node *parsetree);
extern List * PostprocessCreateExtensionStmt(Node *stmt, const char *queryString); extern List * PostprocessCreateExtensionStmt(Node *stmt, const char *queryString);