details:   https://code.tryton.org/python-sql/commit/d822cae093a1
branch:    default
user:      Cédric Krier <[email protected]>
date:      Tue Nov 25 10:23:15 2025 +0100
description:
        Use the ordinal number as aliases for GROUP BY

        Closes #96
diffstat:

 CHANGELOG                |   1 +
 sql/__init__.py          |  12 ++++++++++--
 sql/tests/test_select.py |   2 +-
 3 files changed, 12 insertions(+), 3 deletions(-)

diffs (61 lines):

diff -r a59c35753ba7 -r d822cae093a1 CHANGELOG
--- a/CHANGELOG Mon Nov 24 22:19:12 2025 +0100
+++ b/CHANGELOG Tue Nov 25 10:23:15 2025 +0100
@@ -1,3 +1,4 @@
+* Use the ordinal number as aliases for GROUP BY
 * Check the coherence of the aliases of GROUP BY and ORDER BY expressions
 * Do not use parameter for EXTRACT field
 * Remove support for Python older than 3.6
diff -r a59c35753ba7 -r d822cae093a1 sql/__init__.py
--- a/sql/__init__.py   Mon Nov 24 22:19:12 2025 +0100
+++ b/sql/__init__.py   Tue Nov 25 10:23:15 2025 +0100
@@ -629,12 +629,13 @@
                 and (self.limit is not None or self.offset is not None)):
             return self._rownum(str)
 
+        ordinals = {}
         for expression in chain(
                 self.group_by or [],
                 self.order_by or []):
             if not isinstance(expression, As):
                 continue
-            for column in self.columns:
+            for i, column in enumerate(self.columns, start=1):
                 if not isinstance(column, As):
                     continue
                 if column.output_name != expression.output_name:
@@ -642,6 +643,12 @@
                 if (str(column.expression) != str(expression.expression)
                         or column.params != expression.params):
                     raise ValueError("%r != %r" % (expression, column))
+                ordinals[column.output_name] = i
+
+        def str_or_ordinal(expression):
+            if isinstance(expression, As):
+                expression = ordinals.get(expression.output_name, expression)
+            return str(expression)
 
         with AliasManager():
             if self.from_ is not None:
@@ -671,7 +678,8 @@
                 where = ' WHERE ' + str(self.where)
             group_by = ''
             if self.group_by:
-                group_by = ' GROUP BY ' + ', '.join(map(str, self.group_by))
+                group_by = ' GROUP BY ' + ', '.join(
+                    map(str_or_ordinal, self.group_by))
             having = ''
             if self.having:
                 having = ' HAVING ' + str(self.having)
diff -r a59c35753ba7 -r d822cae093a1 sql/tests/test_select.py
--- a/sql/tests/test_select.py  Mon Nov 24 22:19:12 2025 +0100
+++ b/sql/tests/test_select.py  Tue Nov 25 10:23:15 2025 +0100
@@ -197,7 +197,7 @@
         output = column.as_('c1')
         query = self.table.select(output, group_by=output)
         self.assertEqual(str(query),
-            'SELECT "a"."c" AS "c1" FROM "t" AS "a" GROUP BY "c1"')
+            'SELECT "a"."c" AS "c1" FROM "t" AS "a" GROUP BY 1')
         self.assertEqual(tuple(query.params), ())
 
         query = self.table.select(Literal('foo'), group_by=Literal('foo'))

Reply via email to