/*
|
* Licensed to the Apache Software Foundation (ASF) under one
|
* or more contributor license agreements. See the NOTICE file
|
* distributed with this work for additional information
|
* regarding copyright ownership. The ASF licenses this file
|
* to you under the Apache License, Version 2.0 (the
|
* "License"); you may not use this file except in compliance
|
* with the License. You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing,
|
* software distributed under the License is distributed on an
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* KIND, either express or implied. See the License for the
|
* specific language governing permissions and limitations
|
* under the License.
|
*/
|
|
#include "postgres.h"
|
|
#include "nodes/extensible.h"
|
|
#include "nodes/ag_nodes.h"
|
#include "nodes/cypher_copyfuncs.h"
|
#include "nodes/cypher_outfuncs.h"
|
#include "nodes/cypher_readfuncs.h"
|
#include "nodes/cypher_nodes.h"
|
|
static bool equal_ag_node(const ExtensibleNode *a, const ExtensibleNode *b);
|
|
// This list must match ag_node_tag.
|
const char *node_names[] = {
|
"ag_node_invalid",
|
"cypher_return",
|
"cypher_with",
|
"cypher_match",
|
"cypher_create",
|
"cypher_set",
|
"cypher_set_item",
|
"cypher_delete",
|
"cypher_unwind",
|
"cypher_merge",
|
"cypher_path",
|
"cypher_node",
|
"cypher_relationship",
|
"cypher_bool_const",
|
"cypher_param",
|
"cypher_map",
|
"cypher_list",
|
"cypher_comparison_aexpr",
|
"cypher_comparison_boolexpr",
|
"cypher_string_match",
|
"cypher_typecast",
|
"cypher_integer_const",
|
"cypher_sub_pattern",
|
"cypher_call",
|
"cypher_create_target_nodes",
|
"cypher_create_path",
|
"cypher_target_node",
|
"cypher_update_information",
|
"cypher_update_item",
|
"cypher_delete_information",
|
"cypher_delete_item",
|
"cypher_merge_information"
|
};
|
|
/*
|
* Each node defined with this will have
|
* an out function defined, but copy, equal,
|
* and read will throw errors.
|
*/
|
#define DEFINE_NODE_METHODS(type) \
|
{ \
|
CppAsString(type), \
|
sizeof(type), \
|
copy_ag_node, \
|
equal_ag_node, \
|
CppConcat(out_, type), \
|
read_ag_node \
|
}
|
|
/*
|
* Each node defined with this will have a
|
* copy, read, and write function defined.
|
* Equal will still throw an error.
|
*/
|
#define DEFINE_NODE_METHODS_EXTENDED(type) \
|
{ \
|
CppAsString(type), \
|
sizeof(type), \
|
CppConcat(copy_, type), \
|
equal_ag_node, \
|
CppConcat(out_, type), \
|
CppConcat(read_, type) \
|
}
|
|
// This list must match ag_node_tag.
|
const ExtensibleNodeMethods node_methods[] = {
|
DEFINE_NODE_METHODS(cypher_return),
|
DEFINE_NODE_METHODS(cypher_with),
|
DEFINE_NODE_METHODS(cypher_match),
|
DEFINE_NODE_METHODS(cypher_create),
|
DEFINE_NODE_METHODS(cypher_set),
|
DEFINE_NODE_METHODS(cypher_set_item),
|
DEFINE_NODE_METHODS(cypher_delete),
|
DEFINE_NODE_METHODS(cypher_unwind),
|
DEFINE_NODE_METHODS(cypher_merge),
|
DEFINE_NODE_METHODS(cypher_path),
|
DEFINE_NODE_METHODS(cypher_node),
|
DEFINE_NODE_METHODS(cypher_relationship),
|
DEFINE_NODE_METHODS(cypher_bool_const),
|
DEFINE_NODE_METHODS(cypher_param),
|
DEFINE_NODE_METHODS(cypher_map),
|
DEFINE_NODE_METHODS(cypher_list),
|
DEFINE_NODE_METHODS(cypher_comparison_aexpr),
|
DEFINE_NODE_METHODS(cypher_comparison_boolexpr),
|
DEFINE_NODE_METHODS(cypher_string_match),
|
DEFINE_NODE_METHODS(cypher_typecast),
|
DEFINE_NODE_METHODS(cypher_integer_const),
|
DEFINE_NODE_METHODS(cypher_sub_pattern),
|
DEFINE_NODE_METHODS(cypher_call),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_create_target_nodes),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_create_path),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_target_node),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_update_information),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_update_item),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_delete_information),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_delete_item),
|
DEFINE_NODE_METHODS_EXTENDED(cypher_merge_information)
|
};
|
|
static bool equal_ag_node(const ExtensibleNode *a, const ExtensibleNode *b)
|
{
|
ereport(ERROR, (errmsg("unexpected equal() over ag_node's")));
|
}
|
|
void register_ag_nodes(void)
|
{
|
static bool initialized = false;
|
int i;
|
|
if (initialized)
|
return;
|
|
for (i = 0; i < lengthof(node_methods); i++)
|
RegisterExtensibleNodeMethods(&node_methods[i]);
|
|
initialized = true;
|
}
|
|
ExtensibleNode *_new_ag_node(Size size, ag_node_tag tag)
|
{
|
ExtensibleNode *n;
|
|
n = (ExtensibleNode *)palloc0fast(size);
|
n->type = T_ExtensibleNode;
|
n->extnodename = node_names[tag];
|
|
return n;
|
}
|