| 997 | // |
| 998 | |
| 999 | static void cmp_loop( gpre_req* request) |
| 1000 | { |
| 1001 | gpre_nod* req_node = request->req_node; |
| 1002 | gpre_rse* selection = request->req_rse; |
| 1003 | |
| 1004 | gpre_port* primary = request->req_primary; |
| 1005 | make_send(primary, request); |
| 1006 | request->add_byte(blr_begin); |
| 1007 | gpre_nod* counter = MSC_node(nod_value, 1); |
| 1008 | for (ref* reference = primary->por_references; reference; reference = reference->ref_next) |
| 1009 | { |
| 1010 | if (reference->ref_field == count_field) |
| 1011 | counter->nod_arg[0] = (gpre_nod*) reference; |
| 1012 | } |
| 1013 | |
| 1014 | request->add_byte(blr_assignment); |
| 1015 | CME_expr(lit0, request); |
| 1016 | CME_expr(counter, request); |
| 1017 | |
| 1018 | gpre_ctx* for_context = selection->rse_context[0]; |
| 1019 | gpre_ctx* update_context = request->req_update; |
| 1020 | |
| 1021 | request->add_byte(blr_for); |
| 1022 | CME_rse(selection, request); |
| 1023 | request->add_byte(blr_begin); |
| 1024 | |
| 1025 | const bool isReturning = request->req_flags & REQ_sql_returning; |
| 1026 | gpre_nod* node = (req_node->nod_type == nod_list) ? req_node->nod_arg[0] : req_node; |
| 1027 | |
| 1028 | switch (node->nod_type) |
| 1029 | { |
| 1030 | case nod_modify: |
| 1031 | { |
| 1032 | const int blr_op = isReturning ? blr_modify2 : blr_modify; |
| 1033 | request->add_byte(blr_op); |
| 1034 | request->add_byte(for_context->ctx_internal); |
| 1035 | request->add_byte(update_context->ctx_internal); |
| 1036 | cmp_assignment_list(node->nod_arg[0], request); |
| 1037 | if (isReturning) |
| 1038 | cmp_returning(request, node->nod_arg[1]); |
| 1039 | } |
| 1040 | break; |
| 1041 | case nod_store: |
| 1042 | cmp_store(request, node); |
| 1043 | break; |
| 1044 | case nod_erase: |
| 1045 | if (isReturning) |
| 1046 | { |
| 1047 | request->add_byte(blr_begin); |
| 1048 | cmp_returning(request, node->nod_arg[0]); |
| 1049 | request->add_byte(blr_erase); |
| 1050 | request->add_byte(for_context->ctx_internal); |
| 1051 | request->add_byte(blr_end); |
| 1052 | } |
| 1053 | else |
| 1054 | { |
| 1055 | request->add_byte(blr_erase); |
| 1056 | request->add_byte(for_context->ctx_internal); |
no test coverage detected