citus/src/backend/distributed/deparser/deparse.c

56 lines
1.3 KiB
C

/*-------------------------------------------------------------------------
*
* deparse.c
* Entrypoint for deparsing parsetrees.
*
* The goal of deparsing parsetrees is to reconstruct sql statements
* from any parsed sql statement by ParseTreeNode. Deparsed statements
* can be used to reapply them on remote postgres nodes like the citus
* workers.
*
* Copyright (c) Citus Data, Inc.
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "distributed/commands.h"
#include "distributed/deparser.h"
#include "distributed/listutils.h"
/*
* DeparseTreeNode aims to be the inverse of postgres' ParseTreeNode. Currently with
* limited support. Check support before using, and add support for new statements as
* required.
*/
char *
DeparseTreeNode(Node *stmt)
{
const DistributeObjectOps *ops = GetDistributeObjectOps(stmt);
if (!ops->deparse)
{
ereport(ERROR, (errmsg("unsupported statement for deparsing")));
}
return ops->deparse(stmt);
}
/*
* DeparseTreeNodes deparses all stmts in the list from the statement datastructure into
* sql statements.
*/
List *
DeparseTreeNodes(List *stmts)
{
List *sqls = NIL;
Node *stmt = NULL;
foreach_declared_ptr(stmt, stmts)
{
sqls = lappend(sqls, DeparseTreeNode(stmt));
}
return sqls;
}