@@ -301,6 +301,17 @@ static Node *make_edge_expr(cypher_parsestate *cpstate, ParseNamespaceItem *pnsi
301301 return (Node * )func_expr ;
302302}
303303
304+
305+ static Node *
306+ make_graphid_placeholder (cypher_parsestate * cpstate ) {
307+
308+ // typtypmod, typcollation, typlen, and typbyval of gtype are hard-coded.
309+ Const * c = makeConst (GRAPHIDOID , -1 , InvalidOid , -1 , 0 , false, false);
310+ c -> location = -1 ;
311+
312+ return (Node * )c ;
313+ }
314+
304315static Node *
305316make_int_placeholder (cypher_parsestate * cpstate ) {
306317
@@ -400,6 +411,7 @@ static void validate_or_create_vlabel(cypher_parsestate *cpstate, cypher_node *n
400411 }
401412}
402413
414+
403415static Query * transform_cypher_create (cypher_parsestate * cpstate , cypher_clause * clause ) {
404416 ParseState * pstate = (ParseState * )cpstate ;
405417 cypher_create * self = (cypher_create * )clause -> self ;
@@ -439,53 +451,97 @@ static Query *transform_cypher_create(cypher_parsestate *cpstate, cypher_clause
439451 if (i % 2 == 1 ) {
440452 cypher_node * node = (cypher_node * )lfirst (lc2 );
441453
454+ cypher_target_node * target = make_ag_node (cypher_target_node );
455+
442456 if (node -> label )
443457 validate_or_create_vlabel (cpstate , node );
444458 else
445459 node -> label = AG_DEFAULT_LABEL_VERTEX ;
446460
447- if (node -> name )
448- ereport (ERROR , (errmsg_internal ("nodes in CREATE cannot have variable names" )));
449-
450- if (node -> props )
451- ereport (ERROR , (errmsg_internal ("nodes in CREATE cannot have properties" )));
452-
453- cypher_target_node * target = make_ag_node (cypher_target_node );
461+ if (node -> name ) {
462+ ereport (ERROR , (errmsg_internal ("nodes in CREATE cannot be a variable" )));
463+ /* TODO: After props are supported
464+ target->variable_name = node->name;
465+
466+ query->targetList = lappend(query->targetList,
467+ makeTargetEntry(
468+ make_graphid_placeholder(cpstate),
469+ pstate->p_next_resno++,
470+ make_id_alias(get_next_default_alias(cpstate)),
471+ false));
472+ }
473+ target->id_attr_num = list_length(query->targetList);
474+
475+ query->targetList = lappend(query->targetList,
476+ makeTargetEntry(
477+ make_int_placeholder(cpstate),
478+ pstate->p_next_resno++,
479+ make_id_alias(get_next_default_alias(cpstate)),
480+ false));
481+ }
482+
483+ target->props_attr_num = list_length(query->targetList);
484+ */
485+ } else
486+ node -> name = get_next_default_alias (cpstate );
487+
488+ if (node -> props ) {
489+ target -> prop_attr_num = pstate -> p_next_resno ;
490+ query -> targetList = lappend (query -> targetList ,
491+ makeTargetEntry (
492+ (Expr * )add_volatile_wrapper (
493+ transform_cypher_expr (cpstate , node -> props , EXPR_KIND_INSERT_TARGET )),
494+ pstate -> p_next_resno ++ ,
495+ make_property_alias (node -> name ),
496+ false));
497+
498+ } else {
499+ target -> prop_attr_num = InvalidAttrNumber ;
500+ }
501+
454502
455503 label_cache_data * lcd = search_label_name_graph_cache (node -> label , cpstate -> graph_oid );
456504
457505 target -> id_expr = (Expr * )build_column_default (RelationIdGetRelation (lcd -> relation ), 1 );
458506 target -> relid = lcd -> relation ;
459507 target -> adj_relid = lcd -> vertex_adjlist ;
460508
461- TargetEntry * te = makeTargetEntry (make_int_placeholder (cpstate ), pstate -> p_next_resno ++ , make_id_alias (get_next_default_alias (cpstate )), false);
462-
463509 ccp -> target_nodes = lappend (ccp -> target_nodes , target );
464510
465- query -> targetList = lappend (query -> targetList , te );
466511 } else {
467512 cypher_relationship * edge = lfirst (lc2 );
468-
513+ cypher_target_node * target = make_ag_node ( cypher_target_node );
469514 if (edge -> label )
470515 validate_or_create_elabel (cpstate , edge );
471516 else
472517 edge -> label = AG_DEFAULT_LABEL_EDGE ;
473518
474519 if (edge -> name )
475520 ereport (ERROR , (errmsg_internal ("edges in CREATE cannot have variable names" )));
476-
477- if (edge -> props )
478- ereport (ERROR , (errmsg_internal ("edges in CREATE cannot have properties" )));
479-
521+ else
522+ edge -> name = get_next_default_alias (cpstate );
523+
524+ if (edge -> props ) {
525+ target -> prop_attr_num = pstate -> p_next_resno ;
526+ query -> targetList = lappend (query -> targetList ,
527+ makeTargetEntry (
528+ (Expr * )add_volatile_wrapper (
529+ transform_cypher_expr (cpstate , edge -> props , EXPR_KIND_INSERT_TARGET )),
530+ pstate -> p_next_resno ++ ,
531+ make_property_alias (edge -> name ),
532+ false));
533+ } else {
534+ target -> prop_attr_num = InvalidAttrNumber ;
535+ }
480536 if (edge -> dir != CYPHER_REL_DIR_RIGHT )
481537 ereport (ERROR , (errmsg_internal ("edges CREATE are right only right now" )));
482538
483- cypher_target_node * target = make_ag_node ( cypher_target_node );
539+
484540 label_cache_data * lcd = search_label_name_graph_cache (edge -> label , cpstate -> graph_oid );
485541 target -> relid = lcd -> relation ;
486542
487543 target -> id_expr = (Expr * )build_column_default (RelationIdGetRelation (lcd -> relation ), 1 );
488-
544+ //target->prop_attr_num = InvalidAttrNumber;
489545 ccp -> target_nodes = lappend (ccp -> target_nodes , target );
490546
491547 }
0 commit comments