| 336 | |
| 337 | |
| 338 | bool |
| 339 | InMatchIsEquvalentTo(ScalarArrayOpExpr *opExpr, const bson_value_t *arrayValue) |
| 340 | { |
| 341 | if (opExpr == NULL || arrayValue->value_type != BSON_TYPE_ARRAY) |
| 342 | { |
| 343 | return false; |
| 344 | } |
| 345 | |
| 346 | List *inMatchArgs = opExpr->args; |
| 347 | if (list_length(inMatchArgs) != 2) |
| 348 | { |
| 349 | return false; |
| 350 | } |
| 351 | |
| 352 | if (!IsA(lsecond(inMatchArgs), Const)) |
| 353 | { |
| 354 | return false; |
| 355 | } |
| 356 | |
| 357 | Const *secondMatch = (Const *) lsecond(inMatchArgs); |
| 358 | |
| 359 | bson_iter_t arrayValueIter; |
| 360 | BsonValueInitIterator(arrayValue, &arrayValueIter); |
| 361 | |
| 362 | ArrayType *inArrayValue = DatumGetArrayTypeP(secondMatch->constvalue); |
| 363 | |
| 364 | const int slice_ndim = 0; |
| 365 | ArrayMetaState *mState = NULL; |
| 366 | ArrayIterator inArrayIterator = array_create_iterator(inArrayValue, slice_ndim, |
| 367 | mState); |
| 368 | Datum arrayDatum = { 0 }; |
| 369 | bool isNull = false; |
| 370 | while (array_iterate(inArrayIterator, &arrayDatum, &isNull)) |
| 371 | { |
| 372 | if (!bson_iter_next(&arrayValueIter) || isNull) |
| 373 | { |
| 374 | array_free_iterator(inArrayIterator); |
| 375 | return false; |
| 376 | } |
| 377 | |
| 378 | const bson_value_t *rightValue = bson_iter_value(&arrayValueIter); |
| 379 | pgbsonelement leftElement = { 0 }; |
| 380 | pgbson *leftBson = DatumGetPgBsonPacked(arrayDatum); |
| 381 | PgbsonToSinglePgbsonElement(leftBson, &leftElement); |
| 382 | |
| 383 | if (!BsonValueEquals(&leftElement.bsonValue, rightValue)) |
| 384 | { |
| 385 | array_free_iterator(inArrayIterator); |
| 386 | return false; |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | array_free_iterator(inArrayIterator); |
| 391 | if (bson_iter_next(&arrayValueIter)) |
| 392 | { |
| 393 | return false; |
| 394 | } |
| 395 |
no test coverage detected