| 76 | Datum svec_concat(PG_FUNCTION_ARGS); |
| 77 | PG_FUNCTION_INFO_V1( svec_concat ); |
| 78 | Datum |
| 79 | svec_concat(PG_FUNCTION_ARGS) |
| 80 | { |
| 81 | if (PG_ARGISNULL(0) && (!PG_ARGISNULL(1))) |
| 82 | { |
| 83 | PG_RETURN_SVECTYPE_P(PG_GETARG_SVECTYPE_P(1)); |
| 84 | } else if (PG_ARGISNULL(0) && PG_ARGISNULL(1)) |
| 85 | { |
| 86 | PG_RETURN_NULL(); |
| 87 | } else if (PG_ARGISNULL(1)) |
| 88 | { |
| 89 | PG_RETURN_SVECTYPE_P(PG_GETARG_SVECTYPE_P(0)); |
| 90 | } else |
| 91 | { |
| 92 | |
| 93 | SvecType *svec1 = PG_GETARG_SVECTYPE_P(0); |
| 94 | SvecType *svec2 = PG_GETARG_SVECTYPE_P(1); |
| 95 | SparseData left = sdata_from_svec(svec1); |
| 96 | SparseData right = sdata_from_svec(svec2); |
| 97 | SparseData sdata = makeEmptySparseData(); |
| 98 | char *vals,*index; |
| 99 | int l_val_len = left->vals->len; |
| 100 | int r_val_len = right->vals->len; |
| 101 | int l_ind_len = left->index->len; |
| 102 | int r_ind_len = right->index->len; |
| 103 | int val_len=l_val_len+r_val_len; |
| 104 | int ind_len=l_ind_len+r_ind_len; |
| 105 | |
| 106 | vals = (char *)palloc(sizeof(char)*val_len); |
| 107 | index = (char *)palloc(sizeof(char)*ind_len); |
| 108 | |
| 109 | memcpy(vals ,left->vals->data,l_val_len); |
| 110 | memcpy(vals+l_val_len,right->vals->data,r_val_len); |
| 111 | memcpy(index, left->index->data,l_ind_len); |
| 112 | memcpy(index+l_ind_len,right->index->data,r_ind_len); |
| 113 | |
| 114 | sdata->vals = makeStringInfoFromData(vals,val_len); |
| 115 | sdata->index = makeStringInfoFromData(index,ind_len); |
| 116 | sdata->type_of_data = left->type_of_data; |
| 117 | sdata->unique_value_count = left->unique_value_count+ |
| 118 | right->unique_value_count; |
| 119 | sdata->total_value_count = left->total_value_count+ |
| 120 | right->total_value_count; |
| 121 | |
| 122 | PG_RETURN_SVECTYPE_P(svec_from_sparsedata(sdata,true)); |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | |
| 127 | Datum svec_eq(PG_FUNCTION_ARGS); |
nothing calls this directly
no test coverage detected