Parse a BLR node.
| 1599 | |
| 1600 | // Parse a BLR node. |
| 1601 | DmlNode* PAR_parse_node(thread_db* tdbb, CompilerScratch* csb) |
| 1602 | { |
| 1603 | SET_TDBB(tdbb); |
| 1604 | |
| 1605 | const ULONG blrOffset = csb->csb_blr_reader.getOffset(); |
| 1606 | const SSHORT blrOperator = csb->csb_blr_reader.getByte(); |
| 1607 | |
| 1608 | if (blrOperator < 0 || blrOperator >= FB_NELEM(blr_parsers)) |
| 1609 | { |
| 1610 | // NS: This error string is correct, please do not mangle it again and again. |
| 1611 | // The whole error message is "BLR syntax error: expected %s at offset %d, encountered %d" |
| 1612 | PAR_syntax_error(csb, "valid BLR code"); |
| 1613 | } |
| 1614 | |
| 1615 | // Dispatch on operator type. |
| 1616 | |
| 1617 | switch (blrOperator) |
| 1618 | { |
| 1619 | case blr_rse: |
| 1620 | case blr_lateral_rse: |
| 1621 | case blr_rs_stream: |
| 1622 | case blr_singular: |
| 1623 | case blr_scrollable: |
| 1624 | csb->csb_blr_reader.seekBackward(1); |
| 1625 | return PAR_rse(tdbb, csb); |
| 1626 | |
| 1627 | case blr_pid: |
| 1628 | case blr_pid2: |
| 1629 | case blr_procedure: |
| 1630 | case blr_procedure2: |
| 1631 | case blr_procedure3: |
| 1632 | case blr_procedure4: |
| 1633 | case blr_subproc: |
| 1634 | case blr_relation: |
| 1635 | case blr_rid: |
| 1636 | case blr_relation2: |
| 1637 | case blr_rid2: |
| 1638 | case blr_local_table_id: |
| 1639 | case blr_union: |
| 1640 | case blr_recurse: |
| 1641 | case blr_window: |
| 1642 | case blr_aggregate: |
| 1643 | csb->csb_blr_reader.seekBackward(1); |
| 1644 | return PAR_parseRecordSource(tdbb, csb); |
| 1645 | } |
| 1646 | |
| 1647 | if (!blr_parsers[blrOperator]) |
| 1648 | PAR_syntax_error(csb, "valid BLR code"); |
| 1649 | |
| 1650 | DmlNode* node = blr_parsers[blrOperator](tdbb, *tdbb->getDefaultPool(), csb, blrOperator); |
| 1651 | setNodeLineColumn(csb, node, blrOffset); |
| 1652 | |
| 1653 | return node; |
| 1654 | } |
| 1655 | |
| 1656 | |
| 1657 | void PAR_syntax_error(CompilerScratch* csb, const TEXT* string) |
no test coverage detected