diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/nodes/extensible.h | 72 | ||||
-rw-r--r-- | src/include/nodes/nodes.h | 12 |
2 files changed, 84 insertions, 0 deletions
diff --git a/src/include/nodes/extensible.h b/src/include/nodes/extensible.h new file mode 100644 index 00000000000..96ae7bc9291 --- /dev/null +++ b/src/include/nodes/extensible.h @@ -0,0 +1,72 @@ +/*------------------------------------------------------------------------- + * + * extensible.h + * Definitions for extensible node type + * + * + * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/nodes/extensible.h + * + *------------------------------------------------------------------------- + */ +#ifndef EXTENSIBLE_H +#define EXTENSIBLE_H + +#include "nodes/nodes.h" + +#define EXTNODENAME_MAX_LEN 64 + +/* + * An extensible node is a new type of node defined by an extension. The + * type is always T_ExtensibleNode, while the extnodename identifies the + * specific type of node. extnodename can be looked up to find the + * ExtensibleNodeMethods for this node type. + */ +typedef struct ExtensibleNode +{ + NodeTag type; + const char *extnodename; /* identifier of ExtensibleNodeMethods */ +} ExtensibleNode; + +/* + * node_size is the size of an extensible node of this type in bytes. + * + * nodeCopy is a function which performs a deep copy from oldnode to newnode. + * It does not need to copy type or extnodename, which are copied by the + * core system. + * + * nodeEqual is a function which performs a deep equality comparison between + * a and b and returns true or false accordingly. It does not need to compare + * type or extnodename, which are compared by the core system. + * + * nodeOut is a serialization function for the node type. It should use the + * output conventions typical for outfuncs.c. It does not need to output + * type or extnodename; the core system handles those. + * + * nodeRead is a deserialization function for the node type. It does not need + * to read type or extnodename; the core system handles those. It should fetch + * the next token using pg_strtok() from the current input stream, and then + * reconstruct the private fields according to the manner in readfuncs.c. + * + * All callbacks are mandatory. + */ +typedef struct ExtensibleNodeMethods +{ + const char *extnodename; + Size node_size; + void (*nodeCopy)(struct ExtensibleNode *newnode, + const struct ExtensibleNode *oldnode); + bool (*nodeEqual)(const struct ExtensibleNode *a, + const struct ExtensibleNode *b); + void (*nodeOut)(struct StringInfoData *str, + const struct ExtensibleNode *node); + void (*nodeRead)(struct ExtensibleNode *node); +} ExtensibleNodeMethods; + +extern void RegisterExtensibleNodeMethods(const ExtensibleNodeMethods *method); +extern const ExtensibleNodeMethods *GetExtensibleNodeMethods(const char *name, + bool missing_ok); + +#endif /* EXTENSIBLE_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index cf09db4e5fe..c407fa2cd49 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -276,6 +276,11 @@ typedef enum NodeTag T_OidList, /* + * TAGS FOR EXTENSIBLE NODES (extensible.h) + */ + T_ExtensibleNode, + + /* * TAGS FOR STATEMENT NODES (mostly in parsenodes.h) */ T_Query = 700, @@ -527,10 +532,17 @@ extern PGDLLIMPORT Node *newNodeMacroHolder; */ extern char *nodeToString(const void *obj); +struct Bitmapset; /* not to include bitmapset.h here */ +struct StringInfoData; /* not to include stringinfo.h here */ +extern void outToken(struct StringInfoData *str, const char *s); +extern void outBitmapset(struct StringInfoData *str, + const struct Bitmapset *bms); + /* * nodes/{readfuncs.c,read.c} */ extern void *stringToNode(char *str); +extern struct Bitmapset *readBitmapset(void); /* * nodes/copyfuncs.c |