MCPcopy Create free account
hub / github.com/documentdb/documentdb / DivideBsonValueNumbers

Function DivideBsonValueNumbers

pg_documentdb_core/src/io/pgbson_utils.c:236–284  ·  view source on GitHub ↗

* Divides the number stored in dividend by divisor and modifies dividend. * returns true if division happened because of valid types */

Source from the content-addressed store, hash-verified

234 * returns true if division happened because of valid types
235 */
236bool
237DivideBsonValueNumbers(bson_value_t *dividend, const bson_value_t *divisor)
238{
239 if (!BsonValueIsNumberOrBool(dividend) || !BsonValueIsNumberOrBool(divisor))
240 {
241 return false;
242 }
243
244 if (dividend->value_type == BSON_TYPE_DECIMAL128 ||
245 divisor->value_type == BSON_TYPE_DECIMAL128)
246 {
247 bson_value_t dividend128 = *dividend;
248 bson_value_t divisor128 = *divisor;
249 if (divisor->value_type == BSON_TYPE_DECIMAL128)
250 {
251 dividend128.value_type = BSON_TYPE_DECIMAL128;
252 dividend128.value.v_decimal128 = GetBsonValueAsDecimal128Quantized(dividend);
253 }
254 else
255 {
256 divisor128.value_type = BSON_TYPE_DECIMAL128;
257 divisor128.value.v_decimal128 = GetBsonValueAsDecimal128Quantized(divisor);
258 }
259
260 if (IsDecimal128Zero(&divisor128))
261 {
262 ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE),
263 errmsg("$divide by zero is not allowed")));
264 }
265
266 dividend->value_type = BSON_TYPE_DECIMAL128;
267 DivideDecimal128Numbers(&dividend128, &divisor128, dividend);
268 }
269 else
270 {
271 double dividendDouble = BsonValueAsDouble(dividend);
272 double divisorDouble = BsonValueAsDouble(divisor);
273
274 if (divisorDouble == 0.0)
275 {
276 ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE),
277 errmsg("$divide by zero is not allowed")));
278 }
279
280 dividend->value_type = BSON_TYPE_DOUBLE;
281 dividend->value.v_double = dividendDouble / divisorDouble;
282 }
283 return true;
284}
285
286
287/*

Calls 5

BsonValueIsNumberOrBoolFunction · 0.85
IsDecimal128ZeroFunction · 0.85
DivideDecimal128NumbersFunction · 0.85
BsonValueAsDoubleFunction · 0.85

Tested by

no test coverage detected