static void deparseCreateTrigStmt()

in ext/pg_query/pg_query_deparse.c [9051:9158]


static void deparseCreateTrigStmt(StringInfo str, CreateTrigStmt *create_trig_stmt)
{
	ListCell *lc;
	bool skip_events_or = true;

	appendStringInfoString(str, "CREATE ");
	if (create_trig_stmt->isconstraint)
		appendStringInfoString(str, "CONSTRAINT ");
	appendStringInfoString(str, "TRIGGER ");

	appendStringInfoString(str, quote_identifier(create_trig_stmt->trigname));
	appendStringInfoChar(str, ' ');

	switch (create_trig_stmt->timing)
	{
		case TRIGGER_TYPE_BEFORE:
			appendStringInfoString(str, "BEFORE ");
			break;
		case TRIGGER_TYPE_AFTER:
			appendStringInfoString(str, "AFTER ");
			break;
		case TRIGGER_TYPE_INSTEAD:
			appendStringInfoString(str, "INSTEAD OF ");
			break;
		default:
			Assert(false);
	}

	if (TRIGGER_FOR_INSERT(create_trig_stmt->events))
	{
		appendStringInfoString(str, "INSERT ");
		skip_events_or = false;
	}
	if (TRIGGER_FOR_DELETE(create_trig_stmt->events))
	{
		if (!skip_events_or)
			appendStringInfoString(str, "OR ");
		appendStringInfoString(str, "DELETE ");
		skip_events_or = false;
	}
	if (TRIGGER_FOR_UPDATE(create_trig_stmt->events))
	{
		if (!skip_events_or)
			appendStringInfoString(str, "OR ");
		appendStringInfoString(str, "UPDATE ");
		if (list_length(create_trig_stmt->columns) > 0)
		{
			appendStringInfoString(str, "OF ");
			deparseColumnList(str, create_trig_stmt->columns);
			appendStringInfoChar(str, ' ');
		}
		skip_events_or = false;
	}
	if (TRIGGER_FOR_TRUNCATE(create_trig_stmt->events))
	{
		if (!skip_events_or)
			appendStringInfoString(str, "OR ");
		appendStringInfoString(str, "TRUNCATE ");
	}

	appendStringInfoString(str, "ON ");
	deparseRangeVar(str, create_trig_stmt->relation, DEPARSE_NODE_CONTEXT_NONE);
	appendStringInfoChar(str, ' ');

	if (create_trig_stmt->transitionRels != NULL)
	{
		appendStringInfoString(str, "REFERENCING ");
		foreach(lc, create_trig_stmt->transitionRels)
		{
			deparseTriggerTransition(str, castNode(TriggerTransition, lfirst(lc)));
			appendStringInfoChar(str, ' ');
		}
	}

	if (create_trig_stmt->constrrel != NULL)
	{
		appendStringInfoString(str, "FROM ");
		deparseRangeVar(str, create_trig_stmt->constrrel, DEPARSE_NODE_CONTEXT_NONE);
		appendStringInfoChar(str, ' ');
	}
	
	if (create_trig_stmt->deferrable)
		appendStringInfoString(str, "DEFERRABLE ");

	if (create_trig_stmt->initdeferred)
		appendStringInfoString(str, "INITIALLY DEFERRED ");

	if (create_trig_stmt->row)
		appendStringInfoString(str, "FOR EACH ROW ");

	if (create_trig_stmt->whenClause)
	{
		appendStringInfoString(str, "WHEN (");
		deparseExpr(str, create_trig_stmt->whenClause);
		appendStringInfoString(str, ") ");
	}

	appendStringInfoString(str, "EXECUTE FUNCTION ");
	deparseFuncName(str, create_trig_stmt->funcname);
	appendStringInfoChar(str, '(');
	foreach(lc, create_trig_stmt->args)
	{
		deparseStringLiteral(str, strVal(lfirst(lc)));
		if (lnext(create_trig_stmt->args, lc))
			appendStringInfoString(str, ", ");
	}
	appendStringInfoChar(str, ')');
}