| 1716 | ) |
| 1717 | |
| 1718 | def _process_positional(self): |
| 1719 | assert not self.positiontup |
| 1720 | assert self.state is CompilerState.STRING_APPLIED |
| 1721 | assert not self._numeric_binds |
| 1722 | |
| 1723 | if self.dialect.paramstyle == "format": |
| 1724 | placeholder = "%s" |
| 1725 | else: |
| 1726 | assert self.dialect.paramstyle == "qmark" |
| 1727 | placeholder = "?" |
| 1728 | |
| 1729 | positions = [] |
| 1730 | |
| 1731 | def find_position(m: re.Match[str]) -> str: |
| 1732 | normal_bind = m.group(1) |
| 1733 | if normal_bind: |
| 1734 | positions.append(normal_bind) |
| 1735 | return placeholder |
| 1736 | else: |
| 1737 | # this a post-compile bind |
| 1738 | positions.append(m.group(2)) |
| 1739 | return m.group(0) |
| 1740 | |
| 1741 | self.string = re.sub( |
| 1742 | self._positional_pattern, find_position, self.string |
| 1743 | ) |
| 1744 | |
| 1745 | if self.escaped_bind_names: |
| 1746 | reverse_escape = {v: k for k, v in self.escaped_bind_names.items()} |
| 1747 | assert len(self.escaped_bind_names) == len(reverse_escape) |
| 1748 | self.positiontup = [ |
| 1749 | reverse_escape.get(name, name) for name in positions |
| 1750 | ] |
| 1751 | else: |
| 1752 | self.positiontup = positions |
| 1753 | |
| 1754 | if self._insertmanyvalues: |
| 1755 | positions = [] |
| 1756 | |
| 1757 | single_values_expr = re.sub( |
| 1758 | self._positional_pattern, |
| 1759 | find_position, |
| 1760 | self._insertmanyvalues.single_values_expr, |
| 1761 | ) |
| 1762 | insert_crud_params = [ |
| 1763 | ( |
| 1764 | v[0], |
| 1765 | v[1], |
| 1766 | re.sub(self._positional_pattern, find_position, v[2]), |
| 1767 | v[3], |
| 1768 | ) |
| 1769 | for v in self._insertmanyvalues.insert_crud_params |
| 1770 | ] |
| 1771 | |
| 1772 | self._insertmanyvalues = self._insertmanyvalues._replace( |
| 1773 | single_values_expr=single_values_expr, |
| 1774 | insert_crud_params=insert_crud_params, |
| 1775 | ) |