mirror of https://github.com/citusdata/citus.git
75 lines
2.0 KiB
C
75 lines
2.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* errormessage.h
|
|
* Error handling related support functionality.
|
|
*
|
|
* Copyright (c) Citus Data, Inc.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef ERRORMESSAGE_H
|
|
#define ERRORMESSAGE_H
|
|
|
|
|
|
#include "c.h"
|
|
#include "distributed/citus_nodes.h"
|
|
|
|
|
|
typedef struct DeferredErrorMessage
|
|
{
|
|
CitusNode tag;
|
|
|
|
int code;
|
|
const char *message;
|
|
const char *detail;
|
|
const char *hint;
|
|
const char *filename;
|
|
int linenumber;
|
|
const char *functionname;
|
|
} DeferredErrorMessage;
|
|
|
|
|
|
/*
|
|
* DeferredError allocates a deferred error message, that can later be emitted
|
|
* using RaiseDeferredError(). These error messages can be
|
|
* serialized/copied/deserialized, i.e. can be embedded in plans and such.
|
|
*/
|
|
#define DeferredError(code, message, detail, hint) \
|
|
DeferredErrorInternal(code, message, detail, hint, __FILE__, __LINE__, \
|
|
PG_FUNCNAME_MACRO)
|
|
|
|
DeferredErrorMessage * DeferredErrorInternal(int code, const char *message,
|
|
const char *detail, const char *hint,
|
|
const char *filename, int linenumber, const
|
|
char *functionname);
|
|
|
|
/*
|
|
* RaiseDeferredError emits a previously allocated error using the specified
|
|
* severity.
|
|
*
|
|
* The trickery with __builtin_constant_p/pg_unreachable aims to have the
|
|
* compiler understand that the function will not return if elevel >= ERROR.
|
|
*/
|
|
#ifdef HAVE__BUILTIN_CONSTANT_P
|
|
#define RaiseDeferredError(error, elevel) \
|
|
do { \
|
|
RaiseDeferredErrorInternal(error, elevel); \
|
|
if (__builtin_constant_p(elevel) && (elevel) >= ERROR) { \
|
|
pg_unreachable(); } \
|
|
} \
|
|
while (0)
|
|
#else /* !HAVE_BUILTIN_CONSTANT_P */
|
|
#define RaiseDeferredError(error, elevel) \
|
|
do { \
|
|
const int elevel_ = (elevel); \
|
|
RaiseDeferredErrorInternal(error, elevel_); \
|
|
if (elevel_ >= ERROR) { \
|
|
pg_unreachable(); } \
|
|
} \
|
|
while (0)
|
|
#endif /* HAVE_BUILTIN_CONSTANT_P */
|
|
|
|
void RaiseDeferredErrorInternal(DeferredErrorMessage *error, int elevel);
|
|
|
|
#endif
|