(
left: Optional[FromClause],
right: Optional[FromClause],
stop_on: Optional[FromClause] = None,
)
| 841 | |
| 842 | |
| 843 | def splice_joins( |
| 844 | left: Optional[FromClause], |
| 845 | right: Optional[FromClause], |
| 846 | stop_on: Optional[FromClause] = None, |
| 847 | ) -> Optional[FromClause]: |
| 848 | if left is None: |
| 849 | return right |
| 850 | |
| 851 | stack: List[Tuple[Optional[FromClause], Optional[Join]]] = [(right, None)] |
| 852 | |
| 853 | adapter = ClauseAdapter(left) |
| 854 | ret = None |
| 855 | while stack: |
| 856 | right, prevright = stack.pop() |
| 857 | if isinstance(right, Join) and right is not stop_on: |
| 858 | right = right._clone() |
| 859 | right.onclause = adapter.traverse(right.onclause) |
| 860 | stack.append((right.left, right)) |
| 861 | else: |
| 862 | right = adapter.traverse(right) |
| 863 | if prevright is not None: |
| 864 | assert right is not None |
| 865 | prevright.left = right |
| 866 | if ret is None: |
| 867 | ret = right |
| 868 | |
| 869 | return ret |
| 870 | |
| 871 | |
| 872 | @overload |
nothing calls this directly
no test coverage detected