(self, query, pretty=False)
| 782 | DIALECT = 'MYSQL' |
| 783 | |
| 784 | def write_query(self, query, pretty=False): |
| 785 | # MySQL doesn't support WITH clauses so they need to be converted into inline views. |
| 786 | # We are going to cheat by making use of the fact that the query generator creates |
| 787 | # with clause entries with unique aliases even considering nested queries. |
| 788 | sql = list() |
| 789 | for clause in ( |
| 790 | query.select_clause, |
| 791 | query.from_clause, |
| 792 | query.where_clause, |
| 793 | query.group_by_clause, |
| 794 | query.having_clause, |
| 795 | query.union_clause, |
| 796 | query.order_by_clause, |
| 797 | query.limit_clause |
| 798 | ): |
| 799 | if clause: |
| 800 | sql.append(self._write(clause)) |
| 801 | sql = '\n'.join(sql) |
| 802 | if query.with_clause: |
| 803 | # Just replace the named referenes with inline views. Go in reverse order because |
| 804 | # entries at the bottom of the WITH clause definition may reference entries above. |
| 805 | for with_clause_inline_view in reversed(query.with_clause.with_clause_inline_views): |
| 806 | replacement_sql = '(' + self.write_query(with_clause_inline_view.query) + ')' |
| 807 | sql = sql.replace(with_clause_inline_view.identifier, replacement_sql) |
| 808 | if pretty: |
| 809 | sql = self.make_pretty_sql(sql) |
| 810 | return sql |
| 811 | |
| 812 | def _write_data_type_metaclass(self, data_type_class): |
| 813 | '''Write a data type class such as Int or Boolean.''' |
nothing calls this directly
no test coverage detected