mirror of https://github.com/citusdata/citus.git
307 lines
5.2 KiB
C
307 lines
5.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* qualify.c
|
|
* The deparser relies on fully qualified names on all statements to
|
|
* work transparently on a remote worker node. Here we have helpers to
|
|
* fully qualify parsetrees.
|
|
*
|
|
* Fully qualified parsetrees contain names for all identifiers that
|
|
* are search_path agnostic. Meaning we need to include the schema name
|
|
* for each and every identifier in the parsetree.
|
|
*
|
|
* This file contains mostly the distpatching functions to specialized
|
|
* functions for each class of objects. eg qualify_type_stmt.c contains
|
|
* all functions related to fully qualifying parsetrees that interact
|
|
* with types.
|
|
*
|
|
* Copyright (c) 2019, Citus Data, Inc.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "distributed/deparser.h"
|
|
|
|
|
|
static void QualifyRenameStmt(RenameStmt *stmt);
|
|
static void QualifyRenameAttributeStmt(RenameStmt *stmt);
|
|
static void QualifyAlterTableStmt(AlterTableStmt *stmt);
|
|
static void QualifyAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt);
|
|
static void QualifyAlterOwnerStmt(AlterOwnerStmt *stmt);
|
|
static void QualifyAlterObjectDependsStmt(AlterObjectDependsStmt *stmt);
|
|
static void QualifyDropObjectStmt(DropStmt *stmt);
|
|
|
|
/*
|
|
* QualifyTreeNode transforms the statement in place and makes all (supported) statements
|
|
* fully qualified. Fully qualified statements allow for application on a remote postgres
|
|
* server irregardless of their search_path.
|
|
*/
|
|
void
|
|
QualifyTreeNode(Node *stmt)
|
|
{
|
|
switch (nodeTag(stmt))
|
|
{
|
|
case T_RenameStmt:
|
|
{
|
|
QualifyRenameStmt(castNode(RenameStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterEnumStmt:
|
|
{
|
|
QualifyAlterEnumStmt(castNode(AlterEnumStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterTableStmt:
|
|
{
|
|
QualifyAlterTableStmt(castNode(AlterTableStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_CompositeTypeStmt:
|
|
{
|
|
QualifyCompositeTypeStmt(castNode(CompositeTypeStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_CreateEnumStmt:
|
|
{
|
|
QualifyCreateEnumStmt(castNode(CreateEnumStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterObjectSchemaStmt:
|
|
{
|
|
QualifyAlterObjectSchemaStmt(castNode(AlterObjectSchemaStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterOwnerStmt:
|
|
{
|
|
QualifyAlterOwnerStmt(castNode(AlterOwnerStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterFunctionStmt:
|
|
{
|
|
QualifyAlterFunctionStmt(castNode(AlterFunctionStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_AlterObjectDependsStmt:
|
|
{
|
|
QualifyAlterObjectDependsStmt(castNode(AlterObjectDependsStmt, stmt));
|
|
return;
|
|
}
|
|
|
|
case T_DropStmt:
|
|
{
|
|
QualifyDropObjectStmt(castNode(DropStmt, stmt));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
/* skip unsupported statements */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* QualifyRenameStmt transforms a RENAME statement in place and makes all (supported)
|
|
* statements fully qualified.
|
|
*/
|
|
static void
|
|
QualifyRenameStmt(RenameStmt *stmt)
|
|
{
|
|
switch (stmt->renameType)
|
|
{
|
|
case OBJECT_TYPE:
|
|
{
|
|
QualifyRenameTypeStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_ATTRIBUTE:
|
|
{
|
|
QualifyRenameAttributeStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_COLLATION:
|
|
{
|
|
QualifyRenameCollationStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_AGGREGATE:
|
|
case OBJECT_FUNCTION:
|
|
case OBJECT_PROCEDURE:
|
|
{
|
|
QualifyRenameFunctionStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
/* skip unsupported statements */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* QualifyRenameAttributeStmt transforms a RENAME ATTRIBUTE statement in place and makes all (supported)
|
|
* statements fully qualified.
|
|
*/
|
|
static void
|
|
QualifyRenameAttributeStmt(RenameStmt *stmt)
|
|
{
|
|
Assert(stmt->renameType == OBJECT_ATTRIBUTE);
|
|
|
|
switch (stmt->relationType)
|
|
{
|
|
case OBJECT_TYPE:
|
|
{
|
|
QualifyRenameTypeAttributeStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
QualifyAlterTableStmt(AlterTableStmt *stmt)
|
|
{
|
|
switch (stmt->relkind)
|
|
{
|
|
case OBJECT_TYPE:
|
|
{
|
|
QualifyAlterTypeStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
/* skip unsupported statements */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
QualifyAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt)
|
|
{
|
|
switch (stmt->objectType)
|
|
{
|
|
case OBJECT_TYPE:
|
|
{
|
|
QualifyAlterTypeSchemaStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_COLLATION:
|
|
{
|
|
QualifyAlterCollationSchemaStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_AGGREGATE:
|
|
case OBJECT_FUNCTION:
|
|
case OBJECT_PROCEDURE:
|
|
{
|
|
QualifyAlterFunctionSchemaStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
/* skip unsupported statements */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
QualifyAlterOwnerStmt(AlterOwnerStmt *stmt)
|
|
{
|
|
switch (stmt->objectType)
|
|
{
|
|
case OBJECT_TYPE:
|
|
{
|
|
QualifyAlterTypeOwnerStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_COLLATION:
|
|
{
|
|
QualifyAlterCollationOwnerStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
case OBJECT_AGGREGATE:
|
|
case OBJECT_FUNCTION:
|
|
case OBJECT_PROCEDURE:
|
|
{
|
|
QualifyAlterFunctionOwnerStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
QualifyAlterObjectDependsStmt(AlterObjectDependsStmt *stmt)
|
|
{
|
|
switch (stmt->objectType)
|
|
{
|
|
case OBJECT_FUNCTION:
|
|
case OBJECT_PROCEDURE:
|
|
{
|
|
QualifyAlterFunctionDependsStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
QualifyDropObjectStmt(DropStmt *stmt)
|
|
{
|
|
switch (stmt->removeType)
|
|
{
|
|
case OBJECT_COLLATION:
|
|
{
|
|
QualifyDropCollationStmt(stmt);
|
|
return;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|