MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / par_returning_values

Function par_returning_values

src/gpre/par.cpp:2705–2771  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2703//
2704
2705static act* par_returning_values()
2706{
2707 if (!cur_store)
2708 PAR_error("STORE must precede RETURNING_VALUES");
2709
2710 act* begin_action = (act*) MSC_pop(&cur_store);
2711 gpre_req* request = begin_action->act_request;
2712
2713 // First take care of the impending store:
2714 // Make up an assignment list for all field references and
2715 // clone the references while we are at it
2716
2717 int count = 0;
2718 for (ref* reference = request->req_references; reference; reference = reference->ref_next)
2719 {
2720 if (!reference->ref_master)
2721 count++;
2722 }
2723
2724 gpre_nod* assignments = MSC_node(nod_list, (SSHORT) count);
2725 request->req_node =
2726 MSC_ternary(nod_store, (gpre_nod*) request->req_contexts, assignments, NULL);
2727 count = 0;
2728
2729 for (ref* reference = request->req_references; reference; reference = reference->ref_next)
2730 {
2731 ref* save_ref = MSC_reference(&begin_action->act_object);
2732 save_ref->ref_context = reference->ref_context;
2733 save_ref->ref_field = reference->ref_field;
2734 save_ref->ref_source = reference;
2735 save_ref->ref_flags = reference->ref_flags;
2736
2737 if (reference->ref_master)
2738 continue;
2739 gpre_nod* item = MSC_node(nod_assignment, 2);
2740 item->nod_arg[0] = MSC_unary(nod_value, (gpre_nod*) save_ref);
2741 item->nod_arg[1] = MSC_unary(nod_field, (gpre_nod*) save_ref);
2742 assignments->nod_arg[count++] = item;
2743 }
2744
2745 // Next make an updated context for post_store actions
2746
2747 upd* new_values = (upd*) MSC_alloc(UPD_LEN);
2748 gpre_ctx* source = request->req_contexts;
2749 request->req_type = REQ_store2;
2750
2751 gpre_ctx* new_ctx = MSC_context(request);
2752 new_ctx->ctx_symbol = source->ctx_symbol;
2753 new_ctx->ctx_relation = source->ctx_relation;
2754 new_ctx->ctx_symbol->sym_object = new_ctx; // pointing to itself?
2755
2756 // make an update block to hold everything known about referenced fields
2757
2758 act* action = MSC_action(request, ACT_store2);
2759 action->act_object = (ref*) new_values;
2760
2761 new_values->upd_request = request;
2762 new_values->upd_source = source;

Callers 1

PAR_actionFunction · 0.85

Calls 10

MSC_popFunction · 0.85
MSC_nodeFunction · 0.85
MSC_ternaryFunction · 0.85
MSC_referenceFunction · 0.85
MSC_unaryFunction · 0.85
MSC_allocFunction · 0.85
MSC_contextFunction · 0.85
MSC_actionFunction · 0.85
MSC_pushFunction · 0.85
PAR_errorFunction · 0.70

Tested by

no test coverage detected