* @param vals An array of data values * @param index An array of run-lengths * @param datasize The length of the vals array * @param indexsize The length of the index array * @param datatype The object ID of the elements represented in the vals array * @param unique_value_count The number of RLE blocks in the vals array * @param total_value_count The total number of individual elements repre
| 1185 | * @return A SparseData created in place using pointers to the vals and index data |
| 1186 | */ |
| 1187 | SparseData makeInplaceSparseData(char *vals, char *index, |
| 1188 | int datasize, int indexsize, Oid datatype, |
| 1189 | int unique_value_count, int total_value_count) { |
| 1190 | SparseData sdata = makeEmptySparseData(); |
| 1191 | sdata->unique_value_count = unique_value_count; |
| 1192 | sdata->total_value_count = total_value_count; |
| 1193 | |
| 1194 | /* |
| 1195 | * To be safe, we obey the constraint demanded in lib/stringinfo.h that |
| 1196 | * the data field of StringInfoData is always terminated with a null. |
| 1197 | */ |
| 1198 | if (vals != NULL && vals[datasize] != '\0') { |
| 1199 | char * vals_temp = (char *)palloc(datasize+1); |
| 1200 | memcpy(vals_temp, vals, datasize); |
| 1201 | vals_temp[datasize] = '\0'; |
| 1202 | vals = vals_temp; |
| 1203 | } |
| 1204 | |
| 1205 | if (index != NULL && index[indexsize] != '\0') { |
| 1206 | char * index_temp = (char *)palloc(indexsize+1); |
| 1207 | memcpy(index_temp, index, indexsize); |
| 1208 | index_temp[indexsize] = '\0'; |
| 1209 | index = index_temp; |
| 1210 | } |
| 1211 | |
| 1212 | sdata->vals->data = vals; |
| 1213 | sdata->vals->len = datasize; |
| 1214 | sdata->vals->maxlen = datasize+1; |
| 1215 | sdata->index->data = index; |
| 1216 | |
| 1217 | sdata->index->len = indexsize; |
| 1218 | sdata->index->maxlen = index == NULL ? 0 : indexsize+1; |
| 1219 | // here we are taking care of the special case of null index, which |
| 1220 | // represents uncompressed sparsedata; see SparseDataStruct defn |
| 1221 | sdata->type_of_data = datatype; |
| 1222 | |
| 1223 | return sdata; |
| 1224 | } |
| 1225 | |
| 1226 | /** |
| 1227 | * @return A copy of an existing SparseData. |
no test coverage detected