| 1399 | // |
| 1400 | |
| 1401 | static gpre_fld* get_ref( gpre_nod* expr) |
| 1402 | { |
| 1403 | gpre_fld* field; |
| 1404 | |
| 1405 | assert_IS_NOD(expr); |
| 1406 | |
| 1407 | if (expr->nod_type == nod_via || expr->nod_type == nod_cast) |
| 1408 | { |
| 1409 | field = (gpre_fld*) MSC_alloc(FLD_LEN); |
| 1410 | CME_get_dtype(expr, field); |
| 1411 | if (field->fld_dtype && (field->fld_dtype <= dtype_any_text)) |
| 1412 | field->fld_flags |= FLD_text; |
| 1413 | return field; |
| 1414 | } |
| 1415 | |
| 1416 | ref* reference; |
| 1417 | |
| 1418 | switch (expr->nod_type) |
| 1419 | { |
| 1420 | case nod_field: |
| 1421 | reference = (ref*) expr->nod_arg[0]; |
| 1422 | return reference->ref_field; |
| 1423 | |
| 1424 | |
| 1425 | case nod_array: |
| 1426 | reference = (ref*) expr->nod_arg[0]; |
| 1427 | return reference->ref_field->fld_array; |
| 1428 | |
| 1429 | case nod_agg_count: |
| 1430 | case nod_agg_max: |
| 1431 | case nod_agg_min: |
| 1432 | case nod_agg_total: |
| 1433 | case nod_agg_average: |
| 1434 | case nod_plus: |
| 1435 | case nod_minus: |
| 1436 | case nod_times: |
| 1437 | case nod_divide: |
| 1438 | case nod_negate: |
| 1439 | case nod_upcase: |
| 1440 | case nod_lowcase: |
| 1441 | case nod_concatenate: |
| 1442 | { |
| 1443 | gpre_nod** ptr = expr->nod_arg; |
| 1444 | for (const gpre_nod* const* const end = ptr + expr->nod_count; ptr < end; ptr++) |
| 1445 | { |
| 1446 | if (field = get_ref(*ptr)) |
| 1447 | return field; |
| 1448 | } |
| 1449 | break; |
| 1450 | } |
| 1451 | |
| 1452 | // Begin date/time/timestamp support |
| 1453 | case nod_extract: |
| 1454 | if (field = get_ref(expr->nod_arg[1])) |
| 1455 | return field; |
| 1456 | break; |
| 1457 | // End date/time/timestamp support |
| 1458 | case nod_map_ref: |
no test coverage detected