(
left: Optional[FromClause],
right: Optional[FromClause],
stop_on: Optional[FromClause] = None,
)
| 853 | |
| 854 | |
| 855 | def splice_joins( |
| 856 | left: Optional[FromClause], |
| 857 | right: Optional[FromClause], |
| 858 | stop_on: Optional[FromClause] = None, |
| 859 | ) -> Optional[FromClause]: |
| 860 | if left is None: |
| 861 | return right |
| 862 | |
| 863 | stack: List[Tuple[Optional[FromClause], Optional[Join]]] = [(right, None)] |
| 864 | |
| 865 | adapter = ClauseAdapter(left) |
| 866 | ret = None |
| 867 | while stack: |
| 868 | right, prevright = stack.pop() |
| 869 | if isinstance(right, Join) and right is not stop_on: |
| 870 | right = right._clone() |
| 871 | right.onclause = adapter.traverse(right.onclause) |
| 872 | stack.append((right.left, right)) |
| 873 | else: |
| 874 | right = adapter.traverse(right) |
| 875 | if prevright is not None: |
| 876 | assert right is not None |
| 877 | prevright.left = right |
| 878 | if ret is None: |
| 879 | ret = right |
| 880 | |
| 881 | return ret |
| 882 | |
| 883 | |
| 884 | @overload |
nothing calls this directly
no test coverage detected