diff --git a/src/backend/distributed/commands/distribute_object_ops.c b/src/backend/distributed/commands/distribute_object_ops.c index f284a53e4..6f8923ffa 100644 --- a/src/backend/distributed/commands/distribute_object_ops.c +++ b/src/backend/distributed/commands/distribute_object_ops.c @@ -564,7 +564,7 @@ static DistributeObjectOps Sequence_AlterOwner = { }; static DistributeObjectOps Sequence_Drop = { .deparse = DeparseDropSequenceStmt, - .qualify = NULL, + .qualify = QualifyDropSequenceStmt, .preprocess = PreprocessDropSequenceStmt, .postprocess = NULL, .address = NULL, diff --git a/src/backend/distributed/commands/sequence.c b/src/backend/distributed/commands/sequence.c index 3638ab737..b97ca4215 100644 --- a/src/backend/distributed/commands/sequence.c +++ b/src/backend/distributed/commands/sequence.c @@ -226,7 +226,6 @@ PreprocessDropSequenceStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext) { DropStmt *stmt = castNode(DropStmt, node); - List *deletingSequencesList = stmt->objects; List *distributedSequencesList = NIL; List *distributedSequenceAddresses = NIL; @@ -259,6 +258,7 @@ PreprocessDropSequenceStmt(Node *node, const char *queryString, * iterate over all sequences to be dropped and filter to keep only distributed * sequences. */ + List *deletingSequencesList = stmt->objects; List *objectNameList = NULL; foreach_ptr(objectNameList, deletingSequencesList) { diff --git a/src/backend/distributed/deparser/deparse_sequence_stmts.c b/src/backend/distributed/deparser/deparse_sequence_stmts.c index e6cb36146..0680e7a20 100644 --- a/src/backend/distributed/deparser/deparse_sequence_stmts.c +++ b/src/backend/distributed/deparser/deparse_sequence_stmts.c @@ -86,12 +86,6 @@ AppendSequenceNameList(StringInfo buf, List *objects, ObjectType objtype) RangeVar *seq = makeRangeVarFromNameList((List *) lfirst(objectCell)); - if (seq->schemaname == NULL) - { - Oid schemaOid = RangeVarGetCreationNamespace(seq); - seq->schemaname = get_namespace_name(schemaOid); - } - char *qualifiedSequenceName = quote_qualified_identifier(seq->schemaname, seq->relname); appendStringInfoString(buf, qualifiedSequenceName); diff --git a/src/backend/distributed/deparser/qualify_sequence_stmt.c b/src/backend/distributed/deparser/qualify_sequence_stmt.c index efff68c72..ac7d72ed8 100644 --- a/src/backend/distributed/deparser/qualify_sequence_stmt.c +++ b/src/backend/distributed/deparser/qualify_sequence_stmt.c @@ -17,7 +17,9 @@ #include "postgres.h" +#include "distributed/commands.h" #include "distributed/deparser.h" +#include "distributed/listutils.h" #include "distributed/version_compat.h" #include "parser/parse_func.h" #include "utils/lsyscache.h" @@ -38,8 +40,13 @@ QualifyAlterSequenceOwnerStmt(Node *node) if (seq->schemaname == NULL) { - Oid schemaOid = RangeVarGetCreationNamespace(seq); - seq->schemaname = get_namespace_name(schemaOid); + Oid seqOid = RangeVarGetRelid(seq, NoLock, stmt->missing_ok); + + if (OidIsValid(seqOid)) + { + Oid schemaOid = get_rel_namespace(seqOid); + seq->schemaname = get_namespace_name(schemaOid); + } } } @@ -59,12 +66,53 @@ QualifyAlterSequenceSchemaStmt(Node *node) if (seq->schemaname == NULL) { - Oid schemaOid = RangeVarGetCreationNamespace(seq); - seq->schemaname = get_namespace_name(schemaOid); + Oid seqOid = RangeVarGetRelid(seq, NoLock, stmt->missing_ok); + + if (OidIsValid(seqOid)) + { + Oid schemaOid = get_rel_namespace(seqOid); + seq->schemaname = get_namespace_name(schemaOid); + } } } +/* + * QualifyDropSequenceStmt transforms a DROP SEQUENCE + * statement in place and makes the sequence name fully qualified. + */ +void +QualifyDropSequenceStmt(Node *node) +{ + DropStmt *stmt = castNode(DropStmt, node); + + Assert(stmt->removeType == OBJECT_SEQUENCE); + + List *objectNameListWithSchema = NIL; + List *objectNameList = NULL; + foreach_ptr(objectNameList, stmt->objects) + { + RangeVar *seq = makeRangeVarFromNameList(objectNameList); + + if (seq->schemaname == NULL) + { + Oid seqOid = RangeVarGetRelid(seq, NoLock, stmt->missing_ok); + + if (OidIsValid(seqOid)) + { + Oid schemaOid = get_rel_namespace(seqOid); + seq->schemaname = get_namespace_name(schemaOid); + } + } + + objectNameListWithSchema = lappend(objectNameListWithSchema, + MakeNameListFromRangeVar(seq)); + } + + stmt->objects = objectNameListWithSchema; +} + + /* * QualifyRenameSequenceStmt transforms a * ALTER SEQUENCE .. RENAME TO .. diff --git a/src/include/distributed/deparser.h b/src/include/distributed/deparser.h index 86bc9cc3d..5a316d39a 100644 --- a/src/include/distributed/deparser.h +++ b/src/include/distributed/deparser.h @@ -213,6 +213,7 @@ extern char * DeparseAlterSequenceOwnerStmt(Node *node); /* forward declarations for qualify_sequence_stmt.c */ extern void QualifyRenameSequenceStmt(Node *node); +extern void QualifyDropSequenceStmt(Node *node); extern void QualifyAlterSequenceSchemaStmt(Node *node); extern void QualifyAlterSequenceOwnerStmt(Node *node);