MAKE_field @brief Make up a field node. @param context @param field @param indices **/
| 375 | |
| 376 | **/ |
| 377 | FieldNode* MAKE_field(dsql_ctx* context, dsql_fld* field, ValueListNode* indices) |
| 378 | { |
| 379 | DEV_BLKCHK(context, dsql_type_ctx); |
| 380 | DEV_BLKCHK(field, dsql_type_fld); |
| 381 | |
| 382 | thread_db* const tdbb = JRD_get_thread_data(); |
| 383 | FieldNode* const node = FB_NEW_POOL(*tdbb->getDefaultPool()) FieldNode( |
| 384 | *tdbb->getDefaultPool(), context, field, indices); |
| 385 | |
| 386 | dsc desc; |
| 387 | |
| 388 | if (field->dimensions) |
| 389 | { |
| 390 | if (indices) |
| 391 | DsqlDescMaker::fromElement(&desc, field); |
| 392 | else |
| 393 | { |
| 394 | desc = node->getDsqlDesc(); |
| 395 | desc.dsc_dtype = dtype_array; |
| 396 | desc.dsc_length = sizeof(ISC_QUAD); |
| 397 | desc.dsc_scale = static_cast<SCHAR>(field->scale); |
| 398 | desc.dsc_sub_type = field->subType; |
| 399 | } |
| 400 | |
| 401 | node->setDsqlDesc(desc); |
| 402 | } |
| 403 | else |
| 404 | { |
| 405 | if (indices) |
| 406 | { |
| 407 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-607) << |
| 408 | Arg::Gds(isc_dsql_only_can_subscript_array) << Arg::Str(field->fld_name)); |
| 409 | } |
| 410 | |
| 411 | DsqlDescMaker::fromField(&desc, field); |
| 412 | node->setDsqlDesc(desc); |
| 413 | } |
| 414 | |
| 415 | if ((field->flags & FLD_nullable) || (context->ctx_flags & CTX_outer_join)) |
| 416 | { |
| 417 | desc = node->getDsqlDesc(); |
| 418 | desc.dsc_flags |= DSC_nullable; |
| 419 | node->setDsqlDesc(desc); |
| 420 | } |
| 421 | |
| 422 | return node; |
| 423 | } |
| 424 | |
| 425 | |
| 426 | /** |
no test coverage detected